三、集成:数据源
1、Apache Kafka:一种高吞吐量的分布式发布订阅消息系统
(1)
(*)消息的类型

Topic:主题(相当于:广播)
Queue:队列(相当于:点对点)

(*)常见的消息系统
Kafka、Redis -----> 只支持Topic
JMS(Java Messaging Service标准):Topic、Queue -----> Weblogic

(*)角色:生产者:产生消息
消费者:接收消息(处理消息)

(2)Kafka的消息系统的体系结构

(3)搭建Kafka的环境:单机单Broker的模式

//启动kafka
bin/kafka-server-start.sh config/server.properties &

测试Kafka
创建Topic

bin/kafka-topics.sh --create --zookeeper bigdata11:2181 -replication-factor 1 --partitions 3 --topic mydemo1

发送消息

bin/kafka-console-producer.sh --broker-list bigdata11:9092 --topic mydemo1

接收消息: 从zookeeper中获取topic的信息

bin/kafka-console-consumer.sh --zookeeper bigdata11:2181 --topic mydemo1

(4)集成Spark Streaming:两种方式
注意:依赖的jar包很多(还有冲突),强烈建议使用Maven方式
读到数据:都是key value
(*)基于接收器方式(receiver)

Receiver的实现使用到Kafka高层次的API.对于所有的Receivers,接收到的数据将会保存在Spark executors中,然后由Spark Streaming 启动Job来处理这些数据

 package main.scala.demo

 import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext} object KafkaReceiverDemo { def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("KafkaReceiverDemo").setMaster("local[2]")
val ssc = new StreamingContext(conf,Seconds(10)) //指定Topic信息:从mydemo1的topic中,每次接受一条消息
val topic = Map("mydemo1" -> 1) //创建Kafka输入流(DStream),基于Receiver方式,链接到ZK
//参数:SparkStream,ZK地址,groupId,topic
val kafkaStream = KafkaUtils.createStream(ssc,"192.168.153.11:2181","mygroup",topic) //接受数据,并处理
val lines = kafkaStream.map(e=>{
//e代表是每次接受到的数据
new String(e.toString())
}
) //输出
lines.print() ssc.start()
ssc.awaitTermination()
}
}

启动Kafka,在上面发送一条消息,结果

(*)直接读取方式:推荐(效率更高)

这种方式定期的从Kafka的topic+partition中查询最新的偏移量,再根据定义的偏移量在每个batch里面处理数据。当需要处理的数据来临时,spark通过调用kafka简单的消费者API读取一定范围内的数据。

package main.scala.demo

import kafka.serializer.StringDecoder
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext} object KafkaDirectDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("KafkaReceiverDemo").setMaster("local[2]")
val ssc = new StreamingContext(conf,Seconds(10)) //指定Topic信息
val topic = Set("mydemo1") //直接读取Broker,指定就是Broker的地址
val brokerList = Map[String,String]("metadata.broker.list"->"192.168.153.11:9092") //创建一个DStream key value key的解码器 value的解码器
val lines = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder](ssc,brokerList,topic) //读取消息
val message = lines.map(e=>{
new String(e.toString())
}
) message.print() ssc.start()
ssc.awaitTermination() }
}

2、集成Apache Flume:两种方式
注意:依赖jar包Flume lib下面的Jar包,以及
(1)基于Flume Push模式: 推模式。Flume被用于在Flume agents 之间推送数据。在这种方式下,Spark Streaming可以建立一个receiver,起到一个avro receiver的作用。Flume可以直接将数据推送到该receiver。

a4.conf配置。

#bin/flume-ng agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO,console
#定义agent名, source、channel、sink的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1 #具体定义source
a4.sources.r1.type = spooldir
a4.sources.r1.spoolDir = /root/training/logs #具体定义channel
a4.channels.c1.type = memory
a4.channels.c1.capacity = 10000
a4.channels.c1.transactionCapacity = 100 #具体定义sink
a4.sinks = k1
a4.sinks.k1.type = avro
a4.sinks.k1.channel = c1
a4.sinks.k1.hostname = 192.168.153.1
a4.sinks.k1.port = 1234 #组装source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1
package flume

import org.apache.spark.SparkConf
import org.apache.spark.streaming.flume.FlumeUtils
import org.apache.spark.streaming.{Seconds, StreamingContext} object MyFlumeStream {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkFlumeNGWordCount").setMaster("local[2]")
val ssc = new StreamingContext(conf, Seconds(5)) //创建FlumeEvent的DStream
val flumeEvent = FlumeUtils.createStream(ssc,"192.168.153.1",1234) //将FlumeEvent中的事件转成字符串
val lineDStream = flumeEvent.map( e => {
new String(e.event.getBody.array)
}) //输出结果
lineDStream.print() ssc.start()
ssc.awaitTermination();
}
}

测试:

1.启动Spark streaming程序MyFlumeStream

2.启动Flume:bin/flume-ng agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO,console

3.拷贝日志文件到/root/training/logs目录

4.观察输出,采集到数据:

(2)自定义sink方式(Pull模式): 拉模式。Flume将数据推送到sink中,并且保持数据buffered状态。Spark Streaming使用一个可靠的Flume接收器从sink拉取数据。这种模式更加健壮和可靠,需要为Flume配置一个正常的sink
(*)将Spark的jar包拷贝到Flume的lib目录下
(*)下面的这个jar包也需要拷贝到Flume的lib目录下

(*)同时加入IDEA工程的classpath

#bin/flume-ng agent -n a1 -f myagent/a1.conf -c conf -Dflume.root.logger=INFO,console
a1.channels = c1
a1.sinks = k1
a1.sources = r1 a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /root/training/logs a1.channels.c1.type = memory
a1.channels.c1.capacity = 100000
a1.channels.c1.transactionCapacity = 100000 a1.sinks.k1.type = org.apache.spark.streaming.flume.sink.SparkSink
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 192.168.153.11
a1.sinks.k1.port = 1234 #组装source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
package flume

