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生态对实时和离线数据处理的一套完整处理解决方案.除了此套解决方案之外,还有一种非常流行的而且完整的离线和 实时数 ...
随机推荐
- 异步技巧之CompletableFuture
摘自--https://juejin.im/post/5b4622df5188251ac9766f47 异步技巧之CompletableFuture 1.Future接口 1.1 什么是Future? ...
- GitHub上的开源复刻:暗黑破坏神2
现在的00后少年可能已经不太了解<暗黑破坏神2>这款由暴雪打造的经典游戏. 该游戏上市的时候,国内个人家用电脑还没有那么普及,网络游戏也没有那么风靡,现在的孩子可能无法想象,那时候网吧里的 ...
- 测试如何区分前后端bug
当我们测试到前后端分离的项目时,可能就会想这个bug我到底应该指给谁,是前端的问题还是后端的呢,为了让自己更专业,分清前后端问题还是很重要的. 1.如图商品详情中显示[件装:1,中包装:2 ]但是在后 ...
- 利用Python下载:You-Get的安装及使用方法
You-Get是一个非常优秀的网站视频下载工具.使用You-Get可以很轻松的下载到网络上的视频.图片及音乐. 1.打开这个网址https://www.python.org/ 下载并安装Python, ...
- Java 并发编程要点
使用线程 有三种使用线程的方法: 实现 Runnable 接口: 实现 Callable 接口: 继承 Thread 类. 实现 Runnable 和 Callable 接口的类只能当做一个可以在线程 ...
- 改进你的c#代码的5个技巧(四)
像每一篇文章一样,我会重复几行.我在我的Core i3 CPU.4GB主内存和Windows 7平台上测试了以下代码.如果你在不同的硬件配置或使用不同的平台,那么你的输出可能会随着我的输出屏幕而变化, ...
- ctfshow—web—web2
打开靶机,根据提示是SQL注入 打开后看到登录窗口 方法一.手工注入 抓取数据包 开始SQL注入测试 利用万能密码,登录成功 查看回显位置 查询数据库 查询数据库内数据表 如果想整齐一点显示可以添加g ...
- oracle新增ID主键列,如何补全旧数据的ID值
1.创建SEQUENCE CREATE SEQUENCE MONKEY.TEST_ADD_IDCOL_ID CACHE 100; 2.新增表栏位 ALTER TABLE MONKEY.TEST_ADD ...
- WMIC 查看bios配置信息
如何查看我们的主板上的BIOS信息呢?有办法,不用安装任何软件,只需要windows自带的命令提示符就行,哈哈 WMIC BIOS LIST FULL /FORMAT:VALUE 如果第一次使用wmi ...
- REUSE_ALV_FIELDCATALOG_MERGE函数
今天使用REUSE_ALV_FIELDCATALOG_MERGE函数,就是获取不到fieldcat, 搞了半天才发现,原来参数要全部大写才行!!小写字符就是获取不到,唉,悲哀...