Menu

Phoenix Check

CSV data can be bulk loaded with built in utility named "psql.py". A shell is available with the utility named "sqlline.py"

Check Import and Select

Phoenix requires "RWXCA" permissions on the HBase table. Permission "execute" is required for coprocessor execution and permission "admin" is required to grant new permission to additionnal users.

Phoenix table are automatically converted to uppercase.

Refer to the sqlline documentation for a complete list of supported command instructions.

module.exports = header: 'Phoenix Client Check', handler: ({options}) ->
  zk_path = "#{options.site['hbase.zookeeper.quorum']}"
  zk_path += ":#{options.site['hbase.zookeeper.property.clientPort']}"
  zk_path += "#{options.site['zookeeper.znode.parent']}"

Wait

  @call once: true, 'ryba/hbase/master/wait', options.wait_hbase_master
  @call once: true, 'ryba/hbase/regionserver/wait', options.wait_hbase_regionserver

Check SQL Query

  table = "ryba_check_phoenix_#{options.hostname}".toUpperCase()
  @system.execute
    cmd: mkcmd.hbase options.admin, """
    export HBASE_CONF_DIR=#{options.hbase_conf_dir}
    hdfs dfs -rm -skipTrash check-#{options.hostname}-phoenix
    # Drop table if it exists
    # if hbase shell 2>/dev/null <<< "list" | grep '#{table}'; then echo "disable '#{table}'; drop '#{table}'" | hbase shell 2>/dev/null; fi
    echo "disable '#{table}'; drop '#{table}'" | hbase shell 2>/dev/null
    # Create table with dummy column family and grant access to ryba
    echo "create '#{table}', 'cf1'; grant 'ryba', 'RWXCA', '#{table}'" | hbase shell 2>/dev/null;
    """
    unless_exec: unless options.force_check then mkcmd.test options.test_krb5_user, "hdfs dfs -test -f check-#{options.hostname}-phoenix"
  @file
    target: "#{options.test.user.home}/check_phoenix/create.sql"
    uid: options.test.user.name
    gid: options.test.user.gid
    content: """
    CREATE TABLE IF NOT EXISTS #{table} (
      HOST CHAR(2) NOT NULL,
      DOMAIN VARCHAR NOT NULL,
      FEATURE VARCHAR NOT NULL,
      DATE DATE NOT NULL,
      USAGE.CORE BIGINT,
      USAGE.DB BIGINT,
      STATS.ACTIVE_VISITOR INTEGER
      CONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE)
    );
    """
  @file
    target: "#{options.test.user.home}/check_phoenix/select.sql"
    uid: options.test.user.name
    gid: options.test.user.group
    content: """
    SELECT DOMAIN, AVG(CORE) Average_CPU_Usage, AVG(DB) Average_DB_Usage 
    FROM #{table} 
    GROUP BY DOMAIN 
    ORDER BY DOMAIN DESC;
    """
  @system.execute
    cmd: mkcmd.test options.test_krb5_user, """
    export HBASE_CONF_DIR=#{options.hbase_conf_dir}
    cd /usr/hdp/current/phoenix-client/bin
    ./psql.py -t #{table} #{zk_path} \
      #{options.test.user.home}/check_phoenix/create.sql \
      ../doc/examples/WEB_STAT.csv \
    >/dev/null # 2>&1
    """
    retry: 5
    interval: 10000
  @wait.execute
    cmd: mkcmd.hbase options.admin, """
    export HBASE_CONF_DIR=#{options.hbase_conf_dir}
    hbase shell 2>/dev/null <<< "list" | grep '#{table}'
    """
  @system.execute
    cmd: mkcmd.test options.test_krb5_user, """
    export HBASE_CONF_DIR=#{options.hbase_conf_dir}
    cd /usr/hdp/current/phoenix-client/bin
    ./sqlline.py #{zk_path} \
      #{options.test.user.home}/check_phoenix/select.sql
    hdfs dfs -touchz check-#{options.hostname}-phoenix
    """
    retry: 5
    interval: 10000
    trap: true
  , (err, check, data) ->
    throw err if err
    throw Error "Invalid output" if check and data.trim().match(/\|(.*)\|(.*)\|(.*)\|/g).length isnt 4

Dependencies

mkcmd = require '../../lib/mkcmd'
string = require '@nikitajs/core/lib/misc/string'