公司hadoop集群有几百台了,对整体集群的计算能力还需要有个总体的掌握,每天有多少job计算,占用slot,MR有多少,哪些任务比较占用时间,需要放到比较空闲的时间计算等。。任务来了,我们该怎么办呢?由于公司集群大部分运行在hadoop 1.x上,在hadoop 1.x里job都是在jobtracker里进行分配,所以,可以对jt进行日志采集,然后对日志进行分析即可得到集群的任务分配,运行情况了。为什么不在jt上直接分析任务呢?当然jt很忙的,最好不要再占用他的资源,而且,将日志放到hdfs里,还可以用hadoop集群的运算能力进行分析,这样,一举两得。在本文里,采用flume进行数据采集,现在介绍flume。
Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。并且,Flume直接各种格式的输入。
Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统,支持TCP和UDP等2种模式),exec(命令执行)等数据源上收集数据的能力,在我们的系统中目前使用exec方式进行日志采集。
Flume的数据接受方,可以是console(控制台)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP syslog日志系统)等。
在本文方案里,就是将日志jt Log通过Flume传送到HDFS进行存储。接下来就开始讲解,Flume的基本概念及安装设置。
flume的一些核心概念:
Agent 使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。
Client 生产数据,运行在一个独立的线程。
Source 从Client收集数据,传递给Channel。
Sink 从Channel收集数据,运行在一个独立线程。
Channel 连接 sources 和 sinks ,这个有点像一个队列。
Events 可以是日志记录、 avro 对象等。
简而言之,Flume可以有采集,队列,接受等功能。理论了解了,接下来进行Flume的安装。
首先抓取安装文件
wget http://mirror.bit.edu.cn/apache/flume/stable/apache-flume-1.6.0-bin.tar.gz
解压
tar zxf apache-flume-1.6.0-bin.tar.gz
进行flume的env设置。
flume-env.sh
JAVA_HOME=/usr/java/default
将java_home设置正确即可。
接下来,要进行日志入hdfs的实践。首先要在一台比较空闲的服务器上配置并运行flume服务端。功能就是监听某个端口,然后将接收的日志放到hdfs里。
安装步骤和初步设置如前所述。然后配置flume-conf.properties .在本配置里,用memory做队列。监听的端口是41414.将avro格式的日志放到hdfs里的
/tmp/wtest里。
a1.channels.c1.type = memory
# Define an Avro source called r1 on a1 and tell it
# to bind to 0.0.0.0:41414. Connect it to channel c1.
a1.sources.r1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 41414
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://namenode:9000/tmp/wtest
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.rollSize = 0
a1.sinks.k1.hdfs.rollInterval= 0
a1.sinks.k1.hdfs.rollCount = 600000
a1.sinks.k1.hdfs.rollInterval = 600
配置完毕后,运行flume服务端。
bin/flume-ng agent --conf ./conf/ -f conf/flume-conf.properties -Dflume.root.logger=DEBUG,console -n a1
运行后,输出信息如下。
unterGroup.start(MonitoredCounterGroup.java:96)] Component type: CHANNEL, name: c1 started
2015-07-22 17:58:58,616 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:173)] Starting Sink k1
2015-07-22 17:58:58,617 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:184)] Starting Source r1
2015-07-22 17:58:58,618 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.source.AvroSource.start(AvroSource.java:228)] Starting Avro source r1: { bindAddress: 0.0.0.0, port: 41414 }...
2015-07-22 17:58:58,620 (lifecycleSupervisor-1-1) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.register(MonitoredCounterGroup.java:120)] Monitored counter group for type: SINK, name: k1: Successfully registered new MBean.
2015-07-22 17:58:58,621 (lifecycleSupervisor-1-1) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.start(MonitoredCounterGroup.java:96)] Component type: SINK, name: k1 started
2015-07-22 17:58:58,627 (SinkRunner-PollingRunner-DefaultSinkProcessor) [DEBUG - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:143)] Polling sink runner starting
2015-07-22 17:58:59,453 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.register(MonitoredCounterGroup.java:120)] Monitored counter group for type: SOURCE, name: r1: Successfully registered new MBean.
说明服务端已经开始运行。
接下来,就很简单的日志采集了,运行flume,将日志向服务端发送即可。
在jobtracker机器上,如上所述,安装完毕flume,然后修改flume-env.sh。找到jobtracker的日志,开始发送 3 2 1
bin/flume-ng avro-client --conf conf -H 服务端host -p 41414 -F /opt/log/hadoop/mapred/hadoop-mapred-jobtracker-jobtracker.log -Dflume.root.logger=DEBUG,console
输出如下:
64:/lib:/usr/lib org.apache.flume.client.avro.AvroCLIClient -H node-128-188 -p 41414 -F /opt/log/hadoop/mapred/hadoop-mapred-jobtracker-jobtracker.log
2015-07-22 18:08:52,897 (main) [DEBUG - org.apache.flume.api.NettyAvroRpcClient.configure(NettyAvroRpcClient.java:499)] Batch size string = 5
2015-07-22 18:08:52,930 (main) [WARN - org.apache.flume.api.NettyAvroRpcClient.configure(NettyAvroRpcClient.java:634)] Using default maxIOWorkers
2015-07-22 18:08:58,711 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.run(AvroCLIClient.java:225)] Packed 1274441 bytes, 8141 events
2015-07-22 18:09:03,707 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.run(AvroCLIClient.java:225)] Packed 4776580 bytes, 30081 events
2015-07-22 18:09:08,707 (main) [DEBUG - org.apache.flume.client.avro.AvroCLIClient.run(AvroCLIClient.java:225)] Packed 9969363 bytes, 62806 events
搞定。日志已经发送到HDFS上,接下来,讲如何进行分析达到对集群任务的掌握。