1,基于Flume的Push模式(Flume-style Push-based Approach)
     Flume被用于在Flume agents之间推送数据.在这种方式下,Spark Streaming可以很方便的建立一个receiver,起到一个Avro agent的作用.Flume可以将数据推送到改receiver.
1),需求
从集群中选择一台机器,
  • 当Flume+Spark Streaming程序运行时,需要保证Spark的一个worker运行在同一台机器上.
  • Flume可以通过配置文件指定推送到该台机器的一个端口.
    因为在push模式中,streaming程序在运行时,Flume需要通过配置的端口号监听该机器上的receiver,这样Flume才能进行数据推送
2)配置Flume
    配置Flume agent用于发送数据到一个Avro sink,使用如下配置文件:

agent.sinks = avroSink
agent.sinks.avroSink.type = avro
agent.sinks.avroSink.channel = memoryChannel
agent.sinks.avroSink.hostname = <选择机器的ip地址>
agent.sinks.avroSink.port = <选择机器的端口号>
     可以参考 Flume’s
documentation
 获得更多的配置信息
3)配置Spark Streaming程序
    a)连接:在SBT/Maven项目中定义,通过以下配置来配置运行环境
groupId = org.apache.spark
artifactId = spark-streaming-flume_2.10
version = 1.5.0
    b)编程:在程序中import FlumeUtils,创建DStream    
import org.apache.spark.streaming.flume._

val flumeStream = FlumeUtils.createStream(streamingContext, [选择的机器ip], [选择的机器端口号])
    更多可以参考API
docs
 和 example.
    需要注意的是:选择机器的ip必须与集群中resource manager中某一台机器一致.这样资源分配(resource allocation)才能匹配到这台机器,并且启动receiver.
    c)发布(运行)程序:将spark-streaming-flume_2.10以及相关依赖(除spark-core_2.10和spark-streaming_2.10之外)打包到应用程序的jar包中.然后使用spark-submit来启动应用程序(具体可以参考Deploying
section
)
4)示例
    (a)Spark程序编写
    完整程序如下:

object FlumeLog {

def main(args: Array[String]) {

StreamingExamples.setStreamingLogLevels()



val host = "localhost"

val port = 19999

val batchInterval = Milliseconds(2000)



// Create the context and set the batch size

val sparkConf = new SparkConf().setAppName("FlumeEventCount")

val ssc = new StreamingContext(sparkConf, batchInterval)



// Create a flume stream

val stream = FlumeUtils.createStream(ssc, host, port, StorageLevel.MEMORY_ONLY_SER_2)



// Print out the count of events received from this server in each batch

stream.count().map(cnt => "Received " + cnt + " flume events." ).print()



ssc.start()

ssc.awaitTermination()

}

}

     用于统计flume的event事件.
  (b)编写flume的配置文件
    
a1.channels = c1

     a1.sinks = k1

     a1.sources = r1 



     a1.sinks.k1.type = avro

     a1.sinks.k1.channel = c1

     a1.sinks.k1.hostname = localhost

     a1.sinks.k1.port = 19999 



     a1.sources.r1.type = exec

     a1.sources.r1.command = tail -F /home/file/bigdatatest/datalake/SougouQ.data

     a1.sources.r1.bind = localhost

     a1.sources.r1.port = 44444

     a1.sources.r1.channels = c1 



     a1.channels.c1.type = memory

     a1.channels.c1.capacity = 1000

     a1.channels.c1.transactionCapacity = 100

其中的sinks按照文档中的进行配置.sources用于从日志文件SougouQ.data中读取数据.SougouQ.data中的数据动态生成.
(c)运行
     首先启动Spark Streaming程序,可以看到如下输出信息:
    
          启动flume:/usr/local/flume140/jobconf# ../bin/flume-ng agent --conf ../conf/ --conf-file ./spark_avro.conf --name a1 -Dflume.root.logger=INFO,console
(d)结果,此时观察Spark程序的输出结果如下:
    
    可以看到,每隔一定的间隔,就有一个Received 100 flume events的信息输出,表示spark streaming程序已从flume获取到数据.可以将Spark Streaming应用程序按照实际业务需求进行修改.

