SparkStreaming两个小Demo

来源:互联网 发布:淘宝保存的图片找不到 编辑:程序博客网 时间:2024/06/07 07:06

通过对Spark Streaming的基本使用介绍后,我这次写了两个小DEMO,加深下对其的使用。

一、Spark Streaming处理文件系统数据

流程图为:


通过SparkStreaming来监听一个固定socket上的数据,获取socket上的数据,然后存储到内存中,再对数据做其他操作。由于socket已经占用了一个资源,所以local[N],N线程数要大于1才能有资源腾出给其他操作。

代码如下:

import org.apache.spark.SparkConfimport org.apache.spark.streaming.{Seconds, StreamingContext}/**  * Spark Streaming处理Socket数据  *  * 测试: nc  */object NetworkWordCount {  def main(args: Array[String]): Unit = {    val sparkConf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")    /**      * 创建StreamingContext需要两个参数:SparkConf和batch interval      */    val ssc = new StreamingContext(sparkConf, Seconds(5))    val lines = ssc.socketTextStream("localhost", 6789)    val result = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)    result.print()    ssc.start()    ssc.awaitTermination()  }}
 首先创建SparkConf文件,由于监听socket端口,sparkstreaming中需要占用一个receiver,所以此处需要设置为local[2],设置了两个线程,腾出一个资源来进行Transformation和outp operation操作,然后再创建SparkStreamingContext入口对象,此处设置的5s一批次,通过这个streaming对象调用socketTextStream,此时的lines就相当于是个DStream,然后进行flatMap操作,实现字母求和,相当于是进行Transformation操作,最后将结果打印出来,相当于是进行output operations操作。最后用nc -lk 6789进行测试。

注意添加下面两个依赖:

<dependency>            <groupId>com.fasterxml.jackson.module</groupId>            <artifactId>jackson-module-scala_2.11</artifactId>            <version>2.6.5</version>        </dependency>        <dependency>            <groupId>net.jpountz.lz4</groupId>            <artifactId>lz4</artifactId>            <version>1.3.0</version>        </dependency>

二、Spark Streaming处理文件系统数据

代码如下:

import org.apache.spark.SparkConfimport org.apache.spark.streaming.{Seconds, StreamingContext}/**  * 使用Spark Streaming处理文件系统(local/hdfs)的数据  */object FileWordCount {  def main(args: Array[String]): Unit = {    val sparkConf = new SparkConf().setMaster("local").setAppName("FileWordCount")    val ssc = new StreamingContext(sparkConf, Seconds(5))    val lines = ssc.textFileStream("file:///Users/rocky/data/imooc/ss/")    val result = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)    result.print()    ssc.start()    ssc.awaitTermination()  }}
由于文件系统是本地的,所以可以直接设置为local,采用textFileStream的方法,监控ss文件夹里面文件的变化,并将这些变化进行transformation处理,注意此处要采用的move或put的方式移动文件到该文件夹,不支持递归嵌套的文件夹,文件夹里文件形式要一样,一旦将某文件移动到该文件夹,该文件不能再添加新的数据,即使添加新的数据也不处理,除非再移动进来一个新的文件。


原创粉丝点击