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

本文将帮助您使用基于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秒间隔时间)。

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

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

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

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

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

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

// 把lineDSream的每一行解析为Sensor对象
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配置)。

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

sensorRDD对象被转换并写入HBase。

开始接收数据

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

// 开始计算
ssc . start ( )
// 等待计算完成
ssc . awaitTermination ( )

Spark R写入HBase

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

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

// HBase的读取设置
val conf = HBaseConfiguration . create ( )
conf . set ( TableInputFormat . INPUT_TABLE , HBaseSensorStream . tableName )
// 扫描数据
conf . set ( TableInputFormat . SCAN_COLUMNS , "data:psi" )
// 加载RDD (row key, row Result)元组
val hBaseRDD = sc . newAPIHadoopRDD ( conf , classOf [TableInputFormat ] ,
classOf [ org . apache . hadoop . hbase . io . ImmutableBytesWritable ] ,
classOf [ org . apache . hadoop . hbase . client . Result ] )
// 把(row key, row Result) 元组为RDD
val resultRDD = hBaseRDD.map(tuple => tuple._2)
// 转为 RDD (RowKey, ColumnValue), 移除Time
val keyValueRDD = resultRDD.
map(result => (Bytes.toString(result.getRow()).
split(" ")(0), Bytes.toDouble(result.value)))
// 分组,得到统计数据
val keyStatsRDD = keyValueRDD.
groupByKey().
mapValues(list => StatCounter(list))
// 转码rowkey,统计信息放入并写入hbase
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. libevent之event

    就如libevent官网上所写的“libevent - an event notification library”,libevent就是一个基于事件通知机制的库,可以看出event是整个库的核心.e ...

  2. 基于Oracle ADF的应用程序开发

    ADF简介 ADF(Application Development Framework)是Oracle公司为简化J2EE程序开发的复杂性专门开发的一种解决方案,ADF通过减少实现设计模式和应用程序框架 ...

  3. PS 滤镜——Skewing

    %%%% Skewing clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorith ...

  4. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...

  5. HBase replication使用

    hbase-0.90.0的一个重要改进是引入了replication机制,使它的数据完整性得到了进一步的保障.虽然这一功能还不太完善,但是今后必然会变得更加重要. hbase的replication机 ...

  6. nginx日志中添加请求的response日志

    换个新公司,做一些新鲜的事情,经过一天的琢磨,终于成功添加response日志 在nginx的日志中添加接口response的日志 由于此功能在nginx内置的功能中没有,需要安装第三方模块ngx_l ...

  7. Linux命令之文件搜索

    locate  文件名 locate只能搜索文件名,不能搜索文件大小.搜索速度快. locate并不会搜索到那些新加入的文件.新加入文件后,使用updatedb,更新数据库后,再使用locate搜索. ...

  8. Binary Tree Zigzag Level Order Traversal(z字形打印二叉树)

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  9. Day6_正则表达式

    用作匹配数据的方法: print(re.findall('\w','yangshuai 123 asd \n \t')) #w:匹配字母数字下划线 print(re.findall('\W','yan ...

  10. VS 和 VAssistX 常用快捷键

    ----------------------------------------------------------------函数跳转-------------------------------- ...