前一篇中数据源采用的是从一个socket中拿数据,有点属于“旁门左道”,正经的是从kafka等消息队列中拿数据!

主要支持的source,由官网得知如下:

  获取数据的形式包括推送push和拉取pull

一、spark streaming整合flume

  1.push的方式

    更推荐的是pull的拉取方式

    引入依赖:

  1. <dependency>
  2. <groupId>org.apache.spark</groupId>
  3. <artifactId>spark-streaming-flume_2.10</artifactId>
  4. <version>${spark.version}</version>
  5. </dependency>

    编写代码:

  1. package com.streaming
  2.  
  3. import org.apache.spark.SparkConf
  4. import org.apache.spark.streaming.flume.FlumeUtils
  5. import org.apache.spark.streaming.{Seconds, StreamingContext}
  6.  
  7. /**
  8. * Created by ZX on 2015/6/22.
  9. */
  10. object FlumePushWordCount {
  11.  
  12. def main(args: Array[String]) {
  13. val host = args(0)
  14. val port = args(1).toInt
  15. val conf = new SparkConf().setAppName("FlumeWordCount")//.setMaster("local[2]")
  16. // 使用此构造器将可以省略sc,由构造器构建
  17. val ssc = new StreamingContext(conf, Seconds(5))
  18. // 推送方式: flume向spark发送数据(注意这里的host和Port是streaming的地址和端口,让别人发送到这个地址)
  19. val flumeStream = FlumeUtils.createStream(ssc, host, port)
  20. // flume中的数据通过event.getBody()才能拿到真正的内容
  21. val words = flumeStream.flatMap(x => new String(x.event.getBody().array()).split(" ")).map((_, 1))
  22.  
  23. val results = words.reduceByKey(_ + _)
  24. results.print()
  25. ssc.start()
  26. ssc.awaitTermination()
  27. }
  28. }

    flume-push.conf——flume端配置文件:

  1. # Name the components on this agent
  2. a1.sources = r1
  3. a1.sinks = k1
  4. a1.channels = c1
  5.  
  6. # source
  7. a1.sources.r1.type = spooldir
  8. a1.sources.r1.spoolDir = /export/data/flume
  9. a1.sources.r1.fileHeader = true
  10.  
  11. # Describe the sink
  12. a1.sinks.k1.type = avro
  13. #这是接收方
  14. a1.sinks.k1.hostname = 192.168.31.172
  15. a1.sinks.k1.port = 8888
  16.  
  17. # Use a channel which buffers events in memory
  18. a1.channels.c1.type = memory
  19. a1.channels.c1.capacity = 1000
  20. a1.channels.c1.transactionCapacity = 100
  21.  
  22. # Bind the source and sink to the channel
  23. a1.sources.r1.channels = c1
  24. a1.sinks.k1.channel = c1

