欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文将帮助您使用基于HBase的Apache Spark Streaming。Spark Streaming是Spark API核心的一个扩展,支持连续的数据流处理。

什么是Spark Streaming?

首先,什么是流(streaming)?数据流是连续到达的无穷序列。流处理将不断流动的输入数据分成独立的单元进行处理。流处理是对流数据的低延迟处理和分析。Spark Streaming是Spark API核心的扩展,可实现实时数据的快速扩展,高吞吐量,高容错处理。Spark Streaming适用于大量数据的快速处理。实时处理用例包括:

  • 网站监控,网络监控
  • 欺诈识别
  • 网页点击
  • 广告
  • 物联网传感器

Spark Streaming支持如HDFS目录,TCP套接字,Kafka,Flume,Twitter等数据源。数据流可以用Spark 的核心API,DataFrames SQL,或机器学习的API进行处理,并且可以被保存到HDFS,databases或Hadoop OutputFormat提供的任何文件系统中去。

Spark Straming如何工作

Spark Streaming将数据流每X秒分作一个集合,称为Dstreams,它在内部是一系列RDD。您的Spark应用程序使用Spark API处理RDD,并且批量返回RDD操作的结果。

示例应用程序的体系结构

Spark Streaming示例代码执行以下操作:

  • 读取流式数据。
  • 处理流数据。
  • 将处理后的数据写入HBase表。

其他Spark示例代码执行以下操作:

  • 读取流媒体代码编写的HBase Table数据
  • 计算每日汇总的统计信息
  • 将汇总统计信息写入HBase表

示例数据集

油泵传感器数据文件放入目录中(文件是以逗号为分隔符的CSV)。Spark Streaming将监视目录并处理在该目录中创建的所有文件。(如前所述,Spark Streaming支持不同的流式数据源;为简单起见,此示例将使用CSV。)

以下是带有一些示例数据的csv文件示例:

我们使用Scala案例类来定义与传感器数据csv文件相对应的传感器模式,并使用parseSensor函数将逗号分隔值解析到传感器案例类中。

HBase表格模式

流数据的HBase表格模式如下:

  • 泵名称日期和时间戳的复合行键
  • 可以设置报警列簇,来监控数据。请注意,数据和警报列簇可能会设为在一段时间后失效。

日常统计汇总的模式如下所示:

  • 泵名称和日期的复合行键
  • 列簇统计
  • 最小值,最大值和平均值。

下面的函数将Sensor对象转换为HBase Put对象,该对象用于将数据行插入到HBase中。

写HBase表的配置

您可以使用Spark 的TableOutputFormat类写入HBase表,这与您从MapReduce写入HBase表的方式类似。下面我们使用TableOutputFormat类设置HBase的配置。

Spark Streaming示例代码

这些是Spark Streaming代码的基本步骤:

  1. 初始化Spark StreamingContext对象。
  2. 将转换和输出操作应用于DStream。
  3. 开始接收数据并使用streamingContext.start()处理它。
  4. 等待streamingContext.awaitTermination()的返回从而停止处理。

我们将通过示例应用程序代码完成这些步骤。

初始化StreamingContext

首先,我们创建一个StreamingContext,这是流式传输的主要入口点(2秒间隔时间)。

  1. val sparkConf = new SparkConf ( ) . setAppName ( "HBaseStream" )
  2. // 创建 StreamingContext, 流式函数的主要入口
  3. val ssc = new StreamingContext ( sparkConf , Seconds ( 2 ) )

接下来,我们使用StreamingContext textFileStream(directory)方法创建一个输入流,该输入流监视Hadoop兼容的文件系统以获取新文件,并处理在该目录中创建的所有文件。

  1. // 创建代表数据 DStream对象
  2. val linesDStream = ssc . textFileStream ( "/user/user01/stream" )

linesDStream代表数据流,每个记录都是一行文本。内部DStream是一系列RDD,每个批处理间隔一个RDD。

将转换和输出操作应用于DStream

接下来,我们将数据行解析为Sensor对象,并使用DStream行上的map操作。

  1. // 把lineDSream的每一行解析为Sensor对象
  2. val sensorDStream = linesDStream . map ( Sensor . parseSensor )