import org.apache.spark.SparkConf
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.flume.FlumeUtils
import org.apache.spark.streaming.{Seconds, StreamingContext} object FlumeLogPull {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("SparkFlumeNGWordCount").setMaster("local[2]")
val ssc = new StreamingContext(conf, Seconds(10)) //创建FlumeEvent的DStream
val flumeEvent = FlumeUtils.createPollingStream(ssc,"192.168.153.11",1234,StorageLevel.MEMORY_ONLY_SER_2) //将FlumeEvent中的事件转成字符串
val lineDStream = flumeEvent.map( e => {
new String(e.event.getBody.array)
}) //输出结果
lineDStream.print() ssc.start()
ssc.awaitTermination();
}
}

开启flume:

bin/flume-ng agent -n a1 -f myagent/a1.conf -c conf -Dflume.root.logger=INFO,console

测试步骤和推模式类似。

大数据笔记(三十二)——SparkStreaming集成Kafka与Flume的更多相关文章

  1. 大数据笔记(十二)——使用MRUnit进行单元测试

    package demo.wc; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.io.IntW ...

  2. 论文阅读笔记三十二:YOLOv3: An Incremental Improvement

    论文源址:https://pjreddie.com/media/files/papers/YOLOv3.pdf 代码:https://github.com/qqwweee/keras-yolo3 摘要 ...

  3. 大数据笔记(十八)——Pig的自定义函数

    Pig的自定义函数有三种: 1.自定义过滤函数:相当于where条件 2.自定义运算函数: 3.自定义加载函数:使用load语句加载数据,生成一个bag 默认:一行解析成一个Tuple 需要MR的ja ...

  4. 大数据笔记(十五)——Hive的体系结构与安装配置、数据模型

    一.常见的数据分析引擎 Hive:Hive是一个翻译器,一个基于Hadoop之上的数据仓库,把SQL语句翻译成一个  MapReduce程序.可以看成是Hive到MapReduce的映射器. Hive ...

  5. 大数据笔记(十)——Shuffle与MapReduce编程案例(A)

    一.什么是Shuffle yarn-site.xml文件配置的时候有这个参数:yarn.nodemanage.aux-services:mapreduce_shuffle 因为mapreduce程序运 ...

  6. 大数据笔记(十九)——数据采集引擎Sqoop和Flume安装测试详解

    一.Sqoop数据采集引擎 采集关系型数据库中的数据 用在离线计算的应用中 强调:批量 (1)数据交换引擎: RDBMS <---> Sqoop <---> HDFS.HBas ...

  7. 大数据笔记(十四)——HBase的过滤器与Mapreduce

    一. HBase过滤器 1.列值过滤器 2.列名前缀过滤器 3.多个列名前缀过滤器 4.行键过滤器5.组合过滤器 package demo; import javax.swing.RowFilter; ...

  8. 大数据笔记(十六)——Hive的客户端及自定义函数

    一.Hive的Java客户端 JDBC工具类:JDBCUtils.java package demo.jdbc; import java.sql.DriverManager; import java. ...

  9. PHP学习笔记三十二【Exception】

    <?php // $fp=fopen("a.txt","r"); // echo "ok"; if(!file_exists(&quo ...

随机推荐

  1. Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化)

    Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回 ...

  2. redis 小结 一

    1.redis 是什么? 它是一个key-value存储系统,也被称为数据结构服务器,它的值是字符串(String),哈希(Hash),列表(list),集合(sets)和有序集合(sorted se ...

  3. ExpressionTree学习笔记

    概述: 这段时间需要制定自定义查询条件,感觉有必要学习ExpressionTree. 学习参考资料:https://msdn.microsoft.com/en-us/library/mt654263. ...

  4. sql server 获取随机数函数RAND()和RAND(x)

    --RAND(x)返回一个随机浮点值v,范围在0~1之间(即0<=v<=1.0) --若指定一个整数参数x,则它被用作种子值,使用相同的种子数将产生重复序列.如果同一种子值多次调用RAND ...

  5. openlayers之框选放缩DragZoom(vue项目)

    环境vue3.0项目 最初是以npm i ol -s方式安装的ol,import方式导入引用,但是实际使用的时候一直报ol is not defined,最后选择在HTML以script标签引入ol, ...

  6. 002-Saltstack自动化操作记录(2)-配置使用

    之前梳理了就是第一篇001,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192.168.1.118需要在master控制端机器上做好主机名映射关系 1 ...

  7. zencart前台小语种后台英文 导入批量表 前后台不显示产品的问题

    admin\includes\init_includes\init_languages.php 前台小语种后台英文导致批量表导入后,前后台不显示产品的问题将红色部分修改成前台语言对应的值,前台语言对应 ...

  8. c字符串函数

    1.  bcmp(3) 类ma似于strncmp(3) 但是比较结果不一定是两个字符的ascii码之差. 返回值:相等0,不相等非零(不一定是-1) 2.bcopy(3)类ma似于strncpy(3) ...

  9. jenkins打包maven工程发现有些包下载不下来

    将这些依赖的jar包放到mvn的本地仓库中,通常是用户主目录下的.m2/repository https://blog.csdn.net/taiyangdao/article/details/5228 ...

  10. linux 生成密钥和公钥,实现免密登录

    1. 在相应的用户根目录下生成密钥公钥,输入如下命令: ssh-keygen -t rsa 2. 直接三次回车:会生成两个文件:id_rsa / id_rsa.pub,分别为密钥和公钥 3.  打开公 ...