SparkStreaming整合Flume(二)Pull方式的整合

二、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章