map操作在linesDStream中的RDD上使用Sensor.parseSensor函数,从而生成Sensor对象(RDD)。

接下来,我们使用DStream foreachRDD方法将处理应用于此DStream中的每个RDD。我们过滤低psi传感器对象以创建警报,然后我们通过将传感器和警报数据转换为Put对象并使用PairRDDFunctions saveAsHadoopDataset方法将传感器和警报数据写入HBase ,该方法使用Hadoop将RDD输出到任何支持Hadoop的存储系统,该存储系统的配置对象(请参阅上面的HBase的Hadoop配置)。

  1. // 对每一个RDD.
  2. sensorRDD . foreachRDD { rdd =>
  3. // 低psi的传感器过滤器
  4. val alertRDD = rdd . filter ( sensor => sensor . psi < 5.0 )
  5. // 把传感器数据转为对象并写入HD
  6. rdd . map ( Sensor . convertToPut ) . saveAsHadoopDataset (jobConfig )
  7. // 把警报转为对象并写入HD
  8. rdd . map ( Sensor . convertToPutAlert ) . saveAsHadoopDataset (jobConfig )
  9. }

sensorRDD对象被转换并写入HBase。

开始接收数据

要开始接收数据,我们必须在StreamingContext上显式调用start(),然后调用awaitTermination来等待计算完成。

  1. // 开始计算
  2. ssc . start ( )
  3. // 等待计算完成
  4. ssc . awaitTermination ( )

Spark R写入HBase

现在我们要读取HBase传感器表数据,计算每日摘要统计信息并将这些统计信息写入。

以下代码读取HBase表,传感器表,psi列数据,使用StatCounter计算此数据的统计数据,然后将统计数据写入传感器统计数据列。

  1. // HBase的读取设置
  2. val conf = HBaseConfiguration . create ( )
  3. conf . set ( TableInputFormat . INPUT_TABLE , HBaseSensorStream . tableName )
  4. // 扫描数据
  5. conf . set ( TableInputFormat . SCAN_COLUMNS , "data:psi" )
  6. // 加载RDD (row key, row Result)元组
  7. val hBaseRDD = sc . newAPIHadoopRDD ( conf , classOf [TableInputFormat ] ,
  8. classOf [ org . apache . hadoop . hbase . io . ImmutableBytesWritable ] ,
  9. classOf [ org . apache . hadoop . hbase . client . Result ] )
  10. // 把(row key, row Result) 元组为RDD
  11. val resultRDD = hBaseRDD.map(tuple => tuple._2)
  12. // 转为 RDD (RowKey, ColumnValue), 移除Time
  13. val keyValueRDD = resultRDD.
  14. map(result => (Bytes.toString(result.getRow()).
  15. split(" ")(0), Bytes.toDouble(result.value)))
  16. // 分组,得到统计数据
  17. val keyStatsRDD = keyValueRDD.
  18. groupByKey().
  19. mapValues(list => StatCounter(list))
  20. // 转码rowkey,统计信息放入并写入hbase
  21. keyStatsRDD.map { case (k, v) => convertToPut(k, v)}.saveAsHadoopDataset(jobConfig)

下图显示newAPIHadoopRDD的输出。PairRDDFunctions saveAsHadoopDataset将Put对象保存到HBase。

软件

运行程序

您可以将代码作为独立应用程序运行,如“MapR Sandbox上的Spark入门教程”中所述。

以下是总的步骤:

  1. 按照MapR沙箱入门Spark中的介绍,用户ID user01,密码mapr。
  2. 使用maven构建应用程序。
  3. 使用scp将jar文件和数据文件复制到沙盒主目录/ user / user01。
  4. 运行应用程序:/ opt / mapr / spark / spark- <version> / bin / spark-submit --driver-class -pathhbase classpath --class examples.HBaseSensorStream sparkstreamhbaseapp-1.0.jar
  5. 将流式数据文件复制到流目录中:cp sensordata.csv /user/user01/stream/
  6. 读取数据并计算一列的数据/ opt / mapr / spark / spark- <version> / bin / spark-submit --driver-class -path hbase classpath - --class examples.HBaseReadWrite sparkstreamhbaseapp-1.0.jar
  7. 计算整行的统计信息/ opt / mapr / spark / spark- <version> / bin / spark-submit --driver-class -path hbase classpath - --class examples.HBaseReadRowWriteStats sparkstreamhbaseapp-1.0.jar

