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程序的更多相关文章
- Spark Streaming实时计算框架介绍
随着大数据的发展,人们对大数据的处理要求也越来越高,原有的批处理框架MapReduce适合离线计算,却无法满足实时性要求较高的业务,如实时推荐.用户行为分析等. Spark Streaming是建立在 ...
- 【Streaming】30分钟概览Spark Streaming 实时计算
本文主要介绍四个问题: 什么是Spark Streaming实时计算? Spark实时计算原理流程是什么? Spark 2.X下一代实时计算框架Structured Streaming Spark S ...
- 【转】Spark Streaming 实时计算在甜橙金融监控系统中的应用及优化
系统架构介绍 整个实时监控系统的架构是先由 Flume 收集服务器产生的日志 Log 和前端埋点数据, 然后实时把这些信息发送到 Kafka 分布式发布订阅消息系统,接着由 Spark Streami ...
- spark streaming 实时计算
spark streaming 开发实例 本文将分以下几部分 spark 开发环境配置 如何创建spark项目 编写streaming代码示例 如何调试 环境配置: spark 原生语言是scala, ...
- 50、Spark Streaming实时wordcount程序开发
一.java版本 package cn.spark.study.streaming; import java.util.Arrays; import org.apache.spark.SparkCon ...
- demo2 Kafka+Spark Streaming+Redis实时计算整合实践 foreachRDD输出到redis
基于Spark通用计算平台,可以很好地扩展各种计算类型的应用,尤其是Spark提供了内建的计算库支持,像Spark Streaming.Spark SQL.MLlib.GraphX,这些内建库都提供了 ...
- Spark Streaming——Spark第一代实时计算引擎
虽然SparkStreaming已经停止更新,Spark的重点也放到了 Structured Streaming ,但由于Spark版本过低或者其他技术选型问题,可能还是会选择SparkStreami ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记二之铭文升级版
铭文一级: 第二章:初识实时流处理 需求:统计主站每个(指定)课程访问的客户端.地域信息分布 地域:ip转换 Spark SQL项目实战 客户端:useragent获取 Hadoop基础课程 ==&g ...
- 大数据开发实战:Spark Streaming流计算开发
1.背景介绍 Storm以及离线数据平台的MapReduce和Hive构成了Hadoop生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...
随机推荐
- 万字概览 Java 虚拟机
为什么要学习 JVM 在很多 Java 程序员的开发生涯里,JVM 一直是黑盒子一般的存在,大家只知道运行 Java 程序需要依靠 JVM,千篇一律的配置几个类似 -Xms 和 -Xmx 的参数,可能 ...
- JavaCV FFmpeg AAC编码
上次成功通过FFmpeg采集麦克风的PCM数据,这次针对上一次的程序进行了改造,使用AAC编码采集后的数据. (传送门) JavaCV FFmpeg采集麦克风PCM音频数据 采集麦克风数据是一个解码过 ...
- 使用IDEA构建Spring Boot项目简单实例
一.介绍 它的目标是简化Spring应用和服务的创建.开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署. Spring Boot ...
- idea破解方式:永久激活
相信很多小伙伴都发现了,每年到年底的时候,idea注册码都大面积的失效,早上到办公室打开电脑发现注册码过期,还要花很长时间找新的: 这里介绍两种破解方式,都是有生之年不到期:与网上现有的方式基本一致. ...
- VMware 16.1虚拟机安装
VMware 16.1创建虚拟机 1.1首先打开我们安装好的VMware点击创建新的虚拟机 典型为自动安装,接口位默认 自定义安装更自由,可以把按需求选择 VMware16版本,只能选择Worksta ...
- 【SpringBoot1.x】 Docker
SpringBoot1.x Docker 核心概念 Docker 是一个开源的应用容器引擎,是一个轻量级容器技术.Docker 支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去, ...
- 【Java】标识符
一.标识符 文章目录 一.标识符 1.标识符的命名规则 2.关键字.保留字.特殊值 3.code Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符.简单的说,凡是程序员自己命名的部分 ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- 【Linux】cp命令的各种妙用
CP 功能: 复制文件或目录 说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件 ...
- C语言流程图画法(C语言学习笔记)
常用符号及其含义 图片来自百度文库 https://wenku.baidu.com/view/beb410dea216147916112853.html 常用结构 N-S图