1.概述

对于数据的转发,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=`date "+%N"`
tdate=`date "+%Y-%m-%d %H:%M:%S,${mill:0:3}"` echo [$tdate] INFO [Kafka Cluster] begins to execute the $ operation. # 执行分布式开启命令
function start()
{
for i in ${hosts[@]}
do
smill=`date "+%N"`
stdate=`date "+%Y-%m-%d %H:%M:%S,${smill:0:3}"`
ssh hadoop@$i "source /etc/profile;echo [$stdate] INFO [Kafka Broker $i] begins to execute the startup operation.;kafka-server-start.sh $KAFKA_HOME/config/server.properties>/dev/null" &
sleep
done
} # 执行分布式关闭命令
function stop()
{
for i in ${hosts[@]}
do
smill=`date "+%N"`
stdate=`date "+%Y-%m-%d %H:%M:%S,${smill:0:3}"`
ssh hadoop@$i "source /etc/profile;echo [$stdate] INFO [Kafka Broker $i] begins to execute the shutdown operation.;kafka-server-stop.sh>/dev/null;" &
sleep
done
} # 查看Kafka代理节点状态
function status()
{
for i in ${hosts[@]}
do
smill=`date "+%N"`
stdate=`date "+%Y-%m-%d %H:%M:%S,${smill:0:3}"`
ssh hadoop@$i "source /etc/profile;echo [$stdate] INFO [Kafka Broker $i] status message is :;jps | grep Kafka;" &
sleep
done
} # 判断输入的Kafka命令参数是否有效
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|status}"
RETVAL=
esac

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

# 创建一个flume_collector_data主题
kafka-topics.sh --create --zookeeper dn1:,dn2:,dn3: --replication-factor --partitions --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 = # set kafka broker address
agent.sources.source_from_kafka.kafka.bootstrap.servers = dn1:,dn2:,dn3: # 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 =
agent.sinks.hdfs_sink.hdfs.rollCount =
agent.sinks.hdfs_sink.hdfs.rollInterval =
agent.sinks.hdfs_sink.hdfs.threadsPoolSize =
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 =
# transaction size
agent.channels.mem_channel.transactionCapacity =

然后,启动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:,dn2:,dn3: --replication-factor --partitions --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:,dn2:,dn3: # 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.apache.flume.channel.kafka.KafkaChannel
# channel queue
agent.channels.kafkaChannel.capacity=
# transaction size
agent.channels.kafkaChannel.transactionCapacity= # 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:,dn2:,dn3:

3.3 创建HBase表

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

hbase(main)::> 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)::> scan 'flume_data'

预览结果如下所示:

4.总结

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

5.结束语

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

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

使用Flume消费Kafka数据到HDFS的更多相关文章

  1. spark streaming从指定offset处消费Kafka数据

    spark streaming从指定offset处消费Kafka数据 -- : 770人阅读 评论() 收藏 举报 分类: spark() 原文地址:http://blog.csdn.net/high ...

  2. Flink消费Kafka数据并把实时计算的结果导入到Redis

    1. 完成的场景 在很多大数据场景下,要求数据形成数据流的形式进行计算和存储.上篇博客介绍了Flink消费Kafka数据实现Wordcount计算,这篇博客需要完成的是将实时计算的结果写到redis. ...

  3. flume 读取kafka 数据

    本文介绍flume读取kafka数据的方法 代码: /************************************************************************* ...

  4. Flume同时输出数据到HDFS和kafka

    cd /usr/local/flume/conf vim flume-exec-total.conf ## Explain #通过sink把数据分别输出到kafka和HDFS上 # Name the ...

  5. 使用flume将kafka数据sink到HBase【转】

    1. hbase sink介绍 1.1 HbaseSink 1.2 AsyncHbaseSink 2. 配置flume 3. 运行测试flume 4. 使用RegexHbaseEventSeriali ...

  6. Logstash读取Kafka数据写入HDFS详解

    强大的功能,丰富的插件,让logstash在数据处理的行列中出类拔萃 通常日志数据除了要入ES提供实时展示和简单统计外,还需要写入大数据集群来提供更为深入的逻辑处理,前边几篇ELK的文章介绍过利用lo ...

  7. Sprak2.0 Streaming消费Kafka数据实时计算及运算结果保存数据库代码示例

    package com.gm.hive.SparkHive; import java.util.Arrays; import java.util.Collection; import java.uti ...

  8. Spark Steaming消费kafka数据条数变少问题

    对于基于Receiver 形式,我们可以通过配置 spark.streaming.receiver.maxRate 参数来限制每个 receiver 每秒最大可以接收的记录的数据:对于 Direct ...

  9. Spark Streaming消费Kafka Direct方式数据零丢失实现

    使用场景 Spark Streaming实时消费kafka数据的时候,程序停止或者Kafka节点挂掉会导致数据丢失,Spark Streaming也没有设置CheckPoint(据说比较鸡肋,虽然可以 ...

随机推荐

  1. 我的 FPGA 学习历程(09)—— 时序逻辑入门

    讲到这篇时,组合逻辑就告一段落了,下面是一些总结: 描述组合逻辑时,always 语句中的敏感信号列表中需要列出全部的可能影响输出的变量 描述组合逻辑时,always 语句中的赋值总是使用阻塞赋值符号 ...

  2. js判断pc还是移动端

    if (!/windows phone|iphone|android/ig.test(window.navigator.userAgent)) { //pc }else{ //h5 }

  3. C#三目运算符

    在编写项目的时候,会经常用到 if else 判断语句,但有些简单的判断或赋值,可以通过三目运算符来完成! 例如: int sex=0; string sexText=""; if ...

  4. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)

    实验十四  Swing图形界面组件 理论部分: 不使用布局管理器 有时候可能不想使用任何布局管理器,而只 是想把组件放在一个固定的位置上.下面是将一 个组件定位到某个绝对定位的步骤: 1)将布局管理器 ...

  5. 使用secureCRT和Telnet将文件压缩导出到Ubuntu中,到Ubuntu中加压缩发现:tar解压包的时候出现错误gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now

    细节描述: 问题如题所示:查找博客园和CSDN上查找问题,得到问题解决方法大致如下: 1 修改解压缩命令: 由 tar zxvf software_package.tar.gz变为tar xvf so ...

  6. Spring源码阅读 源码环境搭建(一)

    ring 源码阅读的搭建(一) 一 下载spring源码 进入官方网页:https://spring.io/projects/spring-framework 进入相关的github位置,下载zip包 ...

  7. HelloPython

    HELLOWORD!你好!Python! 学习Python已有一段时间,一个人自学颇不容易,在此分享一些自己学习经验和感受,温故而知新,也希望自己能有些新收获. 学习Python,大多数人创建的第一个 ...

  8. react-native 打包成apk 文件

    用android studio 打包成apk 文件 js build 执行: react-native bundle --platform android --dev false --entry-fi ...

  9. IIS中 flv、swf 文件无法播放

    解决方案: 1.服务器安装flash,这是必须的. 2.MIME类型添加两个:名称.swf,值application/x-shockwave-flash:名称.flv,值flv-application ...

  10. 《JavaScript DOM编程艺术》学习笔记(一)

    这本书是我听说学习前端基础入门书籍,于是就开始看了,大概是从5月10号开始看的吧,一直看到现在,差不多要看完了,书是挺厚的...286页,不过比起JAVASCRIPT权威指南来说还是差多了,权威指南才 ...