二、Pull方式整合
又称:基于Pull的方式使用自定义的sink。
和第一种直接Push数据到Spark Streaming 的方式相反,Pull方式就是SparkStreaming从Flume里进行数据的拉取,这种方式会自定义个Flume Sink,遵循如下几个步骤:
1. Flume 把数据Push到一个sink 里后,数据先存放在一个缓存中。
2. Spark Streaming使用一个可靠的Flume receiver,然后用事务的方式从sink里把数据拉过来,这个事务仅仅在当你的数据被Spark Streaming接收到,并且多副本的条件下,这个事务才成功。
第二种方式的可靠性和容错性比Push要好很多,所以生产环境优先考虑到Pull方式。Pull方式需要配置Flume,然后把数据收集过来后运行到一个自定义的sink里。步骤如下:
1.General Requirements
选择一台机器,运行Flume agent中的自定义sink,然后Flume其他一些管道的数据,可以把数据发送到所选择的这个agent上面来,即Spark集群上面的机器是有权限访问被选择运行自定义sink的这台机器。
配置Flume
1. 添加相关依赖:
groupId = org.apache.spark
artifactId = spark-streaming-flume-sink_2.11
version = 2.2.0
groupId = org.scala-lang
artifactId = scala-library
version = 2.11.8
groupId = org.apache.commons
artifactId = commons-lang3
version = 3.5
2.Flume的配置文件:
agent.sinks = spark
agent.sinks.spark.type = org.apache.spark.streaming.flume.sink.SparkSink
agent.sinks.spark.hostname = <hostname of the local machine>
agent.sinks.spark.port = <port to listen on for connection from Spark>
agent.sinks.spark.channel = memoryChannel
配置Spark Streaming的应用
1.依赖
应用上面的依赖关系即可,其中要注意导入FlumeUtil这个类,并且用到的是createPollingStream这个方法,而不是Push方式中的createStream方法
import org.apache.spark.streaming.flume._
val flumeStream = FlumeUtils.createPollingStream(streamingContext, [sink machine hostname], [sink port])
2.编码
注意:每个输入的DStream 可以接收多个sinks里的数据
import org.apache.spark.SparkConf
import org.apache.spark.streaming.flume.FlumeUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* Spark Streaming整合Flume的第二种方式
*/
object FlumePullWordCount {
def main(args: Array[String]): Unit = {
if(args.length != 2) {
System.err.println("Usage: FlumePullWordCount <hostname> <port>")
System.exit(1)
}
val Array(hostname, port) = args
val sparkConf = new SparkConf() //.setMaster("local[2]").setAppName("FlumePullWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(5))
//TODO... 如何使用SparkStreaming整合Flume
val flumeStream = FlumeUtils.createPollingStream(ssc, hostname, port.toInt)
flumeStream.map(x=> new String(x.event.getBody.array()).trim)
.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).print()
ssc.start()
ssc.awaitTermination()
}
}
3.提交部署
同Push方式,但是此处要注意的是:先启动flume 后启动Spark Streaming应用程序
启动Flume:
flume-ng agent \
--name simple-agent \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/flume_pull_streaming.conf \
-Dflume.root.logger=INFO,console
spark submit提交:
spark-submit \
--class com.imooc.spark.FlumePullWordCount \
--master local[2] \
--packages org.apache.spark:spark-streaming-flume_2.11:2.2.0 \
/home/hadoop/lib/sparktrain-1.0.jar \
hadoop000 41414
官网地址:http://spark.apache.org/docs/latest/streaming-flume-integration.html#general-requirements-1