使用Flume消费Kafka数据到HDFS

		<div id="cnblogs_post_body" class="blogpost-body"><h1>1.概述</h1>

对于数据的转发,Kafka是一个不错的选择。Kafka能够装载数据到消息队列,然后等待其他业务场景去消费这些数据,Kafka的应用接口API非常的丰富,支持各种存储介质,例如HDFS、HBase等。如果不想使用Kafka API编写代码去消费Kafka Topic,也是有组件可以去集成消费的。下面笔者将为大家介绍如何使用Flume快速消费Kafka Topic数据,然后将消费后的数据转发到HDFS上。

2.内容

在实现这套方案之间,可以先来看看整个数据的流向,如下图所示:

 

业务数据实时存储到Kafka集群,然后通过Flume Source组件实时去消费Kafka业务Topic获取数据,将消费后的数据通过Flume Sink组件发送到HDFS进行存储。

2.1 准备基础环境

按照上图所示数据流向方案,需要准备好Kafka、Flume、Hadoop(HDFS可用)等组件。

2.1.1 启动Kafka集群并创建Topic

Kafka目前来说,并没有一个批量的管理脚本,不过我们可以对kafka-server-start.sh脚本和kafka-server-stop.sh脚本进行二次封装。代码如下所示:

复制代码
#! /bin/bash

Kafka代理节点地址, 如果节点较多可以用一个文件来存储

hosts=(dn1 dn2 dn3)

打印启动分布式脚本信息

mill=<span style="color: #0000ff;">date</span> <span style="color: #800000;">"</span><span style="color: #800000;">+%N</span><span style="color: #800000;">"</span><span style="color: #000000;">
tdate=<span style="color: #0000ff;">date</span> <span style="color: #800000;">"</span><span style="color: #800000;">+%Y-%m-%d %H:%M:%S,${mill:0:3}</span><span style="color: #800000;">"</span><span style="color: #000000;">

echo [$tdate] INFO [Kafka Cluster] begins to execute the $1 operation.

执行分布式开启命令

function start()
{
for i in KaTeX parse error: Expected 'EOF', got '#' at position 47: … style="color: #̲0000ff;">do</sp…{smill:0:3}"`
ssh hadoop@KaTeX parse error: Expected 'EOF', got '#' at position 23: … style="color: #̲800000;">"</spa…stdate] INFO [Kafka Broker $i] begins to execute the startup operation.;kafka-server-start.sh $KAFKA_HOME/config/server.properties>/dev/null" &
sleep 1
done
}

执行分布式关闭命令

function stop()
{
for i in KaTeX parse error: Expected 'EOF', got '#' at position 47: … style="color: #̲0000ff;">do</sp…{smill:0:3}"`
ssh hadoop@KaTeX parse error: Expected 'EOF', got '#' at position 23: … style="color: #̲800000;">"</spa…stdate] INFO [Kafka Broker $i] begins to execute the shutdown operation.;kafka-server-stop.sh>/dev/null;" &
sleep 1
done
}

查看Kafka代理节点状态

function status()
{
for i in KaTeX parse error: Expected 'EOF', got '#' at position 47: … style="color: #̲0000ff;">do</sp…{smill:0:3}"`
ssh hadoop@KaTeX parse error: Expected 'EOF', got '#' at position 23: … style="color: #̲800000;">"</spa…stdate] INFO [Kafka Broker $i] status message is :;jps | grep Kafka;" &
sleep 1
done
}

判断输入的Kafka命令参数是否有效

case “$1” in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
echo “Usage: $0 {start|stop|status}”
RETVAL=1
esac

复制代码

启动Kafka集群后,在Kafka集群可用的情况下,创建一个业务Topic,执行命令如下:

# 创建一个flume_collector_data主题
kafka-topics.sh --create --zookeeper dn1:2181,dn2:2181,dn3:2181 --replication-factor 3 --partitions 6 --topic flume_collector_data

2.2 配置Flume Agent

然后,开始配置Flume Agent信息,让Flume从Kafka集群的flume_collector_data主题中读取数据,并将读取到的数据发送到HDFS中进行存储。配置内容如下:

复制代码
# ------------------- define data source ----------------------
# source alias
agent.sources = source_from_kafka  
# channels alias
agent.channels = mem_channel  
# sink alias
agent.sinks = hdfs_sink  

define kafka source

agent.sources.source_from_kafka.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.source_from_kafka.channels = mem_channel
agent.sources.source_from_kafka.batchSize = 5000

set kafka broker address

agent.sources.source_from_kafka.kafka.bootstrap.servers = dn1:9092,dn2:9092,dn3:9092

set kafka topic

agent.sources.source_from_kafka.kafka.topics = flume_collector_data

set kafka groupid

agent.sources.source_from_kafka.kafka.consumer.group.id = flume_test_id

defind hdfs sink

agent.sinks.hdfs_sink.type = hdfs

specify the channel the sink should use

agent.sinks.hdfs_sink.channel = mem_channel

set store hdfs path

agent.sinks.hdfs_sink.hdfs.path = /data/flume/kafka/%Y%m%d

set file size to trigger roll

agent.sinks.hdfs_sink.hdfs.rollSize = 0
agent.sinks.hdfs_sink.hdfs.rollCount = 0
agent.sinks.hdfs_sink.hdfs.rollInterval = 3600
agent.sinks.hdfs_sink.hdfs.threadsPoolSize = 30
agent.sinks.hdfs_sink.hdfs.fileType=DataStream
agent.sinks.hdfs_sink.hdfs.writeFormat=Text

define channel from kafka source to hdfs sink

agent.channels.mem_channel.type = memory

channel store size

agent.channels.mem_channel.capacity = 100000

transaction size

agent.channels.mem_channel.transactionCapacity = 10000

复制代码

然后,启动Flume Agent,执行命令如下:

# 在Linux后台执行命令
flume-ng agent -n agent -f $FLUME_HOME/conf/kafka2hdfs.properties &

2.3 向Kafka主题中发送数据

启动Kafka Eagle监控系统(执行ke.sh start命令),填写发送数据。如下图所示:

然后,查询Topic中的数据是否有被写入,如下图所示:

 

最后,到HDFS对应的路径查看Flume传输的数据,结果如下图所示:

3.Kafka如何通过Flume传输数据到HBase

3.1 创建新主题

创建一个新的Topic,执行命令如下:

# 创建一个flume_kafka_to_hbase主题
kafka-topics.sh --create --zookeeper dn1:2181,dn2:2181,dn3:2181 --replication-factor 3 --partitions 6 --topic flume_kafka_to_hbase

3.2 配置Flume Agent

然后,配置Flume Agent信息,内容如下:

复制代码
# ------------------- define data source ----------------------
# source alias
agent.sources = kafkaSource
# channels alias
agent.channels = kafkaChannel
# sink alias
agent.sinks = hbaseSink

set kafka channel

agent.sources.kafkaSource.channels = kafkaChannel

set hbase channel

agent.sinks.hbaseSink.channel = kafkaChannel

set kafka source

agent.sources.kafkaSource.type = org.apache.flume.source.kafka.KafkaSource

set kafka broker address

agent.sources.kafkaSource.kafka.bootstrap.servers = dn1:9092,dn2:9092,dn3:9092

set kafka topic

agent.sources.kafkaSource.kafka.topics = flume_kafka_to_hbase

set kafka groupid

agent.sources.kafkaSource.kafka.consumer.group.id = flume_test_id

set channel

agent.channels.kafkaChannel.type = org.aprache.flume.channel.kafka.KafkaChannel

channel queue

agent.channels.kafkaChannel.capacity=10000

transaction size

agent.channels.kafkaChannel.transactionCapacity=1000

set hbase sink

agent.sinks.hbaseSink.type = asynchbase

hbase table

agent.sinks.hbaseSink.table = flume_data

set table column

agent.sinks.hbaseSink.columnFamily= info

serializer sink

agent.sinks.hbaseSink.serializer=org.apache.flume.sink.hbase.SimpleAsyncHbaseEventSerializer

set hbase zk

agent.sinks.hbaseSink.zookeeperQuorum = dn1:2181,dn2:2181,dn3:2181

复制代码

3.3 创建HBase表

进入到HBase集群,执行表创建命令,如下所示:

hbase(main):002:0> create 'flume_data','info'

3.4 启动Flume Agent

接着,启动Flume Agent实例,命令如下所示:

# 在Linux后台执行命令
flume-ng agent -n agent -f $FLUME_HOME/conf/kafka2hbase.properties &

3.5 在Kafka Eagle中向Topic写入数据

然后,在Kafka Eagle中写入数据,如下图所示:

3.6 在HBase中查询传输的数据

最后,在HBase中查询表flume_data的数据,验证是否传输成功,命令如下:

hbase(main):003:0> scan 'flume_data'

预览结果如下所示:

 

4.总结

 至此,Kafka中业务Topic的数据,经过Flume Source组件消费后,再由Flume Sink组件写入到HDFS,整个过程省略了大量的业务编码工作。如果实际工作当中不涉及复杂的业务逻辑处理,对于Kafka的数据转发需求,不妨可以试试这种方案。

