Spark练习之通过Spark Streaming实时计算wordcount程序

Java版本

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import scala.Tuple2; import java.util.Iterator; /**
* 实时wordcount程序
*/
public class JavaSparkStreaming { public static void main(String[] args) throws InterruptedException {
//创建SparkConf对象
//要给它设置一个Master属性,但是我们测试的时候使用local模式
//local后面必须跟一个方括号,里面填写一个数字,数字代表了我们用几个线程来执行
//我们的spark streaming程序
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("JavaSparkStreaming");
//创建JavaStreamingContext对象
//类似于Spark Core中的JavaSparkContext,类似于Spark SQL中的SQLContext
//该对象除了接收SparkConf对象外
//还必须接收一个batch interval参数,就是说,每手机多长时间的数据,划分为一个batch进行处理
//当前设置为1秒
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1)); //首先,创建输入DStream,代表了一个从数据源(比如kafka、socket)来的持续不断的实时数据流
//调用JavaStreamingContext的socketTextStream()方法,创建一个数据源为socket网络端口的数据流
//JavaReceiverInputDStream代表了一个输入的DStream
//socketTextStream()方法接收两个基本参数,第一个是监听那个主机上的端口,第二个是监听哪个端口
JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999); //至此,可以理解为JavaReceiverInputDStream中的,每隔一秒,会有一个RDD
//其中封装了这一秒发送过来的数据
//RDD的元素类型为String,即一行一行的文本
//所以,这里JavaReceiverInputDStream的泛型类型为<String>,其实代表了底层的RDD的泛型类型 //开始对接收到的数据,执行计算,使用Spark Core提供的算子,执行应用在DStream中即可
//在底层,实际上是会对DStream中的一个一个的RDD,执行我们应用在DStream上的算子
//产生新的RDD,会作为新DStream中的RDD JavaDStream<String> words = lines.flatMap(
new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) throws Exception {
return null;
//return Arrays.asList(line.spilt(" "));
}
}
); //此时,每秒的数据,一行一行的文本,就会被拆分为多个单词,words DStream中的RDD的元素类型
//即为一个一个的单词 //接着,开始进行flatMap、reduceByKey操作
JavaPairDStream<String, Integer> pairs = words.mapToPair(
new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String, Integer>(word, 1);
}
}
);
//用Java Streaming开发程序和Java Core很像
//唯一不同的是,Spark Core中的JavaRDD、JavaPairRDD,都变成了JavaDStream、JavaPairDStream JavaPairDStream<String, Integer> wordCounts = pairs.reduceByKey(
new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
}
); //每秒中发送到指定socket端口上的数据,都会被line DStream接收到
//然后lines DStream会把每秒的数据,也就是一行一行的文本,诸如hello world,封装为一个RDD
//然后,就会对每秒中对应的RDD,执行后续的一系列算子操作
//比如,对Lines RDD执行了flatMap之后,得到了一个words RDD,作为words DStream中的一个RDD
//以此类推,直到生成最后一个wordCount RDD,作为wordCounts DStream中的一个RDD
//此时,就得到了每秒钟发送过来的数据的单词统计
//注意:Spark Streaming的计算模型,决定了我们必须自己来进行中间缓存的控制
//比如写入redis等缓存
//它的计算模型跟storm是完全不同的,storm是自己编写的一个一个的程序,运行在节点上
//相当于一个一个的对象,可以自己在对象中控制缓存
//但是Spark本身是函数式编程的计算模型,所以,比如在words或pairs DStream中
//没法实例变量进行缓存
//此时,就只能将最后计算出的wordCounts中的一个一个的RDD,写入外部的缓存,或者持久化DB //最后,每次计算完,都打印一下这一秒钟的单词技术情况
//并休眠5秒钟,以便于我们测试和观察 Thread.sleep(5000);
wordCounts.print(); //对JavaStreamingContext进行后续处理
//必须调用JavaStreamingContext的start()方法,整个Spark Steaming Application才会启动执行
//否则不会执行
jssc.start();
jssc.awaitTermination();
jssc.close(); }
}

Scala版本

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext} /**
* wordcount
*/
object ScalaSparkStreaming { def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[2]").setMaster("ScalaSparkStreaming") //scala中,创建的是StreamingContext
val ssc = new StreamingContext(conf, Seconds(1)) val lines = ssc.socketTextStream("localhost", 9999)
val words = lines.flatMap {
_.split(" ")
}
val pairs = words.map {
word => (word, 1)
}
val wordCounts = pairs.reduceByKey {
_ + _
} Thread.sleep(5000)
wordCounts.print() ssc.start()
ssc.awaitTermination() }
}

pom.xml

切记要对应好Spark 和 Scala的版本。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>spark</groupId>
<artifactId>com.spark</artifactId>
<version>1.0-SNAPSHOT</version> <name>SparkTest</name>
<url>http://maven.apache.org</url> <properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spark.version>2.3.0</spark.version>
<hadoop.version>2.6.4</hadoop.version>
<encoding>UTF-8</encoding>
</properties> <dependencies>
<!-- spark依赖-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<!-- hadoop依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!-- 编译java的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

