系列前三篇文章中介绍了分布式存储和计算系统Hadoop以及Hadoop集群的搭建、Zookeeper集群搭建、HBase分布式部署等。当Hadoop集群的数量达到1000+时,集群自身的信息将会大量增加。Apache开发出一个开源的数据收集和分析系统—Chukwa来处理Hadoop集群的数据。Chukwa有几个非常吸引人的特点:它架构清晰,部署简单;收集的数据类型广泛,具有很强的扩展性;与 Hadoop 无缝集成,能完成海量数据的收集与整理。

1 Chukwa简介


   在Chukwa的官网https://chukwa.apache.org/ ,Chukwa被描述为:Chukwa是一个开源的监控大型分布式系统的数据收集系统,它构建于HDFS和Map/Reduce框架之上,并继承了Hadoop优秀的扩展性和健壮性。在数据分析方面,Chukwa拥有一套灵活、强大的工具,可用于监控和分析结果来更好的利用所收集的数据结果。

   为了更加简单直观的展示 Chukwa,我们先来看一个假设的场景。假设我们有一个规模很大 ( 牵扯到 Hadoop 的总是很大。。。。) 的网站,网站每天产生数量庞大的日志文件,要收集,分析这些日志文件可不是件容易的事情,读者可能会想了,做这种事情 Hadoop 挺合适的,很多大型网站都在用,那么问题来了,分散在各个节点的数据怎么收集,收集到的数据如果有重复数据怎么处理,如何与 Hadoop 集成。如果自己编写代码完成这个过程,一来需要花费不小的精力,二来不可避免的会引入 Bug。这里就是我们 Chukwa 发挥作用的时候了,Chukwa 是一个开源的软件,有很多聪明的开发者在贡献着自己的智慧。它可以帮助我们在各个节点实时监控日志文件的变化,增量的将文件内容写入 HDFS,同时还可以将数据去除重复,排序等,这时 Hadoop 从 HDFS 中拿到的文件已经是 SequenceFile 了。无需任何转换过程,中间繁杂的过程都由 Chukwa 帮我们完成了。是不是很省心呢。这里我们仅仅举了一个应用的例子,它还可以帮我们监控来自 Socket 的数据,甚至定时执行我们指定的命令获取输出数据,等等,具体的可以参看 Chukwa 官方文档。如果这些还不够,我们还可以自己定义自己的适配器来完成更加高级的功能。


2 Chukwa的架构


Chukwa旨在为分布式数据收集和大数据处理提供一个灵活、强大的平台,这个平台不仅现时可用,而且能够与时俱进的利用更新的存储技术(比如HDFS、HBase等),当这些存储技术变得成熟时。为了保持这种灵活性,Chukwa被设计成收集和处理层级的管道线,在各个层级之间有非常明确和狭窄的界面,下图为Chukwa架构示意图:

wKiom1MeyTiiLypaAAEkMHywT5U139.jpg

其中主要的部件为:
1. Agents : 负责采集最原始的数据,并发送给 Collectors
2. Adaptors : 直接采集数据的接口和工具,一个 Agent 可以管理多个 Adaptor 的数据采集
3. Collectors :负责收集 Agent 收送来的数据,并定时写入集群中
4. Map/Reduce Jobs: 定时启动,负责把集群中的数据分类、排序、去重和合并
5. HICC(Hadoop Infrastructure Care Center)负责数据的展示


3 主要部件的具体设计


3.1 Adaptors、Agents


在每个数据的产生端(基本上是集群中每一个节点上), Chukwa 使用一个Agent 来采集它感兴趣的数据,每一类数据通过一个 Adaptor 来实现, 数据的类型(Data Model)在相应的配置中指定. 默认地, Chukwa 对以下常见的数据来源已经提供了相应的 Adaptor : 命令行输出、log 文件和 httpSender等等. 这些 Adaptor 会定期运行(比如每分钟读一次 df 的结果)或事件驱动地执行(比如 kernel 打了一条错误日志). 如果这些 Adaptor 还不够用,用户也可以方便地自己实现一个 Adaptor 来满足需求。

