zoukankan      html  css  js  c++  java
  • Ambari Agent 源码分析

    一、ambari-agent 启动方式

    Ambari-Agent的启动脚本为/etc/init.d/ambari-agent。该脚本主要实现了start,stop,status,restart,reset方法。对于start,stop,status,reset方法的实现,直接调用/usr/sbin/ambari-agent脚本,将所有命令参数传入进去,reset直接调用stop,在调用start。 

    二、ambari-agent启动脚本

    /usr/sbin/ambari-agent 通过软链接指向/etc/init.d/ambari-agent,其执行过程如下:

    1. set -u 脚本执行过程中,如果使用到未定义的变量,则显示错误信息。

    set -u # fail on unset variables

    2. 参数检测,如果设置了“–home”参数,则根据参数值,设置HOME_DIR。Ambari-Agent允许在单台节点上运行多个agent客户端(进行集群模拟),每个客户端有自己的配置文件目录。默认情况下,HOME_DIR为空。

    export HOME_DIR=""
    if [ "$#" = 3 ] && [ $2 = "--home" ] ; then
      export HOME_DIR=$3
      echo "Allow running multiple agents on this host; will use custom Home Dir: $HOME_DIR"
    fi

    3. 设置环境变量CONFIG_FILE="$HOME_DIR/etc/ambari-agent/conf/ambari-agent.ini",默认情况下,CONFIG_FILE=/etc/ambari-agent/conf/ambari-agent.ini。

    export CONFIG_FILE="$HOME_DIR/etc/ambari-agent/conf/ambari-agent.ini"

     4. 解析CONFIG_FILE文件,根据该配置文件,进行相关环境变量的设置。

    get_agent_property() {
      property_name="$1"
      value=$(awk -F "=" "/^$property_name/ {print $2}" $CONFIG_FILE)
      echo $value
    }
    export PATH=/usr/sbin:/sbin:/usr/lib/ambari-server/*:$PATH
    export AMBARI_CONF_DIR=$HOME_DIR/etc/ambari-server/conf:$PATH
    
    # Because Ambari rpm unpacks modules here on all systems
    export PYTHONPATH=/usr/lib/ambari-agent/lib:${PYTHONPATH:-}
    
    export AMBARI_PID_DIR=`get_agent_property piddir`
    export AMBARI_PID_DIR=`valid_path "${AMBARI_PID_DIR:?}"`
    export AMBARI_PID_DIR="${AMBARI_PID_DIR:?}"
    export AMBARI_AGENT_LOG_DIR=`get_agent_property logdir`
    export AMBARI_AGENT_LOG_DIR=`valid_path "${AMBARI_AGENT_LOG_DIR:?}"`
    export AMBARI_AGENT_LOG_DIR="${AMBARI_AGENT_LOG_DIR:?}"
    KEYSDIR=`get_agent_property keysdir`
    KEYSDIR=`valid_path "${KEYSDIR:?}"`
    KEYSDIR="${KEYSDIR:?}"
    
    AMBARI_AGENT=ambari-agent
    PYTHON_WRAP=/usr/bin/ambari-python-wrap
    PIDFILE=$AMBARI_PID_DIR/$AMBARI_AGENT.pid
    OUTFILE=$AMBARI_AGENT_LOG_DIR/ambari-agent.out
    LOGFILE=$AMBARI_AGENT_LOG_DIR/ambari-agent.log
    AGENT_SCRIPT=/usr/lib/ambari-agent/lib/ambari_agent/main.py
    AGENT_TMP_DIR=/var/lib/ambari-agent/tmp
    AGENT_WORKING_DIR=/var/lib/ambari-agent
    AMBARI_AGENT_PY_SCRIPT=/usr/lib/ambari-agent/lib/ambari_agent/AmbariAgent.py
    COMMON_DIR=/usr/lib/ambari-agent/lib/ambari_commons
    COMMON_DIR_AGENT=/usr/lib/ambari-agent/lib/ambari_commons
    OK=0
    NOTOK=1

    5. 获取当前用户和用户组。

    current_user=`id -u -n`
    current_group=`id -g -n`

    6. 检测用户权限,如果该用户不是root用户,则检查该用户是否有sudo权限(通过是否能执行sudo -l 命令,只有拥有sudo权限的用户能使用-l参数)。

    if [ "$EUID" -ne 0 ] ; then
      echo "" | sudo -S -l > /dev/null 2>&1
      if [ "$?" != "0" ] ; then
        echo "You can't perform this operation as non-sudoer user. Please, re-login or configure sudo access for this user."
        exit 0
      fi
    fi

    7. 切换到ambari-agent工作目录。

    cd $AGENT_WORKING_DIR

     8. 配置PYTHON环境变量。

    if [ -z "${PYTHON:-}" ] ; then
      export PYTHON=`readlink $PYTHON_WRAP`
    fi

    9. 从环境变量中读取 AMBARI_PASSPHRASE,如果存在,则把值赋给 RESOLVED_AMBARI_PASSPHRASE。

    if [ ! -z ${AMBARI_PASSPHRASE:-} ]; then
      RESOLVED_AMBARI_PASSPHRASE=$AMBARI_PASSPHRASE
    fi

     10. 如果ambari-env.sh 文件存在,执行sudo chown命令修改其拥有者为当前用户。

    # Reading the environment file
    if [ -a /var/lib/ambari-agent/ambari-env.sh ]; then
      /var/lib/ambari-agent/ambari-sudo.sh chown -R $current_user "/var/lib/ambari-agent/ambari-env.sh"
      . /var/lib/ambari-agent/ambari-env.sh
    fi

    11. 如果 AMBARI_AGENT_LOG_DIR 存在,则设定LOGFILE文件名。

    if [ ! -z $AMBARI_AGENT_LOG_DIR ]; then
      LOGFILE=$AMBARI_AGENT_LOG_DIR/ambari-agent.log
    fi

     12. 如果 AMBARI_AGENT_OUT_DIR 存在,则设定OUTPUT文件名。

    if [ ! -z ${AMBARI_AGENT_OUT_DIR:-} ]; then
      OUTFILE=$AMBARI_AGENT_OUT_DIR/ambari-agent.out
    fi

    13. 设定 AMBARI_PASSPHRASE 环境变量。

    if [ -z ${RESOLVED_AMBARI_PASSPHRASE:-} ] &&  [ ! -z ${AMBARI_PASSPHRASE:-} ]; then
      RESOLVED_AMBARI_PASSPHRASE=${AMBARI_PASSPHRASE:-}
      # If the passphrase is not defined yet, use the value from the env file
    elif [ -z ${RESOLVED_AMBARI_PASSPHRASE:-} ]; then
      # Passphrase is not defined anywhere, set the default value
      RESOLVED_AMBARI_PASSPHRASE="DEV"
    fi
    
    export AMBARI_PASSPHRASE=$RESOLVED_AMBARI_PASSPHRASE

    14. 根据参数中传递的命令(start、status、stop、restart、reset)执行相应的命令,这里只对start命令进行说明,步骤如下:

      (a) 检查python版本;

      (b) 根据pid文件,检查当前是否有正常运行的agent进程(如果存在pid文件,且存在进程的进程号等于pid文件中记录的进程号,则认为agent已经启动,则抛出异常,返回) 

      (c) 修改相关文件目录权限,指定其拥有者为当前用户;

      (d) 比较 COMMON_DIR 和  COMMON_DIR_AGENT,如果不相同,则返回;

      (e) 执行 python 脚本,启动 ambari-agent 进程,脚本路径为:AMBARI_AGENT_PY_SCRIPT=/usr/lib/ambari-agent/lib/ambari_agent/AmbariAgent.py;

      (f) 等待2秒,等待AmbariAgent运行一段时间(AmbariAgent会启动子进程,该进程会创建pid文件,将子进程的pid号写入到pid文件中); 

      (g) 根据pid号检查agent是否启动正常;

    注意:pid文件不是在启动脚本中创建写入的,而是在/usr/lib/python2.6/site-packages/ambari-agent/main.py中的daemonize函数中创建写入的,写入的是运行main.py的进程号。

    三、ambari-agent 启动过程

        从Ambari-agent启动脚本可知,ambari-agent启动入口点为:/usr/lib/python2.6/site-packages/ambari-agent/AmbariAgent.py。下面主要分析AmbariAgent.py的运行过程。 
     AmbariAgent.py脚本比较简单,主要工作是启动子进程,运行/usr/lib/python2.6/site-packages/ambari-agent/main.py脚本。当脚本运行结束后,清理其产生的pid文件。 
    下面看看main.py主要运行过程。

    1. Signal信号绑定: 

      (a) 主要绑定SigInt信号处理器、SigTerm信号处理器 
      (b) 绑定debug类型的SigUSR1,SigUSR2信号和信号处理器   
      (c) 创建HeartBeatSopCallback回调处理器。

    2. 执行main 方法:

        (a) 解析运行参数;

      (b) 配置日志处理;

      (c) 加载配置文件,解析配置属性;

      (d) 如果为 stop 或者 reset 命令,则执行对应的方法;

      (e) 添加系统日志处理器;

         (f)  启动DataCleaner 线程(如果配置文件中有 data_cleanup_interval 属性,且其值大于0)

      (g) 执行 ambari-agent 配置检查;

      (h) 启动 PingPortListener 线程(该服务器作为一个机器级的全局的锁);

      (i)  非windows系统,则创建pid文件,写pid ;

      (j) 获取配置文件中配置的server列表,依次不断的去连接server,直到和某个server建立连接(或是agent停止)。如果连接成功,调用 run_threads 方法开始 Server <--> Agent通信流程。

      run_thread方法执行过程如下:

  • 相关阅读:
    mysql 实战 or、in与union all 的查询效率
    转:手机流畅的决定性因素
    合批只是对CPU的优化,与GPU没有任何关系
    UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新
    RGB ECT 4BIT 压缩后质量远高于RGB ETC2 4BIT
    Adreno GPU Profiler
    UNITY2018.3 在editor下运行时new memoryprofiler显示 shader占用内存很大的问题在安卓上并没有看到
    VS2017断点调试UNITY2018.3 经常卡住的问题
    一次UNITY闪退问题的定位心得
    UNITY2018 真机开启deepprofiling的操作
  • 原文地址:https://www.cnblogs.com/mymelody/p/9435861.html
Copyright © 2011-2022 走看看