
# Hadoop HDFS DataNode Check

Check the DataNode by uploading a file using the HDFS client and the HTTP REST
interface.

Run the command `./bin/ryba check -m @rybajs/metal/hadoop/hdfs_dn` to check all the
DataNodes.


    module.exports = header: 'HDFS DN Check', handler: ({options}) ->

## Wait for all datanode TCP Ports

Port is defined in the "dfs.datanode.address" property of hdfs-site. The default
value is 50020.

      @connection.assert
        header: 'TCP'
        servers: options.wait.tcp_local
        retry: 10
        sleep: 5000

## Wait for all datanode IPC Ports

Port is defined in the "dfs.datanode.ipc.address" property of hdfs-site. The
default value is 50020. IPC, for InterProcess Communication, is a fast and easy 
RPC mechanism. It is used as the internal procedure call mechanism for all 
Hadoop and Nutch.

      @connection.assert
        header: 'IPC'
        servers: options.wait.ipc_local
        retry: 10
        sleep: 5000

## Wait for all datanode HTTP Ports

Port is defined in the "dfs.datanode.{http|https}.address" property of hdfs-site. The default
value is 9865.

      @connection.assert
        header: 'HTTP'
        servers: options.wait.http_local
        retry: 3
        sleep: 3000

## Check Disk Capacity

      protocol = if options.hdfs_site['dfs.http.policy'] is 'HTTP_ONLY' then 'http' else 'https'
      port = options.hdfs_site["dfs.datanode.#{protocol}.address"].split(':')[1]
      @system.execute
        header: 'SPNEGO'
        retry: 3
        cmd: mkcmd.hdfs options.hdfs_krb5_user, "curl --negotiate -k -u : #{protocol}://#{options.fqdn}:#{port}/jmx?qry=Hadoop:service=DataNode,name=DataNodeInfo"
      , (err, obj) ->
        throw err if err
        throw Error "Invalid Response" unless JSON.parse(obj.stdout)?.beans[0]?.name is 'Hadoop:service=DataNode,name=DataNodeInfo'
      # @system.execute
      #   cmd: mkcmd.hdfs options.hdfs_krb5_user, "curl --negotiate -k -u : #{protocol}://#{options.fqdn}:#{port}/jmx?qry=Hadoop:service=DataNode,name=FSDatasetState-*"
      # , (err, executed, stdout) ->
      #   throw err if err
      #   data = JSON.parse stdout
      #   throw Error "Invalid Response" unless /^Hadoop:service=DataNode,name=FSDatasetState-.*/.test data?.beans[0]?.name
      #   remaining = data.beans[0].Remaining
      #   total = data.beans[0].Capacity
      #   @log "Disk remaining: #{Math.round remaining}"
      #   @log "Disk total: #{Math.round total}"
      #   percent = (total - remaining)/total * 100;
      #   @log "WARNING: #{Math.round percent}" if percent > 90
      #  .next next

      @system.execute
        header: 'Native'
        trap: true
        cmd: """
        nativelist=`hadoop checknative`
        echo $nativelist | egrep 'hadoop:\\s+true'
        echo $nativelist | egrep 'zlib:\\s+true'
        echo $nativelist | egrep 'snappy:\\s+true'
        echo $nativelist | egrep 'lz4:\\s+true'
        echo $nativelist | egrep 'bzip2:\\s+true'
        echo $nativelist | egrep 'openssl:\\s+true'
        """

## Dependencies

    mkcmd = require '../../lib/mkcmd'
