Menu
module.exports = (service) ->
  options = service.options

Kerberos

  options.krb5 ?= {}
  options.krb5.realm ?= service.deps.krb5_client.options.etc_krb5_conf?.libdefaults?.default_realm
  throw Error 'Required Options: "realm"' unless options.krb5.realm
  options.krb5.admin ?= service.deps.krb5_client.options.admin[options.krb5.realm]

Identities

  options.hadoop_group = merge {}, service.deps.hadoop_core.options.hadoop_group, options.hadoop_group
  options.group = merge service.deps.hbase_master[0].options.group, options.group
  options.user = merge service.deps.hbase_master[0].options.user, options.user
  options.admin = merge service.deps.hbase_master[0].options.admin, options.admin
  # Kerberos Test Principal
  options.test_krb5_user ?= service.deps.test_user.options.krb5.user

Environment

  # Layout
  options.conf_dir ?= '/etc/hbase-regionserver/conf'
  # We could use hdfs_dn but defaultFS isnt defined
  options.hdfs_conf_dir ?= service.deps.hdfs_client.options.conf_dir
  options.log_dir ?= '/var/log/hbase'
  options.pid_dir ?= '/var/run/hbase'
  # Env & Java
  options.env ?= {}
  # http://blog.sematext.com/2012/07/16/hbase-memstore-what-you-should-know/
  # Keep hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs just
  # Value is a bit above hbase.regionserver.global.memstore.lowerLimit * HBASE_HEAPSIZE
  # 'HBASE_REGIONSERVER_OPTS ?= '-Xmn200m -Xms4096m -Xmx4096m' # Default in HDP companion file
  options.java_home ?= "#{service.deps.java.options.java_home}"
  options.heapsize ?= '1024m'
  options.newsize ?= '200m'
  # Misc
  options.fqdn = service.node.fqdn
  options.hostname = service.node.hostname
  options.iptables ?= service.deps.iptables and service.deps.iptables.options.action is 'start'
  options.clean_logs ?= false

System Options

  options.opts ?= {}
  options.opts.base ?= ''
  options.opts.java_properties ?= {}
  options.opts.jvm ?= {}
  options.opts.jvm['-Xms'] ?= options.heapsize
  options.opts.jvm['-Xmx'] ?= options.heapsize
  options.opts.jvm['-XX:NewSize='] ?= options.newsize #should be 1/8 of hbase regionserver heapsize
  options.opts.jvm['-XX:MaxNewSize='] ?= options.newsize #should be 1/8 of hbase regionserver heapsize

Registration

  for srv in service.deps.hbase_master
    srv.options.regionservers[service.node.fqdn] ?= true

  for srv in service.deps.hbase_regionserver
    srv.options.regionservers ?= {}
    srv.options.regionservers[service.node.fqdn] ?= true

Configuration

  options.hbase_site ?= {}
  options.hbase_site['hbase.regionserver.port'] ?= '60020'
  options.hbase_site['hbase.regionserver.info.port'] ?= '60030'
  options.hbase_site['hbase.ssl.enabled'] ?= 'true'
  options.hbase_site['hbase.regionserver.handler.count'] ?= 60 # HDP default

