业务描述:
最近项目中需要实时采集业务数据库CDC数据(这里数据已被序列化为avro格式数据),这里技术架构我们采用了Flume+Hdfs。
了解Flume的朋友都知道它的组件分为三部分:source,channel,sink。具体原理部分这里就不再赘述,可查看官网或flume技术博客,这里具体讲一下实现流程及添坑之路。
业务过来的数据放在在kafka里,所以source端采用的是kafkaSource,说白了就是kafkaConsumer,sink选用的是hdfsSink,channel这里选的是file type。
hdfsSink写入文件格式有两种一是:Text File,二是Sequence File,不管选用哪种文件格式落地到hdfs后都不能直接使用,前面说到了业务数据已被序列化为avro格式,但需求是hdfs上的数据必须是直接可用的。
考虑了几种解决方式:
1,使用hive创建外部表关联hdfs上的数据,这里就有问题了,虽然hive支持读取seq文件格式,但我们这里seq文件里(hdfsSink使用Sequence File格式存储)的数据是avro的格式,我试着建表查询了一下,结果是乱码,text File也一样,这种方式就pass掉了。其实hive可以直接读取avro格式数据指定数据的schema就可以了,但是。。。我这个文件格式是行不通了,它可以自己实现接口序列化数据为avro格式。
2,使用API读avro数据,这种方式首先需要使用API读取seq文件数据然后再使用avro的API反序列化,根据hadoop指南书中hadoop IO那一章节中的demo,读取了seq文件的数据,然后去翻avro官网的API,发现其官