总结

这就结束了关于使用HBase进行Spark Streaming的教程。您可以在相关阅读部分找到更多信息。

问答

相关阅读

Spark Streaming编程指南

Spark Streaming应用与实战全攻略

简谈Spark Streaming的实时计算整合

此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/developer/article/1123173?fromSource=waitui

Spark Streaming入门的更多相关文章

  1. spark streaming 入门例子

    spark streaming 入门例子: spark shell import org.apache.spark._ import org.apache.spark.streaming._ sc.g ...

  2. Spark Streaming 入门指南

    这篇博客帮你开始使用Apache Spark Streaming和HBase.Spark Streaming是核心Spark API的一个扩展,它能够处理连续数据流. Spark Streaming是 ...

  3. Spark Streaming 入门

    概述 什么是 Spark Streaming? Spark Streaming is an extension of the core Spark API that enables scalable, ...

  4. Spark基础:(七)Spark Streaming入门

    介绍 1.是spark core的扩展,针对实时数据流处理,具有可扩展.高吞吐量.容错. 数据可以是来自于kafka,flume,tcpsocket,使用高级函数(map reduce filter ...

  5. 学习笔记:spark Streaming的入门

    spark Streaming的入门 1.概述 spark streaming 是spark core api的一个扩展,可实现实时数据的可扩展,高吞吐量,容错流处理. 从上图可以看出,数据可以有很多 ...

  6. Spark Streaming笔记

    Spark Streaming学习笔记 liunx系统的习惯创建hadoop用户在hadoop根目录(/home/hadoop)上创建如下目录app 存放所有软件的安装目录 app/tmp 存放临时文 ...

  7. Update(Stage4):Spark Streaming原理_运行过程_高级特性

    Spark Streaming 导读 介绍 入门 原理 操作 Table of Contents 1. Spark Streaming 介绍 2. Spark Streaming 入门 2. 原理 3 ...

  8. Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark Streaming简介 1.1 概述 Spark Streaming 是Spa ...

  9. Spark入门实战系列--7.Spark Streaming(下)--实时流计算Spark Streaming实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .实例演示 1.1 流数据模拟器 1.1.1 流数据说明 在实例演示中模拟实际情况,需要源源 ...

随机推荐

  1. 对嵌入式开发C语言结构体的一点总结

    今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...

  2. 一个可以拖动的自定义Gridview代码

    这个可以拖动的gridview继承于gridview,所以,用法和gridview一样, 代码如下: public class DragGridView extends GridView { priv ...

  3. LeetCode之“散列表”:Isomorphic Strings

    题目链接 题目要求: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic i ...

  4. LeetCode之“动态规划”:Dungeon Game

    题目链接 题目要求: The demons had captured the princess (P) and imprisoned her in the bottom-right corner of ...

  5. Auto Create Editable Copy Font(Unity3D开发之二十二)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/48318879 ...

  6. UIScrollView的无限左滑轮播一点也不难

    UIScrollView的轮播在如今的app中用得十分广泛,最初实现的时候方式比较拙劣,滚动到最后一个视图时再返回到第一个看起来非常的不连贯. 今天查询UIScrollView轮播资料,总结两种比较喜 ...

  7. WPF中使用后台代码来控制TreeView的选择项(SelectedItem)以及展开节点操作

    首先为TreeView控件制作一个Style: <Style x:Key="LibraryTreeViewItemStyle" TargetType="{x:Typ ...

  8. mysql性能优化之-innodb_flush_log_at_trx_commit

    innodb_flush_log_at_trx_commit是配置MySql日志何时写入硬盘的参数: 一.参数值说明 0:log buffer将每秒一次地写入log file中,并且log file的 ...

  9. add two numbers(将两个链表相加)

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  10. 有关Java 锁原理

    锁 锁是用来锁东西的,让别人打不开也看不到!在线程中,用这个“锁”隐喻来说明一个线程在“操作”一个目标(如一个变量)的时候,如果变量是被锁住的,那么其他线程就对这个目标既“操作”不了(挂起)也无法看到 ...