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 )