Menu

Hive Client Check

This module check the HCatalog server using the hive command.

Debug mode in the "hive" command is activated with the "hive.root.logger" parameter:

hive -hiveconf hive.root.logger=DEBUG,console
module.exports =  header: 'Hive Client Check', handler: ({options}) ->

Wait

  @call 'ryba/hive/hcatalog/wait', once: true, options.wait_hive_hcatalog
  @call 'ryba/ranger/admin/wait', once: true, options.wait_ranger_admin if options.wait_ranger_admin

Add Ranger Policy

hive client is communicating directly with hcatalog, which means that on a ranger managed cluster, ACL must be set on HDFS an not on hive.

  @call
    header: 'HDFS Policy'
    if: !!options.ranger_admin
  , ->
    name = "Ranger-Ryba-HDFS-Policy-#{options.fqdn}-client"
    dbs = []
    directories = []
    for hive_hcatalog in options.hive_hcatalog
      directories.push "check-#{options.hostname}-hive_hcatalog_mr-#{hive_hcatalog.hostname}"
      directories.push "check-#{options.hostname}-hive_hcatalog_tez-#{hive_hcatalog.hostname}"
    hdfs_policy =
      name: "#{name}"
      service: "#{options.ranger_hdfs_install['REPOSITORY_NAME']}"
      repositoryType:"hdfs"
      description: 'Hive Client Check'
      isEnabled: true
      isAuditEnabled: true
      resources:
        path:
          isRecursive: 'true'
          values: directories
          isExcludes: false
      policyItems: [{
        users: ["#{options.test.user.name}"]
        groups: []
        delegateAdmin: true
        accesses:[
            "isAllowed": true
            "type": "read"
        ,
            "isAllowed": true
            "type": "write"
        ,
            "isAllowed": true
            "type": "execute"
        ]
        conditions: []
        }]
    @system.execute
      cmd: """
      curl --fail -H "Content-Type: application/json" -k -X POST \
        -d '#{JSON.stringify hdfs_policy}' \
        -u #{options.ranger_admin.username}:#{options.ranger_admin.password} \
        \"#{options.ranger_hdfs_install['POLICY_MGR_URL']}/service/public/v2/api/policy\"
      """
      unless_exec: """
      curl --fail -H \"Content-Type: application/json\" -k -X GET  \
        -u #{options.ranger_admin.username}:#{options.ranger_admin.password} \
        \"#{options.ranger_hdfs_install['POLICY_MGR_URL']}/service/public/v2/api/service/#{options.ranger_hdfs_install['REPOSITORY_NAME']}/policy/#{hdfs_policy.name}"
      """
      code_skippe: 22

Check HCatalog MapReduce

Use the Hive CLI client to execute SQL queries using the MapReduce engine.

  @call header: 'Check HCatalog MapReduce', ->
    for hive_hcatalog in options.hive_hcatalog
      directory = "check-#{options.hostname}-hive_hcatalog_mr-#{hive_hcatalog.hostname}"
      db = "check_#{options.hostname}_hive_hcatalog_mr_#{hive_hcatalog.hostname}"
      @system.execute
        cmd: mkcmd.test options.test_krb5_user, """
        hdfs dfs -rm -r -skipTrash #{directory} || true
        hdfs dfs -mkdir -p #{directory}/my_db/my_table
        echo -e 'a,1\\nb,2\\nc,3' | hdfs dfs -put - #{directory}/my_db/my_table/data
        hive -e "
          SET hive.execution.engine=mr;
          DROP TABLE IF EXISTS #{db}.my_table; DROP DATABASE IF EXISTS #{db};
          CREATE DATABASE #{db} LOCATION '/user/#{options.test.user.name}/#{directory}/my_db/';
          USE #{db};
          CREATE TABLE my_table(col1 STRING, col2 INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
        "
        hive -S -e "SET hive.execution.engine=mr; SELECT SUM(col2) FROM #{db}.my_table;" | hdfs dfs -put - #{directory}/result
        hive -e "DROP TABLE #{db}.my_table; DROP DATABASE #{db};"
        """
        unless_exec: unless options.force_check then mkcmd.test options.test_krb5_user, "hdfs dfs -test -f #{directory}/result"
        trap: true

Check HCatalog Tez

Use the Hive CLI client to execute SQL queries using the Tez engine.

  @call header: 'Check HCatalog Tez', ->
    for hive_hcatalog in options.hive_hcatalog
      directory = "check-#{options.hostname}-hive_hcatalog_tez-#{hive_hcatalog.hostname}"
      db = "check_#{options.hostname}_hive_hcatalog_tez_#{hive_hcatalog.hostname}"
      @system.execute
        cmd: mkcmd.test options.test_krb5_user, """
        hdfs dfs -rm -r -skipTrash #{directory} || true
        hdfs dfs -mkdir -p #{directory}/my_db/my_table
        echo -e 'a,1\\nb,2\\nc,3' | hdfs dfs -put - #{directory}/my_db/my_table/data
        hive -e "
          DROP TABLE IF EXISTS #{db}.my_table; DROP DATABASE IF EXISTS #{db};
          CREATE DATABASE #{db} LOCATION '/user/#{options.test.user.name}/#{directory}/my_db/';
          USE #{db};
          CREATE TABLE my_table(col1 STRING, col2 INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
        "
        hive -S -e "set hive.execution.engine=tez; SELECT SUM(col2) FROM #{db}.my_table;" | hdfs dfs -put - #{directory}/result
        hive -e "DROP TABLE #{db}.my_table; DROP DATABASE #{db};"
        """
        unless_exec: unless options.force_check then mkcmd.test options.test_krb5_user, "hdfs dfs -test -f #{directory}/result"
        trap: true

Dependencies

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