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. Centos7安装(本文档采用CentOS7 mini版本)

    选择[语言],点击[继续]等待出现以下界面 一.下载 centos: centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso 二.VMware Wo ...

  2. vue 过滤器 filter 的使用

    1.局部过滤器的使用 比如性别,订单状态的数据,后端一般返回数字来代替状态.以性别为模拟数据,0是未知,1是男,2是女. 直接数据渲染出来,只有012,没有性别 根据后端返回的int类型值,前端对数据 ...

  3. 建立索引和创建视图(结合YGGL.sql)

    一.请按要求对YGGL库建立相关索引 (1)使用create index 语句创建索引 1.对employees表中的员工部门号创建普通索引depart_ind. mysql> create i ...

  4. Solon rpc 之 SocketD 协议 - 消息订阅模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  5. ASP.NET Core 上传文件到共享文件夹

    参考资料:ASP.NET 上传文件到共享文件夹 创建共享文件夹参考资料:https://www.cnblogs.com/dansediao/p/5712657.html 一.配置上传文件相关参数并读取 ...

  6. WebApi 中请求的 JSON 数据字段作为 POST 参数传入

    使用 POST 方式请求 JSON 数据到服务器 WebAPI 接口时需要将 JSON 格式封装成数据模型接收参数.即使参数较少,每个接口仍然需要单独创建模型接收.下面方法实现了将 JSON 参数中的 ...

  7. Centos 6.5 Rabbitmq 安装和集群,镜像部署

    centos 6.5 rabbitmq 安装和集群,镜像部署 安装erlang: yum install gcc glibc-devel make ncurses-devel openssl-deve ...

  8. Tomcat的整体架构

    Tomcat通过连接器和容器这两个核心组件完成整体工作,连接器负责处理socket连接和网络字节流与Request和Response对象的转化:容器负责加载和管理Servlet,以及具体处理Reque ...

  9. ctfhub技能树—sql注入—报错注入

    打开靶机 payload 1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.c ...

  10. EF Core 6.0的新计划

    今天,我们很兴奋地与你分享Entity Framework Core 6.0的计划. 这个计划汇集了许多人的意见,并概述了我们打算在哪里以及如何优化实体框架(EF Core) 6.0版本.这个计划并不 ...