Spark练习之通过Spark Streaming实时计算wordcount程序的更多相关文章

  1. Spark Streaming实时计算框架介绍

    随着大数据的发展,人们对大数据的处理要求也越来越高,原有的批处理框架MapReduce适合离线计算,却无法满足实时性要求较高的业务,如实时推荐.用户行为分析等. Spark Streaming是建立在 ...

  2. 【Streaming】30分钟概览Spark Streaming 实时计算

    本文主要介绍四个问题: 什么是Spark Streaming实时计算? Spark实时计算原理流程是什么? Spark 2.X下一代实时计算框架Structured Streaming Spark S ...

  3. 【转】Spark Streaming 实时计算在甜橙金融监控系统中的应用及优化

    系统架构介绍 整个实时监控系统的架构是先由 Flume 收集服务器产生的日志 Log 和前端埋点数据, 然后实时把这些信息发送到 Kafka 分布式发布订阅消息系统,接着由 Spark Streami ...

  4. spark streaming 实时计算

    spark streaming 开发实例 本文将分以下几部分 spark 开发环境配置 如何创建spark项目 编写streaming代码示例 如何调试 环境配置: spark 原生语言是scala, ...

  5. 50、Spark Streaming实时wordcount程序开发

    一.java版本 package cn.spark.study.streaming; import java.util.Arrays; import org.apache.spark.SparkCon ...

  6. demo2 Kafka+Spark Streaming+Redis实时计算整合实践 foreachRDD输出到redis

    基于Spark通用计算平台,可以很好地扩展各种计算类型的应用,尤其是Spark提供了内建的计算库支持,像Spark Streaming.Spark SQL.MLlib.GraphX,这些内建库都提供了 ...

  7. Spark Streaming——Spark第一代实时计算引擎

    虽然SparkStreaming已经停止更新,Spark的重点也放到了 Structured Streaming ,但由于Spark版本过低或者其他技术选型问题,可能还是会选择SparkStreami ...

  8. 【慕课网实战】Spark Streaming实时流处理项目实战笔记二之铭文升级版

    铭文一级: 第二章:初识实时流处理 需求:统计主站每个(指定)课程访问的客户端.地域信息分布 地域:ip转换 Spark SQL项目实战 客户端:useragent获取 Hadoop基础课程 ==&g ...

  9. 大数据开发实战:Spark Streaming流计算开发

    1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...

随机推荐

  1. 数据库分库分表容量划分建议参考阿里云DRDS原则

    做分库分表的时候 一直想知道分库分表容量的最优规则有什么好的建议,以下是参考阿里云 DRDS 分库分表的规则,还是有一定的参考意义 .

  2. excel字符串拼接

    函数:CONCATENATE() 参数可以是文本值.数字或单元格引用. 文本值和数字使用双引号括住,单元格引用直接使用.例如 =CONCATENATE("abc",A2),设A2为 ...

  3. 论文阅读 Characterization of Multiple 3D LiDARs for Localization and Mapping using Normal Distributions Transform

    Abstract 在这个文章里, 我们细致的比较了10种不同的3D LiDAR传感器, 用了一般的 Normal Distributions Transform (NDT) 算法. 我们按以下几个任务 ...

  4. Spark MLlib中KMeans聚类算法的解析和应用

    聚类算法是机器学习中的一种无监督学习算法,它在数据科学领域应用场景很广泛,比如基于用户购买行为.兴趣等来构建推荐系统. 核心思想可以理解为,在给定的数据集中(数据集中的每个元素有可被观察的n个属性), ...

  5. 洛谷P4848 崂山白花蛇草水 权值线段树+KDtree

    题目描述 神犇 \(Aleph\) 在 \(SDOI\ Round2\) 前立了一个 \(flag\):如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 \(Aleph\) 的实力,他轻松地进了山 ...

  6. vue element 表单验证不通过,滚动到固对应位置

    我们在使用elementIUI实现表单验证,内容比较多的时候,提示内容会被遮挡,这时候用户不清楚什么情况,还会连续点击提交按钮.这个时候需求来啦:我们需要在表单验证不通过的时候,页面滚动到对应的位置. ...

  7. 用python+sklearn(机器学习)实现天气预报数据 模型和使用

    用python+sklearn机器学习实现天气预报 模型和使用 项目地址 系列教程 0.前言 1.建立模型 a.准备 引入所需要的头文件 选择模型 选择评估方法 获取数据集 b.建立模型 c.获取模型 ...

  8. python+sklearn+kaggle机器学习

    python+sklearn+kaggle机器学习 系列教程 0.kaggle 1. 初级线性回归模型机器学习过程 a. 提取数据 b.数据预处理 c.训练模型 d.根据数据预测 e.验证 今天是10 ...

  9. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  10. PC个人隐私保护小方法

    前言 近期爆出了腾讯读取用户浏览器浏览记录的消息.话不过说直接上图,懂的自然懂. 网上也有详细的分析文章,不管它读取后用来做什么,在你不知情的情况下读取了你的浏览器浏览记录,你说气不气. 虽然在整体大 ...