Source code for prestoadmin.yarn_slider.server

# -*- coding: utf-8 -*-
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""
Module for managing presto/YARN integration.
"""

import os.path

from fabric.api import env, task, abort
from fabric.context_managers import shell_env
from fabric.operations import put, sudo, local

from prestoadmin.yarn_slider.config import SliderConfig, \
    DIR, SLIDER_USER, APPNAME, JAVA_HOME, HADOOP_CONF, SLIDER_MASTER, \
    PRESTO_PACKAGE, SLIDER_CONFIG_DIR
from prestoadmin.util.base_config import requires_config

from prestoadmin.util.fabricapi import task_by_rolename

__all__ = ['install', 'uninstall']


SLIDER_PKG_DEFAULT_FILES = ['appConfig-default.json', 'resources-default.json']


def get_slider_bin(conf):
    return os.path.join(conf[DIR], 'bin', 'slider')


def run_slider(slider_command, conf):
    with shell_env(JAVA_HOME=conf[JAVA_HOME],
                   HADOOP_CONF_DIR=conf[HADOOP_CONF]):
        return sudo(slider_command, user=conf[SLIDER_USER])


@task
@requires_config(SliderConfig)
@task_by_rolename(SLIDER_MASTER)
[docs]def install(presto_yarn_package): """ Install the presto-yarn package on the cluster using Apache Slider. The presto-yarn package takes the form of a zip file that conforms to Slider's packaging requirements. After installing the presto-yarn package the presto application is registered with Slider. Before Slider can install the presto-yarn package, the slider user's hdfs home directory needs to be created. This needs to be done by a user that has write access to the hdfs /user directory, typically the user hdfs or a member of the superuser group. The name of the presto application is arbitrary and set in the slider configuration file. The default is PRESTO :param presto_yarn_package: The zip file containing the presto-yarn package as structured for Slider. """ conf = env.conf package_filename = os.path.basename(presto_yarn_package) package_file = os.path.join('/tmp', package_filename) result = put(presto_yarn_package, package_file) if result.failed: abort('Failed to send slider application package to %s on host %s' % (package_file, env.host)) package_install_command = \ '%s package --install --package %s --name %s' % \ (get_slider_bin(conf), package_file, conf[APPNAME]) try: run_slider(package_install_command, conf) conf[PRESTO_PACKAGE] = package_filename conf.store_conf() local('unzip %s %s -d %s' % (presto_yarn_package, ' '.join(SLIDER_PKG_DEFAULT_FILES), SLIDER_CONFIG_DIR)) finally: sudo('rm -f %s' % (package_file))
@task @requires_config(SliderConfig) @task_by_rolename(SLIDER_MASTER)
[docs]def uninstall(): """ Uninstall unregisters the presto application with slider and removes the installed package. """ conf = env.conf package_delete_command = '%s package --delete --name %s' % \ (get_slider_bin(conf), conf[APPNAME]) run_slider(package_delete_command, conf) try: del conf[PRESTO_PACKAGE] conf.store_conf() except KeyError: pass local('rm %s' % (' '.join([os.path.join(SLIDER_CONFIG_DIR, f) for f in SLIDER_PKG_DEFAULT_FILES])))