2,基于Custom Sink的Pull模式(Pull-based
Approach using a Custom Sink)
     不同于Flume直接将数据推送到Spark Streaming中,第二种模式通过以下条件运行一个正常的Flume sink:
  • Flume将数据推送到sink中,并且数据保持buffered状态
  • Spark Streaming使用一个可靠的Flume接收器(reliable Flume receiver )和转换器(transaction)从sink拉取数据.只要当数据被接收并且被Spark
    Streaming备份后,转换器才运行成功.
    这样,与第一种模式相比,保证了很好的健壮性和容错能力( fault-tolerance
guarantees
 ).然而,这种模式需要为Flume配置一个正常的sink.以下为配置步骤
    1)基本要求
     选择一台运行在一个Flume agent中的普通sink节点的机器.Flume其他的pipeline配置成向该agent发送数据.Spark集群中的机器应该可以访问到选为sink节点的那台机器
    2)配置Flume
        Flume中sink节点的配置
(a)Sink JARS:将如下JAR包添加到Flume中被选为普通sink节点的classpath中,修改FLUME_HOME/conf/flune_env.sh文件中的FLUME_CLASSPATH=""配置信息,将以下三个jar包路径写入,或者将以下三个jar包复制到FLUME_HOME/lib/目录下
    包括三种类型的JAR包
    (i) 普通的sink JAR包(下载地址 direct
link
):
 groupId = org.apache.spark
artifactId = spark-streaming-flume-sink_2.10
version = 1.5.0
     (ii) Scala运行相关JAR包(下载地址  direct
link
).:
 groupId = org.scala-lang
artifactId = scala-library
version = 2.10.4
(iii)Lang 3JAR包(下载地址 direct
link
):
 groupId = org.apache.commons
artifactId = commons-lang3
version = 3.3.2
(b)配置Flume conf文件
使用如下配置参数配置Flume agent用于发送数据到一个Avro sink
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
     同样需要保证Flume upstream pipline已经配置好向运行上述sink的agent发送数据.更多Flume的配置信息可以在Flume’s
documentation
 中查看.
3)编写Spark Streaming应用程序
(a)连接
    在SBT/Maven项目定义中,需要引入spark-streaming-flume_2.10相关jar包.可以参考之前的配置
(b)编程
    导入FLumeUtils创建一个flumeStream
 import org.apache.spark.streaming.flume._

 val flumeStream = FlumeUtils.createPollingStream(streamingContext, [sink machine hostname], [sink port])
可以查看示例程序FlumePollingEventCount.
    注意:每个input Dstream可以接收从多个sinks中的数据
(c)发布(运行)
    将spark-streaming-flume_2.10以及相关依赖(除spark-core_2.10和spark-streaming_2.10之外)打包到应用程序的jar包中.然后使用spark-submit来启动应用程序(具体可以参考Deploying
section
)
4)示例
(a)Spark程序:
object FlumeLogPull {
def main(args: Array[String]) {
StreamingExamples.setStreamingLogLevels()

val host = "localhost"
val port = 19999
val batchInterval = Milliseconds(2000)

// Create the context and set the batch size
val sparkConf = new SparkConf().setAppName("FlumeEventCount")
val ssc = new StreamingContext(sparkConf, batchInterval)

// Create a flume stream
val stream = FlumeUtils.createPollingStream(ssc, host, port, StorageLevel.MEMORY_ONLY_SER_2)

// Print out the count of events received from this server in each batch
stream.count().map(cnt => "Received " + cnt + " flume events." ).print()

ssc.start()
ssc.awaitTermination()
}
}
可以看到与之前一个相比,只是把val stream = FlumeUtils.createStream(ssc, host, port, StorageLevel.MEMORY_ONLY_SER_2)改成了val stream = FlumeUtils.createPollingStream(ssc,
host, port, StorageLevel.MEMORY_ONLY_SER_2)
(b)配置Flume

a1.channels = c1

a1.sinks = k1

a1.sources = r1

a1.sinks.k1.type = org.apache.spark.streaming.flume.sink.SparkSink

a1.sinks.k1.channel = c1

a1.sinks.k1.hostname = localhost

a1.sinks.k1.port = 19999

a1.sources.r1.type = exec

a1.sources.r1.command = tail -F /home/file/bigdatatest/datalake/SougouQ.data

a1.sources.r1.bind = localhost

a1.sources.r1.port = 44444

a1.sources.r1.channels = c1

a1.channels.c1.type = memory

a1.channels.c1.capacity = 100000

a1.channels.c1.transactionCapacity = 100000
(c)运行
    需要先启动flume,再启动spark程序
启动flume:/usr/local/flume140/jobconf# ../bin/flume-ng agent --conf ../conf/ --conf-file ./spark_flume_log_pull.conf --name a1 -Dflume.root.logger=INFO,console
(d)结果
比较启动顺序:
    在push模式中,先启动spark application,进入等待状态,等待flume push数据,此时启动flume进行数据的传递.
    在pull模式中,spark application会从配置的端口pull数据,此时若flume还未启动,spark application会提示端口连接失败.所以需要先启动flume后启动spark application




