数据采集模块——Flume消费Kafka数据写入到HDFS

一、项目背景

1. 实时数据写入到 Kafka topic 中,经 Flume 批量采集到 HDFS 上。数据格式为标准 JSON 格式(不包含嵌套 JSON)。

2. 测试环境模拟数据的采集过程。测试集群为 第三方公司 基于当前主流开源组件自主研发并搭建的大数据平台,包含常用组件:HDFS,MapReduce,Yarn,Hive,HBase,Phoenix,Zookeeper,Spark,Impala,Flume,Sqoop,Kafka,Solr,Oozie,Hue,Redis
等。

3. 通过组件的使用,零编程。

以下过程记录本次模拟采集过程,包括操作步骤、所遇问题等。

二、创建模拟数据

创建 JSON 格式数据,通过 Kafka 自带的 producer 将数据写入到 topic 中,以备 Flume 消费。

{"gatheringTime":"2016-03-24","status":"有效","speed":"0.0 km/h","distance":"6000 km"}
{"gatheringTime":"2017-04-24","status":"无效","speed":"0.0 km/h","distance":"7000 km"}
{"gatheringTime":"2018-04-24","status":"有效","speed":"0.0 km/h","distance":"8000 km"}
{"gatheringTime":"2019-04-24","status":"无效","speed":"0.0 km/h","distance":"9000 km"}
{"gatheringTime":"2020-04-24","status":"有效","speed":"0.0 km/h","distance":"10000 km"}
{"gatheringTime":"2020-05-25","status":"有效","speed":"0.0 km/h","distance":"12000 km"}
{"gatheringTime":"2021-05-25","status":"有效","speed":"0.0 km/h","distance":"12000 km"}
{"gatheringTime":"2022-05-25","status":"有效","speed":"0.0 km/h","distance":"12000 km"}
{"gatheringTime":"2023-05-25","status":"有效","speed":"0.0 km/h","distance":"12000 km"}
{"gatheringTime":"2024-05-25","status":"有效","speed":"0.0 km/h","distance":"12000 km"}

三、Kafka生产数据

因为是模拟真实场景,所以此处通过 kafka-console-producer 将上面的测试数据写入到 topic 中。

本测试环境为第三方提供,有 root 账号和权限,但没有集群管理界面权限,所以一些配置文件的位置需要自己找,包括软件版本号,本次内容会有部分介绍。

3.1 Kafka版本

Kafka 没有提供 version 命令,不确定是否有方便的方法,但你可以进入 kafka/libs 文件夹。可以看到像 kafka_2.10-0.8.2-beta.jar 这样的 jar 包,其中 2.10 是 Scala 版本,0.8.2-beta 是 Kafka 版本。

whereis kafka 
# 看到kafka所在目录 /usr/lib/kafka/  /etc/kafka

ls /usr/lib/kafka/libs/
可以看到 jar 包:kafka_2.11-2.1.0.jar,即可确定 kafka 的版本为 2.1.0

# 后面启动 flume-ng agent 时页面打印出的日志也可以看到 kafka 版本
Kafka version : 2.1.0

3.2 创建 topic 、生产数据

1. 创建 Kafka topic —— testTopic

kafka-topics --create --zookeeper node1:2181, node2:2181, node3:2181 --replication-factor 3 --partitions 1 --topic testTopic
# 副本数 3 个,分区数 1 个(当前数据量少)

2. 启动 Kafka 生产者(kafka-console-producer),向 testTopic 中写入数据

kafka-console-producer --broker-list node1:6667, node2:6667, node3:6667 --topic testTopic
# 注意此时的端口号 6667,很多配置的是 9020,是根据配置文件 server.properties(cat  /etc/kafka/conf/server.properties)中的监听地址和端口号而来的
# 此时,直接将上面的测试数据 copy 过来粘贴即可写入

3. 查看测试数据是否写入成功(使用自带的 kafka-console-consumer)

kafka-console-consumer --bootstrap-server node1:6667, node2:6667, node3:6667 --topic testTopic --from-beginning
# 当前页面会打印出上面的测试 json 数据,表明写入成功

四、Flume 采集 Kafka 数据写入到 HDFS

4.1 Flume 版本

flume-ng version
# Flume 1.9.0

4.2 添加配置文件 kafka2hdfs.properties

# 1.查看flume位置(包括配置文件)
whereis flume-ng

# /usr/lib/flume-ng/ /etc/flume-ng