为防止数据采集端的 Agent 出现故障,Ahukwa 的 Agent 采用了所谓的 ‘watchdog’ 机制,会自动重启终止的数据采集进程,防止原始数据的丢失。
另一方面, 对于重复采集的数据, 在 Chukwa 的数据处理过程中,会自动对它们进行去重. 这样,就可以对于关键的数据在多台机器上部署相同的 Agent,从而实现容错的功能。


3.2 Collectors


agents 采集到的数据,是存储到 hadoop 集群上的。hadoop 集群擅长于处理少量大文件,而对于大量小文件的处理则不是它的强项,针对这一点,chukwa 设计了 collector 这个角色,用于把数据先进行部分合并,再写入集群,防止大量小文件的写入。
另一方面,为防止 collector 成为性能瓶颈或成为单点,产生故障, chukwa 允许和鼓励设置多个 collector, agents 随机地从 collectors 列表中选择一个 collector 传输数据,如果一个 collector 失败或繁忙,就换下一个 collector. 从而可以实现负载的均衡,实践证明,多个 collector 的负载几乎是平均的。


3.3 demux、archive


放在集群上的数据,是通过 map/reduce 作业来实现数据分析的. 在 map/reduce 阶段, chukwa 提供了 demux 和 archive 任务两种内置的作业类型.
demux 作业负责对数据的分类、排序和去重. 在 agent 一节中,我们提到了数据类型(DataType?)的概念.由 collector 写入集群中的数据,都有自己的类型. demux 作业在执行过程中,通过数据类型和配置文件中指定的数据处理类,执行相应的数据分析工作,一般是把非结构化的数据结构化,抽取中其中的数据属性.由于 demux 的本质是一个 map/reduce 作业,所以我们可以根据自己的需求制定自己的 demux 作业,进行各种复杂的逻辑分析. chukwa 提供的 demux interface 可以用 java 语言来方便地扩展.
而 archive 作业则负责把同类型的数据文件合并,一方面保证了同一类的数据都在一起,便于进一步分析, 另一方面减少文件数量, 减轻 hadoop 集群的存储压力。


3.4 dbadmin


放在集群上的数据,虽然可以满足数据的长期存储和大数据量计算需求,但是不便于展示。为此, chukwa 做了两方面的努力:
1. 使用 mdl 语言,把集群上的数据抽取到 mysql 数据库中,对近一周的数据,完整保存,超过一周的数据,按数据离现在的时间长短作稀释,离现在越久的数据,所保存的数据时间间隔越长.通过 mysql 来作数据源,展示数据.
2. 使用 hbase 或类似的技术,直接把索引化的数据在存储在集群上
到 chukwa 0.4.0 版本为止, chukwa 都是用的第一种方法,但是第二种方法更优雅也更方便一些。


3.5 hicc


hicc 是 chukwa 的数据展示端的名字。在展示端, chukwa 提供了一些默认的数据展示 widget,可以使用“列表”、“曲线图”、“多曲线图”、“柱状图”、“面积图式展示一类或多类数据,给用户直观的数据趋势展示。而且,在 hicc 展示端,对不断生成的新数据和历史数据,采用 robin 策略,防止数据的不断增长增大服务器压力,并对数据在时间轴上“稀释”,可以提供长时间段的数据展示
从本质上, hicc 是用 jetty 来实现的一个 web 服务端,内部用的是 jsp 技术和 javascript 技术.各种需要展示的数据类型和页面的局都可以通过简直地拖拽方式来实现,更复杂的数据展示方式,可以使用 sql 语言组合出各种需要的数据.如果这样还不能满足需求,不用怕,动手修改它的 jsp 代码就可以了。


3.6 其它数据接口


如果对原始数据还有新的需要,用户还可以通过 map/reduce 作业或 pig 语言直接访问集群上的原始数据,以生成所需要的结果。chukwa 还提供了命令行的接口,可以直接访问到集群上数据。


