Hadoop-Inline-ClassLoader
view release on metacpan or search on metacpan
lib/Hadoop/Inline/ClassLoader.pm view on Meta::CPAN
# In short; CLASSPATH is not identical to PERL5LIB and this manual work is
# needed. It is possible that we may hit some shell limitation on this
# variable if too many things are pushed above.
#
@paths = map { glob $_ } @paths;
if ( DEBUG ) {
print STDERR 'CLASSPATH(after expansion):\n';
print STDERR "\t$_\n" for @paths;
}
state $re_path_sep = RE_PATH_SEP_CHAR;
my %n = do {
my $native = _capture( $cmd => 'checknative' );
my @n = split RE_MULTI_LF, $native;
shift @n;
map {
my @k = split RE_WS, $_, 3; ## no critic (ValuesAndExpressions::ProhibitMagicNumbers)
$k[0] =~ s{ $re_path_sep \z }{}xms;
$k[0] => {
status => $k[1],
value => $k[2],
};
} @n;
};
my $hadoop = $n{hadoop} || croak 'Failed to collect the hadoop native binary path';
my $native = dirname $hadoop->{value};
my $hopts = '-Djava.library.path=' . dirname $native;
my %henv;
$henv{CLASSPATH} = join CHAR_COLON, @paths;
$henv{HADOOP_COMMON_LIB_NATIVE_DIR} = $native;
$henv{HADOOP_OPTS} = $ENV{HADOOP_OPTS}
? $ENV{HADOOP_OPTS} . EMPTY_STRING . $hopts
: $hopts
;
# if LD_LIBRARY_PATH is not set:
#
# util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
for my $path (qw/
JAVA_LIBRARY_PATH
LD_LIBRARY_PATH
/) {
$henv{ $path } = $ENV{ $path } ? $ENV{ $path } . CHAR_COLON . $native : $native;
}
return \%henv, \@paths;
}
sub _map_java_imports_to_short_names {
my $class = shift;
# Give somewhat meaningful names to the imported Java classes
state $package_delimiter = PACKAGE_DELIMITER;
my $base_ns = 'org::apache::hadoop::';
my $filter = do {
my @rv = split m{ $package_delimiter }xms, $base_ns;
pop @rv;
join PACKAGE_DELIMITER, @rv;
};
my @ns = $class->_namespace_probe( $base_ns );
shift @ns;
@ns = grep { m{ $package_delimiter \z }xms } @ns;
no strict qw( refs );
foreach my $class ( @ns ) {
(my $short_name = $class) =~ s{
\Q$filter\E
$package_delimiter
}{}xms;
$short_name = join PACKAGE_DELIMITER,
map { ucfirst $_ } split m{ $package_delimiter }xms,
$short_name
;
# import() was called multiple times?
next if %{ $short_name . PACKAGE_DELIMITER };
printf STDERR 'Mapping %s => %s', $short_name, $class if DEBUG;
*{ $short_name . PACKAGE_DELIMITER } = \*{ $class };
}
return;
}
sub _namespace_probe {
my $class = shift;
my $sym = shift;
my @names;
no strict qw( refs );
foreach my $type (
grep {
m{ \A [a-z] }xmsi
}
keys %{ $sym }
) {
push @names, $class->_namespace_probe( $sym . $type );
}
return $sym, @names;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Hadoop::Inline::ClassLoader
=head1 VERSION
version 0.002
=head1 SYNOPSIS
use Hadoop::Inline::ClassLoader qw( org.apache.hadoop.conf.Configuration );
use Hadoop::Inline::ClassLoader \%options, @java_classes;
=head1 DESCRIPTION
Hadoop Java class loader through Inline::Java. This module tries to setup the
environment needed for the Hadoop classes and also has auto-study feature and
short name aliasing for Perl packages' name mappings.
=head1 NAME
( run in 1.346 second using v1.01-cache-2.11-cpan-71847e10f99 )