本文是对Linkedin-Camus的介绍。内容都是从Camus的github中摘取出来的,详细的内容要看其说明和源码
Introduction of Camus
Camus是Linkedin开源的一个从Kafka到HDFS的数据管道,实际上它是一个MapReduce作业
What is Avro
Apache Avro是一个 Data Serialization System,数据序列化系统。
Camus使用了Avro Schema
Camus Stage
Camus作业有三个阶段
- Setup Stage:从Kafka的Zookeeper获取可用的topics,partitions,offset等元信息(Metadata)
- Hadoop Job Stage:开始用若干个task执行topic的数据获取,并写到HDFS
- Cleanup Stage:
Hadoop Stage
- Pulling the data:根据Setup Stage的数据建立Kafka请求,拉取数据。每个task都生成4个文件:Avro data files,Count statistics files,Updated offset files,Error files
- Committing the data:当一个task完成时,其拉取的数据都被提交到output目录
- Storing the offset:每个partition都有offset,这些offset信息存储在HDFS中
Installation
下载源码后,
<code class="hljs actionscript" style="display: block; padding: 0.5em; background: rgb(35, 36, 31); color: rgb(248, 248, 242); font-family: "Source Code Pro", monospace; outline: none !important;">mvn clean <span class="hljs-package" style="outline: none !important;"><span class="hljs-keyword" style="color: rgb(249, 38, 114); outline: none !important;">package</span>
</span></code>
Create Custom Decoder for Kafka Messages
需要自己创建一个Kafka message的Decoder,可以通过实现com.linkedin.batch.etl.kafka.coders.KafkaMessageDecoder
该抽象类。
在Camus的配置中需要指定我们实现的Decoder类
Camus默认将Avro文件写入到HDFS,我们也可以实现自己的写入方法,并通过
etl.record.writer.provider.class=
来配置
Configuration
运行Camus作业前需要进行一系列的配置,可以参考Camus Example的配置
Run Camus
直接做为Hadoop的作业运行即可
<code class="hljs stylus" style="display: block; padding: 0.5em; background: rgb(35, 36, 31); color: rgb(248, 248, 242); font-family: "Source Code Pro", monospace; outline: none !important;">hadoop jar camus-example-<version>-SNAPSHOT<span class="hljs-class" style="outline: none !important;">.jar</span> com<span class="hljs-class" style="outline: none !important;">.linkedin</span><span class="hljs-class" style="outline: none !important;">.camus</span><span class="hljs-class" style="outline: none !important;">.etl</span><span class="hljs-class" style="outline: none !important;">.kafka</span><span class="hljs-class" style="outline: none !important;">.CamusJob</span>
-D <property=value> use value <span class="hljs-keyword" style="color: rgb(249, 38, 114); outline: none !important;">for</span> given property<br/>
-P <arg> external properties filename<br/>
-<span class="hljs-tag" style="color: rgb(0, 102, 102); outline: none !important;">p</span> <arg> properties filename from the classpath<br/>
</code>
Conclusion
Camus就像一个已经开发好的系统组件,我们可以直接拿过来,稍作配置就可以嵌入到自己的系统中,作为从Kafka到HDFS的数据管道。
关键在于实现两个类,Decoder和Writer,使其满足我们的系统业务