Security

  options.hbase_site['hbase.security.authentication'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.security.authentication']
  if options.hbase_site['hbase.security.authentication'] is 'kerberos'
    options.hbase_site['hbase.master.kerberos.principal'] = service.deps.hbase_master[0].options.hbase_site['hbase.master.kerberos.principal']
    options.hbase_site['hbase.regionserver.kerberos.principal'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.regionserver.kerberos.principal']
    options.hbase_site['hbase.regionserver.keytab.file'] ?= '/etc/security/keytabs/rs.service.keytab'
    options.hbase_site['hbase.security.authentication.ui'] ?= 'kerberos'
    options.hbase_site['hbase.security.authentication.spnego.kerberos.principal'] ?= "HTTP/_HOST@#{options.krb5.realm}"
    options.hbase_site['hbase.security.authentication.spnego.kerberos.keytab'] ?= service.deps.hadoop_core.options.core_site['hadoop.http.authentication.kerberos.keytab']
  options.hbase_site['hbase.regionserver.global.memstore.upperLimit'] = null # Deprecated from HDP 2.3
  options.hbase_site['hbase.regionserver.global.memstore.size'] = '0.4' # Default in HDP Companion Files
  options.hbase_site['hbase.coprocessor.region.classes'] =  service.deps.hbase_master[0].options.hbase_site['hbase.coprocessor.region.classes']
  # Jaas file
  options.opts.java_properties['java.security.auth.login.config'] ?= "#{options.conf_dir}/hbase-regionserver.jaas"
  # Copy the Master keytab if a colocalised Master is found and if their principals are equal.
  local_master = service.deps.hbase_master.filter( (srv) -> srv.node.fqdn is service.node.fqdn)[0]
  are_principal_equal = local_master.options.hbase_site['hbase.master.kerberos.principal'] is options.hbase_site['hbase.regionserver.kerberos.principal'] if local_master
  if local_master and are_principal_equal
    options.copy_master_keytab ?= local_master.options.hbase_site['hbase.master.keytab.file']

Configuration Distributed mode

  for property in [
    'zookeeper.znode.parent'
    'zookeeper.session.timeout'
    'hbase.cluster.distributed'
    'hbase.rootdir'
    'hbase.zookeeper.quorum'
    'hbase.zookeeper.property.clientPort'
    'dfs.domain.socket.path'
  ] then options.hbase_site[property] ?= service.deps.hbase_master[0].options.hbase_site[property]

Configuration for HA Reads

HA properties must be available to masters and regionservers.

  properties = [
    'hbase.regionserver.storefile.refresh.period'
    'hbase.regionserver.meta.storefile.refresh.period'
    'hbase.region.replica.replication.enabled'
    'hbase.master.hfilecleaner.ttl'
    'hbase.master.loadbalancer.class'
    'hbase.meta.replica.count'
    'hbase.region.replica.wait.for.primary.flush'
    'hbase.region.replica.storefile.refresh.memstore.multiplier'
  ]
  for property in properties then options.hbase_site[property] ?= service.deps.hbase_master[0].options.hbase_site[property]

Configuration for security

  options.hbase_site['hbase.security.authorization'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.security.authorization']
  options.hbase_site['hbase.rpc.engine'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.rpc.engine']
  options.hbase_site['hbase.superuser'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.superuser']
  options.hbase_site['hbase.bulkload.staging.dir'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.bulkload.staging.dir']

Configuration Quota

  options.hbase_site['hbase.quota.enabled'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.quota.enabled']
  options.hbase_site['hbase.quota.refresh.period'] ?= service.deps.hbase_master[0].options.hbase_site['hbase.quota.refresh.period']

Configuration for metrics

Metrics information are entirely derived from the Master.

  options.metrics ?= service.deps.hbase_master[0].options.metrics

Configuration for Log4J

  options.log4j = merge {}, service.deps.log4j?.options, options.log4j

  options.opts.java_properties['hbase.security.log.file'] ?= 'SecurityAuth-Regional.audit'
  #HBase bin script use directly environment bariables
  options.env['HBASE_ROOT_LOGGER'] ?= 'INFO,RFA'
  options.env['HBASE_SECURITY_LOGGER'] ?= 'INFO,RFAS'
  if options.log4j.remote_host? and options.log4j.remote_port?
    # adding SOCKET appender
    options.log4j.socket_client ?= "SOCKET"
    # Root logger
    if options.env['HBASE_ROOT_LOGGER'].indexOf(options.log4j.socket_client) is -1
    then options.env['HBASE_ROOT_LOGGER'] += ",#{options.log4j.socket_client}"
    # Security Logger
    if options.env['HBASE_SECURITY_LOGGER'].indexOf(options.log4j.socket_client) is -1
    then options.env['HBASE_SECURITY_LOGGER']+= ",#{options.log4j.socket_client}"

    options.opts.java_properties['hbase.log.application'] = 'hbase-regionserver'
    options.opts.java_properties['hbase.log.remote_host'] = options.log4j.remote_host
    options.opts.java_properties['hbase.log.remote_port'] = options.log4j.remote_port

    options.log4j.socket_opts ?=
      Application: '${hbase.log.application}'
      RemoteHost: '${hbase.log.remote_host}'
      Port: '${hbase.log.remote_port}'
      ReconnectionDelay: '10000'

    options.log4j.properties = merge options.log4j.properties, appender
      type: 'org.apache.log4j.net.SocketAppender'
      name: options.log4j.socket_client
      logj4: options.log4j.properties
      properties: options.log4j.socket_opts

Wait

  options.wait_krb5_client = service.deps.krb5_client.options.wait
  options.wait_zookeeper_server = service.deps.zookeeper_server[0].options.wait
  options.wait_hdfs_nn = service.deps.hdfs_nn[0].options.wait
  options.wait_hbase_master = service.deps.hbase_master[0].options.wait
  options.wait = {}
  for srv in service.deps.hbase_regionserver
    srv.options.hbase_site ?= {}
    srv.options.hbase_site['hbase.regionserver.port'] ?= '60020'
    srv.options.hbase_site['hbase.regionserver.info.port'] ?= '60030'
  options.wait.rpc = for srv in service.deps.hbase_regionserver
    host: srv.node.fqdn
    port: srv.options.hbase_site['hbase.regionserver.port']
  options.wait.info = for srv in service.deps.hbase_regionserver
    host: srv.node.fqdn
    port: srv.options.hbase_site['hbase.regionserver.info.port']
  for srv in service.deps.hbase_master
    srv.options.wait_hbase_regionserver ?= options.wait

Dependencies

appender = require '../../lib/appender'
{merge} = require '@nikitajs/core/lib/misc'