3.7 默认数据支持


对于集群各节点的cpu使用率、内存使用率、硬盘使用率、集群整体的 cpu 平均使用率、集群整体的内存使用率、集群整体的存储使用率、集群文件数变化、作业数变化等等 hadoop 相关数据,从采集到展示的一整套流程, chukwa 都提供了内建的支持,只需要配置一下就可以使用.可以说是相当方便的.
可以看出,chukwa 从数据的产生、收集、存储、分析到展示的整个生命周期都提供了全面的支持。下图为Chukwa完整架构图:

wKioL1MezKHg-TdnAAFNLi1NcA4146.jpg


4 Chukwa到底是什么?


4.1 chukwa 不是什么


1. chukwa 不是一个单机系统. 在单个节点部署一个 chukwa 系统,基本没有什么用处。chukwa 是一个构建在 hadoop 基础上的分布式日志处理系统.换言之,在搭建 chukwa 环境之前,你需要先构建一个 hadoop 环境,然后在 hadoop 的基础上构建 chukwa 环境,这个关系也可以从稍后的 chukwa 架构图上看出来.这也是因为 chukwa 的假设是要处理的数据量是在 T 级别的.


2. chukwa 不是一个实时错误监控系统.在解决这个问题方面, ganglia,nagios 等等系统已经做得很好了,这些系统对数据的敏感性都可以达到秒级. chukwa 分析的是数据是分钟级别的,它认为像集群的整体 cpu 使用率这样的数据,延迟几分钟拿到,不是什么问题.


3. chukwa 不是一个封闭的系统.虽然 chukwa 自带了许多针对 hadoop 集群的分析项,但是这并不是说它只能监控和分析 hadoop.chukwa 提供了一个对大数据量日志类数据采集、存储、分析和展示的全套解决方案和框架,在这类数据生命周期的各个阶段, chukwa 都提供了近乎完美的解决方案,这一点也可以从它的架构中看出来.

4.2 chukwa 是什么


   上一节说了很多 chukwa 不是什么,下面来看下 chukwa 具体是干什么的一个系统呢?具体而言, chukwa 致力于以下几个方面的工作:

1. 总体而言, chukwa 可以用于监控大规模(2000+ 以上的节点, 每天产生数据量在T级别) hadoop 集群的整体运行情况并对它们的日志进行分析


2. 对于集群的用户而言: chukwa 展示他们的作业已经运行了多久,占用了多少资源,还有多少资源可用,一个作业是为什么失败了,一个读写操作在哪个节点出了问题.


3. 对于集群的运维工程师而言: chukwa 展示了集群中的硬件错误,集群的性能变化,集群的资源瓶颈在哪里.


4. 对于集群的管理者而言: chukwa 展示了集群的资源消耗情况,集群的整体作业执行情况,可以用以辅助预算和集群资源协调.


5. 对于集群的开发者而言: chukwa 展示了集群中主要的性能瓶颈,经常出现的错误,从而可以着力重点解决重要问题.


5 Chukwa的部署和配置


5.1 前期准备


   Chukwa是部署在Hadoop集群之上的,所以前期需安装部署好Hadoop集群,其中包括SSH无密码登录、JDK安装等,具体可参考这个系列的其他博文“Hadoop连载系列之一:Hadoop集群搭建”等。

   Hadoop集群架构如下:1个Master,1个Backup(主机备用),3个Slave(由虚拟机创建)。节点IP地址:

rango(Master)       192.168.56.1          namenode

vm1(Backup)        192.168.56.101    secondarynode

vm2(Slave1)         192.168.56.102    datanode

vm3(Slave2)         192.168.56.103    datanode

vm4(Slave3)         192.168.56.104    datanode


5.2 安装Chukwa


   从官网http://www.apache.org/dyn/closer.cgi/incubator/chukwa/chukwa-0.5.0 只可以下载到chukwa-incubating-src-0.5.0.tar.gz,可从http://people.apache.org/~eyang/chukwa-0.5.0-rc0/下载最新版本的Chukwa版本chukwa-incubating-0.5.0.tar.gz。

   解压并重命名移动到/usr目录:

tar zxvf chukwa-incubating-0.5.0.tar.gz ; mv chukwa-incubating-0.5.0 /usr/chukwa

   需要在每一个被监控(需要采集数据信息)的节点上保持Chukwa的一个副本,每一个节点都将会运行一个collector。可在配置完成后通过scp命令复制到集群各个节点上。


5.3 配置Chukwa


5.3.1 配置环境变量


   编辑/etc/profile,添加以下语句:

# set chukwa path
export CHUKWA_HOME=/usr/chukwa
export CHUKWA_CONF_DIR=/usr/chukwa/etc/chukwa
export PATH=$PATH:$CHUKWA_HOME/bin:$CHUKWA_HOME/sbin:$CHUKWA_CONF_DIR


5.3.2 配置Hadoop和HBase集群


首先将Chukwa的文件复制到hadoop中:

mv $HADOOP_HOME/conf/log4j.properties $HADOOP_HOME/conf/log4j.properties.bak
mv $HADOOP_HOME/conf/hadoop-metrics2.properties $HADOOP_HOME/conf/hadoop-metrics2.properties.bak
cp $CHUKWA_CONF_DIR/hadoop-log4j.properties $HADOOP_HOME/conf/log4j.properties
cp $CHUKWA_CONF_DIR/hadoop-metrics2.properties $HADOOP_HOME/conf/hadoop-metrics2.properties
cp $CHUKWA_HOME/share/chukwa/chukwa-0.5.0-client.jar $HADOOP_HOME/lib
cp $CHUKWA_HOME/share/chukwa/lib/json-simple-1.1.jar $HADOOP_HOME/lib


然后启动HBase集群,进行HBase设置,在HBase中创建数据存储所需要的表,表的模式已经建好只需要通过hbase shell导入即可:

bin/hbase shell < $CHUKWA_CONF_DIR/hbase.schema


5.3.3 配置Collector


设置Chukwa的环境变量,编辑$CHUKWA_CONF_DIR/chukwa-env.sh文件:

export JAVA_HOME=/usr/java/jdk1.7.0_45

#export HBASE_CONF_DIR="${HBASE_CONF_DIR}"

#export HADOOP_CONF_DIR="${HADOOP_CONF_DIR}"

#export CHUKWA_LOG_DIR=/tmp/chukwa/log

#export CHUKWA_DATA_DIR="${CHUKWA_HOME}/data"


注解:设置好第一条java的主目录,注释掉后面四条。注释点HBASE_CONF_DIR以及HADOOP_CONF_DIR,因为 agent 仅仅是用来收集数据,所以不需要 HADOOP 的参与。注释掉CHUKWA_PID_DIR,CHUKWA_LOG_DIR,如果不注释的话,那么他指定的位置是在 /tmp 临时目录下,这会导致,PID 和 LOG 文件被无故删除。会在后续的操作中导致异常。注释之后,系统会使用默认路径,默认会在 Chukwa 安装目录下创建 PID 和 LOG 文件。


当需要多台机器作为收集器时,需要编辑$CHUKWA_CONF_DIR/collectors文件:

192.168.56.1
192.168.56.101
192.168.56.102
192.168.56.103
192.168.56.104


$CHUKWA_CONF_DIR/initial_Adaptors文件主要用于设置Chukwa监控哪些日志,以及什么方式、什么频率来监控等。使用默认配置即可,如下
add sigar.SystemMetrics SystemMetrics 60 0
add SocketAdaptor HadoopMetrics 9095 0
add SocketAdaptor Hadoop 9096 0
add SocketAdaptor ChukwaMetrics 9097 0
add SocketAdaptor JobSummary 9098 0


$CHUKWA_CONF_DIR/chukwa-collector-conf.xml维护了Chukwa的基本配置信息。我们需要通过该文件制定HDFS的位置:如下:
<property>
   <name>writer.hdfs.filesystem</name>
   <value>hdfs://192.168.56.1:9000/</value>
   <description>HDFS to dump to</description>
