Net-Hadoop-YARN
view release on metacpan or search on metacpan
lib/Net/Hadoop/YARN/NameNode/JMX.pm view on Meta::CPAN
package Net::Hadoop::YARN::NameNode::JMX;
$Net::Hadoop::YARN::NameNode::JMX::VERSION = '0.203';
use 5.10.0;
use strict;
use warnings;
use Ref::Util qw( is_arrayref );
use Moo;
my $RE_TIMEOUT = qr{ \Q500 read timeout\E }xms;
my $RE_DEAD = qr{ \Q500 Can't connect to\E .+? \QConnection refused\E }xms;
has namenodes => (
is => 'rw',
default => sub {
die "namenodes not specified";
},
isa => sub {
if ( ! is_arrayref $_[0] ) {
die "namenodes needs to be an ARRAY";
}
if ( ! @{ $_[0] } ) {
die "namenodes needs at least one element";
}
},
);
sub active_namenode {
my $self = shift;
my $opt = ref $_[0] eq 'HASH' ? shift @_ : {};
my($rv, $try);
NN_TRY: {
NN_PROBE: foreach my $nn ( @{ $self->namenodes } ) {
my $uri = sprintf 'http://%s/jmx?qry=Hadoop:service=NameNode,name=FSNamesystem', $nn;
my $jmx;
eval {
$jmx = $self->agent_request( $uri );
1;
} or do {
my $eval_error = $@ || 'Zombie error';
if (
$eval_error =~ $RE_TIMEOUT
|| $eval_error =~ $RE_DEAD
) {
next NN_PROBE;
}
die sprintf 'Error while probing the name node `%s`: %s',
( split m{ [:] }xms, $nn, 2 )[0],
$eval_error,
;
};
next NN_PROBE if ref $jmx ne 'HASH';
my $status = $jmx->{beans}[0]{'tag.HAState'};
next NN_PROBE if ! $status || $status ne 'active';
if ( $opt->{real_hostname} ) {
$rv = $jmx->{beans}[0]{'tag.Hostname'} || die "Unable to locate tag.Hostname from JMX";
if ( ! $opt->{hostname_only} ) {
$rv .= ':' . (split m{ [:] }xms, $nn )[1]
}
}
else {
$rv = $nn;
}
last NN_PROBE;
( run in 3.043 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )