kafka flumn sparkstreaming java实现监听文件夹内容保存到Phoenix中
ps:具体Kafka Flumn SparkStreaming的使用 参考前几篇博客
2.4.6.4.1 配置启动Kafka
(1) 在slave机器上配置broker
1) 点击CDH上的kafka进入kafka功能界面,切换到实例页签,点击下方的“添加角色实例”进入添加角色实例界面。
2) 进入添加角色界面,点击Kafka Broker下面的选择主机
3) 进入选择主机界面,将主机全选,之后点击确定
(2) 启动Kafka
(3) 创建主题,主题名为井名,有几个井创建几个对应的主题。
进入kafka的安装目录,公司环境安装地址为/opt/cloudera/parcels/KAFKA-3.1.1-1.3.1.1.p0.2/lib/kafka ,运行下面语句:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic-name
2.4.6.4.2 配置启动Flumn
2.4.6.4.2.1 配置Flumn
(1) 编写配置
Kafka配置了主题,每个主题配置一组sources、sinks、channels。每组配置中,tier1.sources.r1.spoolDir 设置为对应井深数据存放的文件夹、tier1.sinks.k1.topic设置为对应的主题名。下面是两个主题对应的设置,将上述提到的配置做相应修改就可用。
#配置一个agent,agent的名称可以自定义(如a1) #指定agent的sources(如r1、r2)、sinks(如k1、k2)、channels(如c1、c2) tier1.sources=r1 r2 tier1.sinks=k1 k2 tier1.channels=c1 c2 #描述source r1 #配置目录scource #配置监控的目录,当目录出现新文件时会进行写入 tier1.sources.r1.type = spooldir tier1.sources.r1.spoolDir =/var/flumefile tier1.sources.r1.channels=c1 #配置数据源输出 #设置Kafka接收器,此处最坑,注意版本,此处为Flume 1.6.0的输出槽类型 tier1.sinks.k1.type= org.apache.flume.sink.kafka.KafkaSink #设置Kafka的broker地址和端口号 tier1.sinks.k1.brokerList=master:9092 #设置Kafka的Topic tier1.sinks.k1.topic=topic-test #设置序列化方式 tier1.sinks.k1.serializer.class=kafka.serializer.StringEncoder tier1.sinks.k1.channel=c1 #配置channels类型为 File tier1.channels.c1.type=memory tier1.channels.c1.capacity=10000 tier1.channels.c1.transactionCapacity=100 #描述source r1 #配置目录scource #配置监控的目录,当目录出现新文件时会进行写入 tier1.sources.r2.type = spooldir tier1.sources.r2.spoolDir =/var/flumefile2 tier1.sources.r2.channels=c2 #配置数据源输出 #设置Kafka接收器,此处最坑,注意版本,此处为Flume 1.6.0的输出槽类型 tier1.sinks.k2.type= org.apache.flume.sink.kafka.KafkaSink #设置Kafka的broker地址和端口号 tier1.sinks.k2.brokerList=master:9092 #设置Kafka的Topic tier1.sinks.k2.topic=test #设置序列化方式 tier1.sinks.k2.serializer.class=kafka.serializer.StringEncoder tier1.sinks.k2.channel=c2 #配置channels类型为 File tier1.channels.c2.type=memory tier1.channels.c2.capacity=10000 tier1.channels.c2.transactionCapacity=100 |
(2) 设置Flumn参数
1) 进入Flumn配置界面。
2) 将步骤1的配置粘贴到配置文件(Agent Default Group)
3) 配置代理名称,与配置文件中的命名相同
4) 启动Flumn
2.4.6.4.2.2 解决Flumn整合Kafka jar包版本问题
(1) 将Kafka主目录lib下的如下jar拷贝至Flume的lib目录下,并将Flume原本对应其 他版本jar删除。
kafka_2.10-0.8.2.1.jar、kafka-clients-0.8.2.1.jar、jopt-simple-3.2.jar、 metrics-core-2.2.0.jar、 scala-library-2.10.4.jar、zkclient-0.3.jar等
(2) 下载flume、kafka插件包,flumeng-kafka-plugin.jar并将其放到Flume的lib目录下。
2.4.6.4.3 编写sparkStearing
用sparkStearing作为消费者对Kafka的消息进行消费。
2.4.6.4.3.1 引入jar包
在pom.xml文件中添加下面代码,引入jar包
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.11</artifactId> <version>2.3.1</version> </dependency> </dependencies> |
2.4.6.4.3.2 代码编写
代码编写参考Spark集成Kafka API
Url:http://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html
// broker地址,可写多个“,”分隔 String brokers = "master:9092"; SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("streamingKafka"); JavaSparkContext sc = new JavaSparkContext(conf); sc.setLogLevel("WARN"); JavaStreamingContext ssc = new JavaStreamingContext(sc, Durations.seconds(10)); // kafka相关参数,必要!缺了会报错 Map<String, Object> kafkaParams = new HashMap<>(); kafkaParams.put("bootstrap.servers", brokers); kafkaParams.put("key.deserializer", StringDeserializer.class); kafkaParams.put("value.deserializer", StringDeserializer.class); kafkaParams.put("group.id", "cloudera_mirrormaker"); // Topic分区 也可以通过配置项实现 // 如果没有初始化偏移量或者当前的偏移量不存在任何服务器上,可以使用这个配置属性 // earliest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 // latest 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 // none topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常 kafkaParams.put("auto.offset.reset", "latest"); // 如果是使用spark-streaming-kafka-0-10,那么我们建议将enable.auto.commit设为false。 // 这个配置只是在这个版本生效,enable.auto.commit如果设为true的话,那么意味着offsets会按照auto.commit.interval.ms中所配置的间隔来周期性自动提交到Kafka中。 // 在Spark Streaming中,将这个选项设置为true的话会使得Spark应用从kafka中读取数据之后就自动提交, // 而不是数据处理之后提交,这不是我们想要的。所以为了更好地控制offsets的提交,我们建议将enable.auto.commit设为false。 kafkaParams.put("enable.auto.commit", false); // 设置消费的topic Collection<String> topicsColl = Arrays.asList("topic-test", "test"); // 获取DStream JavaInputDStream<ConsumerRecord<String, String>> lines = KafkaUtils.createDirectStream(ssc, LocationStrategies.PreferConsistent(), ConsumerStrategies.Subscribe(topicsColl, kafkaParams)); // 遍历JavaInputDStream的到RDD lines.foreachRDD(rdd -> { // 遍历RDD得到每一列的信息 rdd.foreach(x -> { // 获取行 String value = x.value(); // 获取需要保存的每一行的信息 String[] split = value.split(";"); // 判断是否为保存数据需要的格式 // 保存offset,保证每次获取新数据 //获取偏移量 OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges(); //保存偏移量到Kafka ((CanCommitOffsets) lines.inputDStream()).commitAsync(offsetRanges); }); ssc.start(); try { ssc.awaitTermination(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } |
2.4.6.4.3.3 获取数据的格式
会将得到批数据封装成一个RDD,RDD里面存放着ConsumerRecord<String, String>,每一个ConsumerRecord<String, String>对应数据文件中的一行。数据格式为:
ConsumerRecord( topic = test, partition = 0, offset = 547, CreateTime = 1558419603357, checksum = 890333719, serialized key size = -1, serialized value size = 92, key = null, value = 对应该行的数据 |
2.4.6.4.4 数据获取和持久化遇到的问题
(1) 一个文件夹对应一个Topic,SparkSsteaming获取多个topic数据的时候,是并发获取的,每个topic一个线程。
(2) 一个topic对应的文件夹放入多个文件,SparkSteaming会按照文件放入顺序,单线程获取数据。
(3) SparkSteaming会将一批数据封装成RDD,调用RDD.foreach()遍历时,数据处理的代码不能包含外部变量,并且不能调用外部方法。否则会报不可序列化的异常。
kafka flumn sparkstreaming java实现监听文件夹内容保存到Phoenix中的更多相关文章
- 使用Node.JS监听文件夹变化
使用Node.JS监听文件夹改变有许多应用场合,比如: 构建自动编绎工具 当源文件改变时,自动运行build过程,比如当你写CoffeeScript文件或SASS CSS文件时,保存之后可即时生成对应 ...
- nodejs 监听文件夹变化的模块
使用Node.JS监听文件夹变化 fs.watch 其中Node.JS的文件系统也可侦听某个目录的改变, 如fs.watch 其中fs.watch的最大缺点就是不支持子文件夹的侦听,并且在很多情况 ...
- c# 监听文件夹动作
static FileSystemWatcher watcher = new FileSystemWatcher(); /// <summary> /// 初始化监听 ...
- Java实现Qt的SIGNAL-SLOT机制(保存到Map中,从而将它们关联起来,收到信号进行解析,最后反射调用)
SIGNAL-SLOT是Qt的一大特色,使用起来十分方便.在传统的AWT和Swing编程中,我们都是为要在 监听的对象上添加Listener监听器.被监听对象中保存有Listener的列表,当相关事件 ...
- Java_监听文件夹或者文件是否有变动
package org.testWatch.Watch; import java.nio.file.FileSystems; import java.nio.file.Path; import jav ...
- Java_监听器监听文件夹变动
package demo4; import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Path ...
- inotify监听文件夹的变动
inotify只能监控单层目录变化,不能监控子目录中的变化情况.如果需要监控子目录,需要在调用inotify_add_watch(int fd, char *dir, int mask):int建立监 ...
- java 监听文件或文件夹变化
今天遇到一个新需求,当从服务器下载文件后用指定的本地程序打开,不知道何时文件下载完成,只能考虑监听文件夹,当有新文件创建的时候打开指定程序. 在此给出一个完整的下载和打开过程: 1.下载文件 jsp页 ...
- 如何使用NodeJs来监听文件变化
1.前言 在我们调试修改代码的时候,每修改一次代码,哪怕只是很小的修改,我们都需要手动重新build文件,然后再运行代码,看修改的效果,这样的效率特别低,对于开发者来说简直不能忍. 2.构建自动编译工 ...
随机推荐
- 线段树/树状数组 POJ 2182 Lost Cows
题目传送门 题意:n头牛,1~n的id给它们乱序编号,已知每头牛前面有多少头牛的编号是比它小的,求原来乱序的编号 分析:从后往前考虑,最后一头牛a[i] = 0,那么它的编号为第a[i] + 1编号: ...
- Windows下Apache应用环境塔建安全设置(目录权限设置)
目的:为Apache,php配置受限制的用户权限.保护系统安全.需要的朋友可以参考下. 环境配置情况: apache安装目录:d:\www-s\apache php目录:d:\www-s\php5 m ...
- asp.net 线程批量导入数据,ajax获取执行状态
最近做了一个批量导入功能,长时间运行,没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过a ...
- 洛谷P2762 太空飞行计划问题(最大权闭合图)
题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...
- ES-Apache Lucene
前言 在介绍Lucene之前,我们来了解相关的历史. 有必要了解的Apache Apache软件基金会(也就是Apache Software Foundation,简称为ASF)是专门为运作一个开源软 ...
- Xilinx HLS
Xilinx 的高层次综合(High Level Synthesis, HLS)技术是将C/C++/SystemC软件语言转换成Verilog或VHDL硬件描述语言的技术.现已应用在SDAccel,S ...
- Failed to obtain lock on file /usr/local/nagios/var/ndo2db.lock: Permission denied : Permission denied
Failed to obtain lock on file /usr/local/nagios/var/ndo2db.lock: Permission denied : Permission den ...
- Runtime理解
动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ...
- casting in C++
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=39 February 20, 2013 casting in C++ Fil ...
- SQLServer · 最佳实践 · SQL Server 2012 使用OFFSET分页遇到的问题
1. 背景 最近有一个客户遇到一个奇怪的问题,以前使用ROW_NUMBER来分页结果是正确的,但是替换为SQL SERVER 2012的OFFSET...FETCH NEXT来分页出现了问题,因此,这 ...