# 2.拷贝配置文件(启动flume agent时指定文件位置,所以自主决定放在哪个位置,本文放在flume自带的配置文件模板的位置,如下:)
cd /usr/lib/flume-ng/conf

cp flume-conf.properties.template kafka2hdfs.properties

# 3.修改配置文件
vi kafka2hdfs.properties

------------------------------------------------------------------------------

# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'a1'

### Name agent, source, channels and sink alias
a1.sources = s1  
a1.channels = c1  
a1.sinks = k1  

### define kafka source
a1.sources.s1.type = org.apache.flume.source.kafka.KafkaSource 
  
# Maximum number of messages written to Channel in one batch
a1.sources.s1.batchSize = 5000  

# Maximum time (in ms) before a batch will be written to Channel The batch will be written whenever the first of size and time will be reached.
a1.sources.s1.batchDurationMillis = 2000 
 
# set kafka broker address 
a1.sources.s1.kafka.bootstrap.servers = node1:6667, node2:6667, node3:6667 

# set kafka consumer group Id and offset consume 
# 官网推荐1.9.0版本只设置了topic,但测试后不能正常消费,需要添加消费组id(自己写一个),并定义偏移量消费方式
a1.sources.s1.kafka.consumer.group.id = kafka2flume
a1.sources.s1.kafka.consumer.auto.offset.reset = earliest

# set kafka topic
a1.sources.s1.kafka.topics = testTopic 


### defind hdfs sink
a1.sinks.k1.type = hdfs 
# set store hdfs path
a1.sinks.k1.hdfs.path = hdfs://node1:8020/data/flume/kafka/%Y-%m-%d
# set file size to trigger roll
a1.sinks.k1.hdfs.rollSize = 0  
a1.sinks.k1.hdfs.rollCount = 0  
a1.sinks.k1.hdfs.rollInterval = 3600  
a1.sinks.k1.hdfs.threadsPoolSize = 30
a1.sinks.k1.hdfs.fileType=DataStream    
a1.sinks.k1.hdfs.writeFormat=Text    


### define channel from kafka source to hdfs sink 
# memoryChannel:快速,但是当设备断电,数据会丢失
# FileChannel:速度较慢,即使设备断电,数据也不会丢失
a1.channels.c1.type = file 
# 这里不单独设置checkpointDir和dataDirs文件位置,参考官网不设置会有默认位置
# channel store size
a1.channels.c1.capacity = 100000
# transaction size
a1.channels.c1.transactionCapacity = 10000


### 绑定source、channel和sink
a1.sources.s1.channels = c1   
a1.sinks.k1.channel = c1

4.3 启动 Flume agent,消费 Kafka 数据

1. 启动 Flume agent

flume-ng agent -n a1 --conf /etc/flume-ng/conf/ -f /usr/lib/flume-ng/conf/kafka2hdfs.properties
# --conf /etc/flume-ng/conf/ 系统flume的配置文件位置(通过whereis flume找到)

2. 报错如下:
Failed to start agent because dependencies were not found in classpath. Error follows. java.lang.NoClassDefFoundError: org/apache/hadoop/io/SequenceFile$CompressionType

百度一下,发现缺少 hadoop jar 包,去 /lib/hadoop/ 目录下找到 hadoop-common-3.1.1.jar,将该 jar 包拷贝到 flume/lib 目录下

cp /lib/hadoop/hadoop-common-3.1.1.jar /lib/flume-ng/lib/
# 不同大数据平台jar包所在位置有所不同,需要自找

3. 再次启动 flume agent,依然报错,仍是缺少 jar 包

# 报错2:

[ERROR - org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:459)] process failed
java.lang.NoClassDefFoundError: com/ctc/wstx/io/InputBootstrapper

# 报错3:

java.lang.NoClassDefFoundError: org/apache/hadoop/util/PlatformName

再次百度,将 hadoop 下面的所有 jar 包拷贝到 flume/lib 目录下,即可启动 flume agent。

4.4 查看 HDFS 文件是否生成

hadoop fs -du -h /data/flume/kafka/2020-03-26

22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645110
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645111
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645112
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645113
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645114
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645115
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645116
22.1 K  66.4 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645117
8.4 K   25.2 K  /data/flume/kafka/2020-03-26/FlumeData.1585214645118

可以看到 HDFS 目标路径下(/data/flume/kafka/2020-03-26)生成了多个小文件,表明数据采集成功。

你可能感兴趣的:(kafka,Flume,kafka,flume,hdfs,大数据)