flume-push.conf

  2.pull的方式

    属于推荐的方式,通过streaming来主动拉取flume产生的数据

    编写代码:(依赖同上)

  1. package com.streaming
  2.  
  3. import java.net.InetSocketAddress
  4.  
  5. import org.apache.spark.SparkConf
  6. import org.apache.spark.storage.StorageLevel
  7. import org.apache.spark.streaming.flume.FlumeUtils
  8. import org.apache.spark.streaming.{Seconds, StreamingContext}
  9.  
  10. object FlumePollWordCount {
  11. def main(args: Array[String]) {
  12. val conf = new SparkConf().setAppName("FlumePollWordCount").setMaster("local[2]")
  13. val ssc = new StreamingContext(conf, Seconds(5))
  14. //从flume中拉取数据(flume的地址),通过Seq序列,里面可以new多个地址,从多个flume地址拉取
  15. val address = Seq(new InetSocketAddress("172.16.0.11", 8888))
  16. val flumeStream = FlumeUtils.createPollingStream(ssc, address, StorageLevel.MEMORY_AND_DISK)
  17. val words = flumeStream.flatMap(x => new String(x.event.getBody().array()).split(" ")).map((_,1))
  18. val results = words.reduceByKey(_+_)
  19. results.print()
  20. ssc.start()
  21. ssc.awaitTermination()
  22. }
  23. }

      配置flume

  通过拉取的方式需要flume的lib目录中有相关的JAR(要通过spark程序来调flume拉取),通过官网可以得知具体的JAR信息:

  

    配置flume:

  1. # Name the components on this agent
  2. a1.sources = r1
  3. a1.sinks = k1
  4. a1.channels = c1
  5.  
  6. # source
  7. a1.sources.r1.type = spooldir
  8. a1.sources.r1.spoolDir = /export/data/flume
  9. a1.sources.r1.fileHeader = true
  10.  
  11. # Describe the sink(配置的是flume的地址,等待拉取)
  12. a1.sinks.k1.type = org.apache.spark.streaming.flume.sink.SparkSink
  13. a1.sinks.k1.hostname = mini1
  14. a1.sinks.k1.port = 8888
  15.  
  16. # Use a channel which buffers events in memory
  17. a1.channels.c1.type = memory
  18. a1.channels.c1.capacity = 1000
  19. a1.channels.c1.transactionCapacity = 100
  20.  
  21. # Bind the source and sink to the channel
  22. a1.sources.r1.channels = c1
  23. a1.sinks.k1.channel = c1

flume-poll.conf

    启动flume,然后启动IDEA中的spark streaming:

  1. bin/flume-ng agent -c conf -f conf/netcat-logger.conf -n a1 -Dflume.root.logger=INFO,console
  2. // -D后参数可选

二、spark streaming整合kafka

  前导知识,复习kafka:http://www.cnblogs.com/jiangbei/p/8537625.html

  1.引入依赖

  1. <dependency>
  2. <groupId>org.apache.spark</groupId>
  3. <artifactId>spark-streaming-kafka_2.10</artifactId>
  4. <version>${spark.version}</version>
  5. </dependency>

  2.编写代码

  1. package com.streaming
  2.  
  3. import org.apache.spark.{HashPartitioner, SparkConf}
  4. import org.apache.spark.storage.StorageLevel
  5. import org.apache.spark.streaming.kafka.KafkaUtils
  6. import org.apache.spark.streaming.{Seconds, StreamingContext}
  7.  
  8. object KafkaWordCount {
  9. val updateFunc = (iter: Iterator[(String, Seq[Int], Option[Int])]) => {
  10. //iter.flatMap(it=>Some(it._2.sum + it._3.getOrElse(0)).map(x=>(it._1,x)))
  11. iter.flatMap { case (x, y, z) => Some(y.sum + z.getOrElse(0)).map(i => (x, i)) }
  12. }
  13. def main(args: Array[String]): Unit = {
  14. val Array(zkQuorum, group, topics, numThreads) = args
  15. val conf = new SparkConf().setAppName("kafkaWordCount").setMaster("local[2]")
  16. val ssc = new StreamingContext(conf, Seconds(5))
  17. // 设置ck
  18. ssc.checkpoint("F:/ck")
  19. // 产生topic的map
  20. val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap
  21. // data是一个DStream
  22. val data = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap, StorageLevel.MEMORY_AND_DISK_SER)
  23. val words = data.map(_._2).flatMap(_.split(" "))
  24. // 使用update进行累加统计
  25. val wordCounts = words.map((_, 1)).updateStateByKey(updateFunc, new HashPartitioner(ssc.sparkContext.defaultParallelism), true)
  26. // 启动
  27. ssc.start()
  28. ssc.awaitTermination()
  29. }
  30. }

   结合kafka也是存在两种拉取数据的形式,包括Receiver和Direct两种形式

   更多参考https://www.cnblogs.com/xlturing/p/6246538.html

        IBM示例

  但是使用更多的是Direct的直连方式,因为直连方式使用的不需要记录日志,不会影响性能

    使用实例,参考https://blog.csdn.net/ligt0610/article/details/47311771

