Apache的开源项目 hadoop,作为一个分布式存储和计算系统,已经被业界广泛应用。很多大型企业都有了各自基于 hadoop的应用和相关扩展。当 1000+以上个节点的 hadoop集群变得常见时,集群自身的相关信息如何收集和分析呢?针对这个问题, Apache同样提出了相应的解决方案,那就是 chukwa。
概述
chukwa 的官方网站是这样描述自己的: chukwa是一个开源的用于监控大型分布式系统的数据收集系统。这是构建在 hadoop的 hdfs和 map/reduce框架之上的,继承了 hadoop的可伸缩性和鲁棒性。Chukwa还包含了一个强大和灵活的工具集,可用于展示、监控和分析已收集的数据。
在一些网站上,甚至声称 chukwa是一个“日志处理/分析的full stack solution”。
说了这么多,你心动了吗?
我们先来看看 chukwa是什么样子的:
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 都提供了近乎完美的解决方案,这一点也可以从它的架构中看出来.
chukwa 是什么
上一节说了很多 chukwa不是什么,下面来看下 chukwa 具体是干什么的一个系统呢?
具体而言, chukwa致力于以下几个方面的工作:
1. 总体而言, chukwa可以用于监控大规模(2000+以上的节点,每天产生数据量在T级别) hadoop 集群的整体运行情况并对它们的日志进行分析
2. 对于集群的用户而言: chukwa展示他们的作业已经运行了多久,占用了多少资源,还有多少资源可用,一个作业是为什么失败了,一个读写操作在哪个节点出了问题.
3. 对于集群的运维工程师而言: chukwa展示了集群中的硬件错误,集群的性能变化,集群的资源瓶颈在哪里.
4. 对于集群的管理者而言: chukwa展示了集群的资源消耗情况,集群的整体作业执行情况,可以用以辅助预算和集群资源协调.
5. 对于集群的开发者而言: chukwa展示了集群中主要的性能瓶颈,经常出现的错误,从而可以着力重点解决重要问题.
基本架构
有了一个感性的认识后,我们来看下它的构架, chukwa 的整体结构图是下面这个样子的:
其中主要的部件为:
1. agents : 负责采集最原始的数据,并发送给 collectors
2. adaptor : 直接采集数据的接口和工具,一个 agent 可以管理多个 adaptor的数据采集
3. collectors 负责收集 agents收送来的数据,并定时写入集群中
4. map/reduce jobs 定时启动,负责把集群中的数据分类、排序、去重和合并
5. HICC 负责数据的展示
相关设计
adaptors 和 agents
在每个数据的产生端(基本上是集群中每一个节点上), chukwa 使用一个 agent来采集它感兴趣的数据,每一类数据通过一个 adaptor 来实现,数据的类型(DataType?)在相应的配置中指定.默认地, chukwa对以下常见的数据来源已经提供了相应的 adaptor:命令行输出、log文件和 httpSender等等.这些 adaptor会定期运行(比如每分钟读一次 df 的结果)或事件驱动地执行(比如 kernel 打了一条错误日志).如果这些 adaptor还不够用,用户也可以方便地自己实现一个 adaptor来满足需求。
为防止数据采集端的 agent出现故障,chukwa的 agent采用了所谓的 ‘watchdog’机制,会自动重启终止的数据采集进程,防止原始数据的丢失。
另一方面,对于重复采集的数据,在 chukwa的数据处理过程中,会自动对它们进行去重.这样,就可以对于关键的数据在多台机器上部署相同的 agent,从而实现容错的功能.
collectors
agents 采集到的数据,是存储到 hadoop 集群上的. hadoop集群擅长于处理少量大文件,而对于大量小文件的处理则不是它的强项,针对这一点,chukwa设计了 collector这个角色,用于把数据先进行部分合并,再写入集群,防止大量小文件的写入。
另一方面,为防止 collector 成为性能瓶颈或成为单点,产生故障, chukwa 允许和鼓励设置多个 collector, agents随机地从 collectors列表中选择一个 collector传输数据,如果一个 collector 失败或繁忙,就换下一个 collector. 从而可以实现负载的均衡,实践证明,多个 collector 的负载几乎是平均的.
demux 和 archive
放在集群上的数据,是通过 map/reduce 作业来实现数据分析的.在 map/reduce阶段, chukwa提供了 demux和 archive任务两种内置的作业类型.
demux 作业负责对数据的分类、排序和去重.在 agent一节中,我们提到了数据类型(DataType?)的概念.由 collector 写入集群中的数据,都有自己的类型. demux 作业在执行过程中,通过数据类型和配置文件中指定的数据处理类,执行相应的数据分析工作,一般是把非结构化的数据结构化,抽取中其中的数据属性.由于 demux 的本质是一个 map/reduce作业,所以我们可以根据自己的需求制定自己的 demux 作业,进行各种复杂的逻辑分析. chukwa 提供的 demux interface可以用 java语言来方便地扩展.
而 archive作业则负责把同类型的数据文件合并,一方面保证了同一类的数据都在一起,便于进一步分析,另一方面减少文件数量,减轻 hadoop集群的存储压力。
dbadmin
放在集群上的数据,虽然可以满足数据的长期存储和大数据量计算需求,但是不便于展示.为此, chukwa 做了两方面的努力:
1. 使用 mdl语言,把集群上的数据抽取到 mysql 数据库中,对近一周的数据,完整保存,超过一周的数据,按数据离现在的时间长短作稀释,离现在越久的数据,所保存的数据时间间隔越长.通过 mysql 来作数据源,展示数据.
2. 使用 hbase或类似的技术,直接把索引化的数据在存储在集群上
到 chukwa 0.4.0版本为止, chukwa都是用的第一种方法,但是第二种方法更优雅也更方便一些.
hicc
hicc 是 chukwa的数据展示端的名字.在展示端, chukwa 提供了一些默认的数据展示 widget,可以使用“列表”、“曲线图”、“多曲线图”、“柱状图”、“面积图式展示一类或多类数据,给用户直观的数据趋势展示。而且,在 hicc 展示端,对不断生成的新数据和历史数据,采用 robin策略,防止数据的不断增长增大服务器压力,并对数据在时间轴上“稀释”,可以提供长时间段的数据展示
从本质上, hicc是用 jetty来实现的一个 web服务端,内部用的是 jsp 技术和 javascript技术.各种需要展示的数据类型和页面的局都可以通过简直地拖拽方式来实现,更复杂的数据展示方式,可以使用 sql 语言组合出各种需要的数据.如果这样还不能满足需求,不用怕,动手修改它的 jsp 代码就可以了.
其它数据接口
如果对原始数据还有新的需要,用户还可以通过 map/reduce作业或 pig语言直接访问集群上的原始数据,以生成所需要的结果。chukwa还提供了命令行的接口,可以直接访问到集群上数据。
默认数据支持
对于集群各节点的cpu使用率、内存使用率、硬盘使用率、集群整体的 cpu 平均使用率、集群整体的内存使用率、集群整体的存储使用率、集群文件数变化、作业数变化等等 hadoop相关数据,从采集到展示的一整套流程, chukwa 都提供了内建的支持,只需要配置一下就可以使用.可以说是相当方便的.
可以看出,chukwa从数据的产生、收集、存储、分析到展示的整个生命周期都提供了全面的支持。