Spark Streaming实时流处理项目实战(十)Spark Streaming整合Flume实战二

基于拉方式:Pull-based Approach using a Custom Sink

Spark Streaming 基于拉方式处理 Flume-ng 数据源(Pull-based Approach using a Custom Sink)
这种方式不是 Flume 直接推送数据到 SparkStreaming ,这种方法运行了一个如下所示的 Flume Sink 。

  1. Flume 将数据推送到 Sink 中,然后数据在此处缓存。
  2. Spark Streaming 使用一个可靠的 Flume 接收器和事务从 Sink 中拉取数据。只有在 SparkStreaming 接收到数据并且把数据复制后才认为操作成功。

这个方法比前面Push的方法提供了强大的可靠性和容错保证。然而,这需要配置 Flume 运行一个自定义 Sink 。
官网链接:https://spark.apache.org/docs/2.2.0/streaming-flume-integration.html

配置步骤

1. 一般要求
选择一台在 Flume 代理中运行自定义 Sink 的机器。 Flume 其余的管道被配置为向那个代理发送数据。 Spark 集群中的机器都能连接到运行自定义 Sink 的那台机器上。

2. 配置Flume

在选定的机器上配置 Flume 需要如下的两步。

一、 添加如下的 JAR 包到要运行自定义 Sink 的机器中的 Flume 的 classpath 中 (如下 jar 放在/opt/module/flume-1.7.0/lib目录下)
spark-streaming-flume-sink_2.11-2.2.0.jar
commons-lang3 -3.3.2.jar

二、 flume agent配置文件:flume_pull_streaming.conf 配置如下

simple-agent.sources = netcat-source
simple-agent.sinks = spark-sink
simple-agent.channels = memory-channel

simple-agent.sources.netcat-source.type = netcat
simple-agent.sources.netcat-source.bind = hadoop01
simple-agent.sources.netcat-source.port = 44444

simple-agent.sinks.spark-sink.type = org.apache.spark.streaming.flume.sink.SparkSink
simple-agent.sinks.spark-sink.hostname = hadoop01
simple-agent.sinks.spark-sink.port = 41414

simple-agent.channels.memory-channel.type = memory

simple-agent.sources.netcat-source.channels = memory-channel
simple-agent.sinks.spark-sink.channel = memory-channel

3. Spark Streaming应用程序开发


import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.ReceiverInputDStream
import org.apache.spark.streaming.flume.{FlumeUtils, SparkFlumeEvent}
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
 * Spark Streaming整合Flume的第二种方式:Pull
 */
object FlumePullWordCount {

  def main(args: Array[String]): Unit = {

    if (args.length != 2) {
      System.err.println("Usage: FlumePushWordCount <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... Spark Streaming整合Flume之Pull方式
    val flumeStream: ReceiverInputDStream[SparkFlumeEvent] = FlumeUtils.createPollingStream(ssc, hostname, port.toInt)

    flumeStream.map(x =>new String(x.event.getBody.array()).trim)
      .flatMap(_.split(" "))
      .map((_,1))
      .reduceByKey(_+_)

    ssc.start()
    ssc.awaitTermination()

  }

}

4. 本地测试联调

先启动Flume,后启动Spark Streaming应用程序。

  1. 启动flume
flume-ng agent \
--name simple-agent \
--conf $FLUME_HOME/job \
--conf-file $FLUME_HOME/job/flume_pull_streaming.conf \
-Dflume.root.logger=INFO,console

在这里插入图片描述

  1. 启动Spark应用程序

启动IDEA程序之前,需要传入两个参数,因为开头定义了两个参数,不传会自动退出
在这里插入图片描述

  1. 测试输入数据,观察IDEA统计结果
[root@hadoop01 job]# telnet hadoop01 44444
Trying 192.168.118.151...
Connected to hadoop01.
Escape character is '^]'.
a a a b c c c d
OK

在这里插入图片描述
IDEA输入结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怒上王者

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值