大数据入门第二十四天——SparkStreaming(二)与flume、kafka整合的更多相关文章

  1. 大数据入门第二十四天——SparkStreaming(一)入门与示例

    一.概述 1.什么是spark streaming Spark Streaming is an extension of the core Spark API that enables scalabl ...

  2. 大数据入门第二十五天——elasticsearch入门

    一.概述 推荐路神的ES权威指南翻译:https://es.xiaoleilu.com/010_Intro/00_README.html 官网:https://www.elastic.co/cn/pr ...

  3. 大数据入门第二十五天——logstash入门

    一.概述 1.logstash是什么 根据官网介绍: Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然后将数据发送到您最喜欢的 “存储库” 中.(我们的存储库 ...

  4. 大数据入门第二十三天——SparkSQL(二)结合hive

    一.SparkSQL结合hive 1.首先通过官网查看与hive匹配的版本 这里可以看到是1.2.1 2.与hive结合 spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然 ...

  5. 大数据入门第二十二天——spark(一)入门与安装

    一.概述 1.什么是spark 从官网http://spark.apache.org/可以得知: Apache Spark™ is a fast and general engine for larg ...

  6. 大数据入门第十四天——Hbase详解(二)基本概念与命令、javaAPI

    一.hbase数据模型 完整的官方文档的翻译,参考:https://www.cnblogs.com/simple-focus/p/6198329.html 1.rowkey 与nosql数据库们一样, ...

  7. 大数据入门第十四天——Hbase详解(一)入门与安装配置

    一.概述 1.什么是Hbase 根据官网:https://hbase.apache.org/ Apache HBase™ is the Hadoop database, a distributed, ...

  8. 大数据入门第二十二天——spark(二)RDD算子(1)

    一.RDD概述 1.什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的 ...

  9. 大数据入门第二十二天——spark(二)RDD算子(2)与spark其它特性

    一.JdbcRDD与关系型数据库交互 虽然略显鸡肋,但这里还是记录一下(点开JdbcRDD可以看到限制比较死,基本是鸡肋.但好在我们可以通过自定义的JdbcRDD来帮助我们完成与关系型数据库的交互.这 ...

随机推荐

  1. C# Task注意事项

    1.在Task中调用主线程控件 Task.Factory.StartNew(() => { }).ContinueWith(task => { this.Invoke(new Action ...

  2. AngularJS学习之 ngTable 翻页 功能以及利用angular service准备测试数据

    1.官网链接  https://github.com/esvit/ng-table#4.0.0 2.安装ngTable后,一定要记得先注册到自己的项目 .module('pttengApp', [ ' ...

  3. HTTP协议学习随笔

    一 HTTP概述 HTTP简单说其实就是一套语言交流规则!Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱. B/S结构 用户在浏览器, ...

  4. Expo大作战(五)--expo中app.json 文件的配置信息

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. CSS 小结笔记之伸缩布局 (flex)

    CSS flex 是一种伸缩布局,之前块级元素布局在同一行,可以通过display或position或float来实现,而本篇介绍一个新的方法——flex(弹性布局). flex 为和模型布局提供了极 ...

  6. sqlserver 跨服务器备份表

    exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Querie ...

  7. MVC 上传下载

    在Asp.net的WEBform中,上传文件与下载文件处理是很简单的事情,如果转为ASP.NET MVC呢?那就没有那么容易了,难少少,也不是很难,一起来看下本文吧.本文主要讲如何在Asp.net M ...

  8. Spine Skeleton Animation(2D骨骼动画)

    骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...

  9. 内网DHCP攻击

    局域网内DHCP攻击 实验环境:两个win2008 r2虚拟机(一台用作正常的DHCP服务器,另一台用作伪造DHCP服务器),两个win7虚拟机(用作客户机),一个kali虚拟机(用作攻击,耗尽DHC ...

  10. 51nod 贪心算法题集

    2070 最小罚款: 题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w.问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间. 分析:任务按时间排个 ...