该项目主要作用是将kafka的数据通过MR作业上传到hdfs中,原项目地址https://github.com/michal-harish/kafka-hadoop-loader。由于该项目目前是无人维护状态,最后一次是13年9月,不适用于当前的kafka版本0.8.2.
在该项目的基础上,我进行了一些修改,项目地址:https://github.com/guanghualiu/kafka-hadoop-loader-my。
项目的大体思路:
kafka的simple consumer可以让消费者自己控制消费数据,以及自己维护每个partition的offset。
对于一个kafka的topic,可以拥有多个分区。利用hadoop的MR原理,重写InputFormat,将每一个分区虚拟化为一个inputsplit,每一个kafkainputspit记录topic,broker,partition,以及要当前partition在执行该程序时最新的offset值。每个split将会创建一个map任务,即map数等于partition数。
kafkaInputRecordReader中,首先从zookeeper中取到当前partition的上次已经消费的记录的offset(初始为零),
以kafkainputspit中的offset为结束值,然后在nextKeyValue中消费数据,reader中每消费一个message,更新watermark指针知道该split的数据全部消费完成。在close方法中,将该次的消费结果写入到zookeeper中,这样记录已经消费的offset,便于下次取出从该条开始消费。
之后就通过hadoop的MR框架将数据写入到hdfs,也可以自己重定义方法达到另外一些的目的。
这个程序的用法应该是每隔一段时间跑一次,就可以将kafka新增的数据入库hdfs。