Spark Streaming + Flume整合官网文档阅读及运行示例的更多相关文章

  1. mongodb官网文档阅读笔记:与写性能相关的几个因素

    Indexes 和全部db一样,索引肯定都会引起写性能的下降,mongodb也没啥特别的,相对索引对读性能的提示,这些消耗通常是能够接受的,所以该加入的索引还是要加入.当然须要慎重一些.扯点远的,以前 ...

  2. mongodb官网文档阅读笔记:write concern

    write concern保证了mongodb写操作的级别,不同的write concern设置相应了不同级别的写操作.设置的级别越高.那么写操作的性能的持久化做得越好,可是写性能也就越差. mong ...

  3. 部署openstack的官网文档解读mysql的配置文件

    部署openstack的官网文档解读mysql的配置文件(使用与ubutu和centos7等系统) author:headsen chen  2017-10-12 16:57:11 个人原创,严禁转载 ...

  4. redis过期机制(官网文档总结)

    官网地址:https://redis.io/commands/expire redis过期定义如下: Set a timeout on key. After the timeout has expir ...

  5. Hortonworks官网文档怎么找?

    Hortonworks官网文档怎么找? 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 俗话说,授人予鱼不如授人予渔,网上部署HDP的部署方式的博客有很多,看得你是眼花缭乱的.其实万 ...

  6. Unity shader 官网文档全方位学习(一)

    转载:https://my.oschina.net/u/138823/blog/181131 摘要: 这篇文章主要介绍Surface Shaders基础及Examples详尽解析 What?? Sha ...

  7. 【VR】Leap Motion 官网文档 FingerModel (手指模型)

    前言: 感谢关注和支持这个Leap Motion系列翻译的朋友们,非常抱歉因为工作原因非常久没有更新,今后这个翻译还会继续(除非官方直接给出中文文档).本篇献给大家的是 <FingerModel ...

  8. Spring Security 官网文档学习

    文章目录 通过`maven`向普通的`WEB`项目中引入`spring security` 配置 `spring security` `configure(HttpSecurity)` 方法 自定义U ...

  9. mybatis官网文档mybatis_doc

    在平时的学习中,我们可以去参考官网的文档来学习,这个文档有中文的,方便我们去阅读,而且这里的分类很详细. 官网文档链接:http://www.mybatis.org/mybatis-3/zh/inde ...

随机推荐

  1. Elasticsearch 学习(二):安装和使用

    一.安装 安装 Elasticsearch 之前,需要先安装 Java,并配置好 Java 环境变量. 安装好 Java 环境后,进入 Elasticsearch 官网下载安装包. 解压安装包,进入解 ...

  2. Python中and(逻辑与)计算法则

    在程序设计中,and称为逻辑与运算,也称布尔运算:1.and是在布尔上下文中从左到右计算表达式的值:2.0.''.[].().{}.None.False在布尔上下文中为假:其它任何东西都为真:3.如果 ...

  3. Unity CommandBuffer的一些学习整理

    1.前言 近期在整理CommandBuffer这块资料,之前的了解一直较为混乱. 算不上新东西了,但个人觉得有些时候要比加一个摄像机再转RT廉价一些,至少省了深度排序这些操作. 本文使用两个例子讲解C ...

  4. C语言中file文件指针概念及其操作 (转载)

    文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...

  5. linux下的静态库与动态库详解

    静态库 先说说我们为什么需要库? 当有些代码我们大量会在程序中使用比如(scanf,printf等)这些函数我们需要在程序中频繁使用,于是我们就把这些代码编译为库文件,在需要使用时我们直接链接即可. ...

  6. Template基础

    模板系统的介绍 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  7. 记一个万金油开源框架JHipster

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/53190236 百搭代码生成框架 体验新技术汇总: Spring Boot Spring ...

  8. Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  9. RxJava(九)zip操作符在Android中的实际使用场景

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51614927 本文出自:[余志强的博客] 一.zip操作符概述 官方 ...

  10. 剑指Offer——搜狐畅游笔试题+知识点总结

    剑指Offer--搜狐畅游笔试题+知识点总结 情景回顾 时间:2016.9.24 10:00-12:00 地点:山东省网络环境智能计算技术重点实验室 事件:搜狐畅游笔试   注意事项:要有大局观,该舍 ...