5.结束语

这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

另外,博主出书了《Kafka并不难学》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。 

联系方式:
邮箱:smartloli.org@gmail.com
Twitter: https://twitter.com/smartloli
QQ群(Hadoop - 交流社区1): 424769183
QQ群(Kafka并不难学): 825943084
温馨提示:请大家加群的时候写上加群理由(姓名+公司/学校),方便管理员审核,谢谢!

热爱生活,享受编程,与君共勉!


公众号:


作者:哥不是小萝莉 [关于我][犒赏

出处:http://www.cnblogs.com/smartloli/

转载请注明出处,谢谢合作!

分类: hadoop, java, kafka
标签: kafka, flume, hdfs
1
0
« 上一篇: Kafka并不难学
» 下一篇: Kafka性能测试实例
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Flume是一个分布式的、可靠的、高可用的大数据采集系统,可以采集多种数据源的数据,并将其传输到多种目的地。其Flume可以采集Kafka数据,并将其传输到HDFS。具体实现方式是通过FlumeKafka Source和HDFS Sink来实现,Kafka Source用于从Kafka读取数据HDFS Sink用于将数据写入到HDFS。通过配置Flume的配置文件,可以实现Flume采集Kafka数据HDFS的功能。 ### 回答2: Flume 是一个高可靠、分布式、可配置的数据收集、聚合和移动系统。Kafka 是一个高性能、可伸缩、分布式流处理平台,它可以收集、存储和处理海量流式数据HDFS 是一个高可靠性、高扩展性、高容错性的分布式文件系统,它是 Hadoop 的一大核心组件,用于存储海量的结构化和非结构化数据。 在实际的数据处理Flume 可以采用 Kafka Source 来采集 Kafka 数据,然后将数据写入到 HDFS Flume Kafka Source 利用 KafkaFlume 推送消息,并将消息写入到 Flume 的 Channel Flume 的 Channel 一般会采用内存或者磁盘的方式进行存储,以确保数据传输的可靠性和高效性。然后,Flume HDFS Sink 将 Channel 数据批量写入到 HDFS 。在 Flume 构建这样的数据流需要一些配置工作,具体步骤如下: 1. 在 Flume 配置一个 Kafka Source,指定 Kafka 的 IP 和端口、Topic 名称和消费者组信息。 2. 配置一个 Flume Channel,指定 Channel 存储方式和容量。 3. 在 Flume 配置一个 HDFS Sink,指定 HDFS 的路径、文件名等信息。 4. 将 Kafka Source 和 HDFS Sink 与 Channel 进行关联,形成一个数据流。 除了上述基本配置外,还需要为 Kafka Source 和 HDFS Sink 进行调优,以达到最优的性能和稳定性。 总之,利用 Flume 采集 Kafka 数据,并将数据写入到 HDFS 是一种适用于海量数据处理场景的数据流处理模式。这种模式可以提高数据的可靠性和可控性,同时也可以提高数据处理的效率和可扩展性。 ### 回答3: Flume是一种数据采集工具,可以用来采集多种数据源的数据。而Kafka是一种高吞吐量的分布式消息系统,常用于处理大数据流量。 当我们需要将Kafka数据采集到HDFS时,可以利用Flume进行数据采集。具体操作步骤如下: 1. 确定HDFS的存储位置,可以新建一个目录用来存储采集的数据。比如,我们在Hadoop的安装目录下创建一个名为”flume_kafka”的目录,用来存储采集的数据。 2. 在Flume的配置文件,设置Kafka作为数据源,将采集到的数据存储到HDFS。例如,我们可以在配置文件设置一个”source”节点,将Kafka作为数据源进行数据采集;设置一个”sink”节点,将采集到的数据存储到HDFS。其,”sink”的类型为”hdfs”,指定了数据存储到HDFS的路径。 3. 在启动Flume之前,需要在HDFS创建目标目录。使用以下命令在HDFS创建相应目录:`hdfs dfs -mkdir /flume_kafka` 4. 启动Flume进行数据采集。使用以下命令启动Flume:`flume-ng agent -n agent -c /etc/flume-ng/conf.d -f /etc/flume-ng/conf.d/flume_kafka.conf -Dflume.root.logger=INFO,console`。 在启动完成后,可以观察到数据采集的运行状态和日志信息。当采集到的数据被成功存储在HDFS,可以使用以下命令查看文件的内容:`hdfs dfs -cat /flume_kafka/*`。 总之,通过FlumeKafka数据采集到HDFS,可以为数据分析和挖掘提供更好的基础数据。而且,Flume还可以配置多种不同的数据源和目标,可以根据具体需求进行扩展和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值