</property>

然后可以通过下面的设置来指定sink data的地址:

<property>
   <name>chukwaCollector.outputDir</name>
   <value>/chukwa/logs/</value>
   <description>chukwa data sink directory</description>
</property>
<property>
   <name>chukwaCollector.http.port</name>
   <value>8080</value>
   <description>The HTTP port number the collector will listen on</description>
</property>

注解:/chukwa/logs/ 就是它在HDFS中的地址。在默认情况下,Collector监听8080端口,不过这是可以修改的,各个Agent将会向该端口发消息。


5.3.4 配置Agent


编辑$CHUKWA_CONF_DIR/agents文件:

192.168.56.1
192.168.56.101
192.168.56.102
192.168.56.103
192.168.56.104


$CHUKWA_CONF_DIR/chukwa-agent-conf.xml文件维护了代理的基本配置信息,其中最重要的属性是集群名,用于表示被监控的节点,这个值被存储在每一个被收集到的块中,用于区分不同的集群,如设置cluster名称:cluster="chukwa"

<property>
   <name>chukwaAgent.tags</name>
   <value>cluster="chukwa"</value>
   <description>The cluster's name for this agent</description>
 </property>

chukwaAgent.checkpoint.dir,这个目录是Chukwa运行的Adapter的定期检查点,是不可共享的目录,并且只能是本地目录,不能是网络文件系统目录:

<property>
   <name>chukwaAgent.checkpoint.dir</name>
   <value>${CHUKWA_LOG_DIR}/</value>
   <description>the location to put the agent's checkpoint file(s)</description>
 </property>


5.4 Pig数据分析工具的安装和配置


Pig 是一种探索大规模数据集的脚本语言,是 Hadoop 项目的一个拓展项目, 用以简化 Hadoop 编程(简化的程度超乎想象啊),并且提供一个更高层次抽象的数据处理能力,同时能够保持 Hadoop 的简单和可靠性。Pig 是在 HDFS 和 MapReduce 之上的数据流处理语言,它将数据流处理翻译成多个 map 和 reduce 函数,提供更高层次的抽象将程序员从具体的编程中解放出来。

Pig 包括两部分:

  1. 用于描述数据流的语言,称为 Pig Latin;

  2. 和用于运行 Pig Latin 程序的执行环境;


5.4.1 安装


Pig 有两种安装模式。一种是 local 模式,实际就是单机模式,Pig 只能访问本地一台主机,没有分布式,甚至可以不用安装 Hadoop,所有的命令执行和文件读写都在本地进行,常用于作业实验。另一种是 MapReduce 模式,这种模式才是实际应用中的工作模式,它可以将文件上传到 HDFS 系统中,在使用 Pig Latin 语言运行作业时,可以将作业分布在 Hadoop 集群中完成,这也体现了 MapReduce 的思想,这样我们通过 Pig 客户端连接 Hadoop 集群进行数据管理和分析工作。以下为MapReduce安装模式,也是本文所需要的模式。


下载并解压Pig的稳定版本(考虑到与Hadoop等的兼容性),重命名并移动到/usr目录即完成安装。

ps:只需要在master上安装。


5.4.2 配置


编辑/etc/profile:

# set pig path
export PIG_HOME=/usr/pig
export PATH=$PATH:$PIG_HOME/bin
export PIG_CLASSPATH=$HADOOP_CONF_DIR:$HBASE_CONF_DIR



5.4.3 与Hadoop、HBase结合


创建HBASE_CONF_DIR的jar文件:
jar cf $CHUKWA_HOME/hbase-env.jar $HBASE_CONF_DIR


创建周期性运行的分析脚本作业:每隔十分钟执行一次

