一、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 [ "$#" = ] && [ $ = "--home" ] ; then
export HOME_DIR=$
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  ] ; then
echo "" | sudo -S -l > /dev/null >&
if [ "$?" != "" ] ; then
echo "You can't perform this operation as non-sudoer user. Please, re-login or configure sudo access for this user."
exit
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方法执行过程如下:

Ambari Agent 源码分析的更多相关文章

  1. openfalcon源码分析之agent

    本节内容 agent功能 1.1 agent上报数据 1.2 agent与HBS同步 1.3 agent Http服务 agent源码分析 2.1 初始化config配置 2.2 初始化根目录,本地I ...

  2. Skywalking光会用可不行,必须的源码分析分析 - Skywalking Agent &插件解析

    3 Skywalking源码导入 接上文,已经学习了Skywalking的应用,接下来我们将剖析Skywalking源码,深度学习Skywalking Agent. 3.1 源码环境搭建 当前最新版本 ...

  3. Ambari架构源码解析

    1. Ambari介绍 Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应.管理和监控.Ambari已支持大多数Hadoop组件,包括HDFS.MapReduc ...

  4. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  5. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  6. Openrasp源码分析

    Openrasp是百度关于rasp技术的开源项目,由于工作需要,之前对rasp的源码进行了简单的分析.文章是之前就写好的,现在放出了,希望对大家有写帮助. OpenRASP中java引擎的源码分析 安 ...

  7. 开源网站流量统计系统Piwik源码分析——参数统计(一)

    Piwik现已改名为Matomo,这是一套国外著名的开源网站统计系统,类似于百度统计.Google Analytics等系统.最大的区别就是可以看到其中的源码,这正合我意.因为我一直对统计的系统很好奇 ...

  8. JForum 源码分析

    怎么才算好的源码分析呢?当然我这个肯定不算.我想大概分为几个层面吧,写写注释那算最基本的了,写写要点思路和难点,算是还不错拉,再难的就是跳出源码举一反三,形成自己的一套思路吧.好好努力吧. 这次针对的 ...

  9. ceilometer 源码分析(polling)(O版)

    一.简单介绍ceilometer 这里长话短说, ceilometer是用来采集openstack下面各种资源的在某一时刻的资源值,比如云硬盘的大小等.下面是官网现在的架构图 这里除了ceilomet ...

随机推荐

  1. [python] 溜了,溜了,七牛云图片资源批量下载 && 自建图床服务器

    故事背景: 七牛云最近一波测试域名操作真是把我坑死了!这简直和百度赠送你2T网盘,之后再限速一样骚操作.于是,痛定思痛自己买个云主机.自己搭图床应用! 1.七牛图片批量下载到本地 1.1 曲折尝试 当 ...

  2. [Swift]LeetCode916.单词子集 | Word Subsets

    We are given two arrays A and B of words.  Each word is a string of lowercase letters. Now, say that ...

  3. Java中的方法(形参及实参)return返回类型

    如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...

  4. Linux 遭入侵,挖矿进程被隐藏排查记录

    今天来给大家分享下这两天遇到的一个问题,服务器被挖矿了,把我的排查记录分享下,希望能帮到有需要的同学. 问题原因 多台服务器持续告警CPU过高,服务器为K8s的应用节点,正常情况下CPU使用率都挺低的 ...

  5. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  6. HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

    前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 ...

  7. 记Javascript一道题的理解

    代码如下: function Foo(){ getName = function(){ console.log("1"); } return this; } Foo.getName ...

  8. Zabbix系列之八——安装agent监控windows

    一.下载zabbix-agent客户端 被监控的主机装在windows server 2012 64位操作系统,被监控端需要安装: http://www.zabbix.com/downloads/3. ...

  9. tomcat的catalina.out日志按自定义时间日式进行分割

    使用cronolog对tomcat的日志进行自定义日期格式的切割,方便日志的整理和遇到问题日志的排查! 1.安装cronolog工具1.1 下载 cronolog 地址:网上很多下载地址这里就不在累赘 ...

  10. 使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序

    本文于2019年04月10日将标题「CentOS7 部署 ASP.NET Core应用程序」修改为「使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序」. 环境准备 VMwa ...