Esempio n. 1
0
def install_hbase(hdfs, zk):
    '''
    Anytime our dependencies are available, check to see if we have a valid
    reason to (re)install. These include:
    - initial install
    - config change
    - Zookeeper unit has joined/departed
    '''
    zks = zk.zookeepers()
    deployment_matrix = {
        'zookeepers': zks,
    }

    # Handle nuances when installing versus re-installing
    if not is_state('hbase.installed'):
        prefix = "installing"

        # On initial install, prime our kv with the current deployment matrix.
        # Subsequent calls will use this to determine if a reinstall is needed.
        data_changed('deployment_matrix', deployment_matrix)
    else:
        prefix = "configuring"

        # We do not need to reinstall when peers come and go; that is covered
        # by other handlers below.
        if is_state('hbpeer.departed') or is_state('hbpeer.joined'):
            return

        # Return if neither config nor our matrix has changed
        if not (is_state('config.changed')
                or data_changed('deployment_matrix', deployment_matrix)):
            return

    hookenv.status_set('maintenance', '{} hbase'.format(prefix))
    hookenv.log("{} hbase with: {}".format(prefix, deployment_matrix))
    hbase = HBase()
    hosts = {}
    hosts['namenode'] = hdfs.namenodes()[0]
    hbase.configure(hosts, zks)

    # Ensure our IP is in the regionservers list; restart if the rs conf
    # file has changed.
    hbase.update_regionservers([hookenv.unit_private_ip()])
    if any_file_changed(['/etc/hbase/conf/regionservers']):
        hbase.restart()

    # set app version string for juju status output
    hbase_version = get_package_version('hbase-master') or 'unknown'
    hookenv.application_version_set(hbase_version)

    hbase.open_ports()
    report_status()
    set_state('hbase.installed')
Esempio n. 2
0
def handle_peers():
    '''
    We use HBase peers to keep track of the RegionServer IP addresses in a
    cluster. Use get_nodes() from the appropriate peer relation to retrieve
    a list of peer tuples, e.g.:
        [('hbase/0', '172.31.5.161'), ('hbase/2', '172.31.5.11')]

    Depending on the state, this handler will add or remove peer IP addresses
    from the regionservers config file.
    '''
    if is_state('hbpeer.departed'):
        hbpeer = RelationBase.from_state('hbpeer.departed')
        is_departing = True
        message = 'removing hbase peer(s)'
    else:
        hbpeer = RelationBase.from_state('hbpeer.joined')
        is_departing = False
        message = 'adding hbase peer(s)'

    # Make sure we have a valid relation object
    if hbpeer:
        nodes = hbpeer.get_nodes()
    else:
        hookenv.log('Ignoring unknown HBase peer state')
        return

    hookenv.status_set('maintenance', message)
    hbase = HBase()
    ip_addrs = [node[1] for node in nodes]
    hookenv.log('{}: {}'.format(message, ip_addrs))
    hbase.update_regionservers(ip_addrs, remove=is_departing)

    # NB: the rs conf file will always change when handling peer updates, but
    # we still include this condition to keep the files_changed kv current.
    if any_file_changed(['/etc/hbase/conf/regionservers']):
        hbase.restart()

    # Dismiss appropriate state now that we've handled the peer
    if is_departing:
        hbpeer.dismiss_departed()
    else:
        hbpeer.dismiss_joined()
    report_status()