echo "*/10 * * * * pig -Dpig.additional.jars=${HBASE_HOME}/hbase-0.96.1.1.jar:${HBASE_HOME}/lib/zookeeper-3.4.5.jar:${PIG_HOME}/pig-0.12.0.jar:${CHUKWA_HOME}/hbase-env.jar ${CHUKWA_HOME}/script/pig/ClusterSummary.pig > /dev/null 2&1" >> /etc/crontab


5.5 向集群其他节点复制Chukwa,并配置各个节点的环境变量


scp -r /usrchukwa 节点ip:/usr


5.6 运行Chukwa


重启Hadoop和HBase,然后在单个节点(如Hadoop集群的master节点)上:

启动colletor:start-collectors.sh  启动所有注册在collectors文件中的节点

停止collector:stop-agents.sh       停止所有注册在 collectors 文件中的 Collector

启动agent:start-agents.sh          启动所有注册在agents文件中的节点

停止agent:stop-agents.sh            停止所有注册在 agents 文件中的 Agent

启动HICC:chukwa hicc

启动后可以通过浏览器进行访问:http://<Server>:<port>/hicc
port默认是4080;
默认用户名和密码是:admin
可以根据需要对$CHUKWA_HOME/webapps/hicc.war文件中的/WEB_INF/下的jetty.xml进行修改


启动过程总结:

1)启动Hadoop和HBase
2)启动Chukwa:sbin/start-chukwa.sh
3)启动HICC:bin/chukwa hicc


5.7 问题解决


运行chukwa collector出现:

cat /root/share/chukwa/VERSION: No such file or directory

解决:编辑$CHUKWA_HOME/libexec/chukwa-config.sh文件

修改第30 31行
# the root of the Chukwa installation
export CHUKWA_HOME=`pwd -P ${CHUKWA_LIBEXEC}/..`
为:
# the root of the Chukwa installation
export CHUKWA_HOME=/usr/chukwa
其中/usr/chukwa为chukwa实际安装路径


5.8 基本命令介绍


bin/chukwa  agent  启动本地 agent

bin/chukwa  agent stop 关闭本地 agent

bin/chukwa  collector 启动本地 collector

bin/chukwa  collector stop 关闭本地 collector

bin/chukwa  archive 定时运行 archive,将文件整理成 Sequence File. 并且会去除重复内容。

bin/chukwa  archive stop 停止运行 archive
bin/chukwa  demux 启动 demux 管理器,相当于启动了一个 M/R Job. 默认情况是 TsProcessor. 我们也可以自己定义自己的数据处理模块,稍后提到。

bin/chukwa  demux stop 停止 demux 管理器

bin/chukwa  dp 启动 demux post processor 用于定时排序,归并文件,剔除冗余数据。

bin/chukwa  dp stop 停止 dp 运行

bin/chukwa  hicc hicc类似一个 portal,将数据以图形的方式展现出来。

slaves.sh

slaves.sh 命令 , 很有用,尤其是当你有很多节点的时候,比如有 50 个节点,想要给每个节点下创建一个目录 abc 怎么办呢。如果一个一个去机器上创建,那就太繁琐了。幸好,有它可以帮我们,bin/slaves.sh mkdir /home/hadoop/abc. 它就会帮我们在各个节点上创建对应的目录。

start-agents.sh

该命令会启动所有注册在 agents 文件中的 Agent

start-collectors.sh

该命令会启动所有注册在 collectors 文件中的 Collector

stop-agents.sh

该命令会停止所有注册在 agents 文件中的 Agent

stop-collectors.sh

该命令会停止所有注册在 collectors 文件中的 Collector

start-data-processors.sh

该命令是以下三个命令的组合:

bin/chukwa archive

bin/demux

bin/dp

他会将这三个命令依次启动,不用自己一个一个启动。

stop-data-processors.sh

依次停止 archive/demux/dp 三个服务


6 总结


本文介绍了Chukwa集群的搭建,包括数据分析工具Pig的安装和配置。Chukwa设计理念很简单,结构清晰易懂,而且是开源的产品,我们可以在它的基础之上构建自己更加强大的功能。这是后续需要努力的。

                                                                                                                       ——RangoChen