Spark Streaming 实现数据实时统计案例

简介:

Spark 是一个基于内存式的分布式计算框架。具有高性能,高效可扩展,容错等优点。

今天讲解一下spark的流计算,其实它也不完全是实时的流计算,算是一种准实时的流计算。

上图讲解

wKioL1mBkdWgOSwnAALuUoHNwWU764.png-wh_50

运行环境:需要linux环境下的spark环境

本例用的centOS 6.5x64 因为需要使用TCP协议传输数据,所以需要安装一个nc插件。

安装方式: yum  install ncxxx 或者挂载光盘安装

安装后启动nc -lk 9999 端口可以随便指定,最好是1024以上的就可以。

下面贴出代码

java版本的

import java.util.Arrays;
import java.util.List;
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 com.google.common.base.Optional;

import scala.Tuple2;
public class SparkDemo {
	public static void main(String[] args) {
		SparkConf conf=new SparkConf().setAppName("sparkDemo2").setMaster("local[3]");
		JavaStreamingContext jsc=new JavaStreamingContext(conf,Durations.seconds(5));
		//使用带状态的算子,需要checkpoint做容错处理
		jsc.checkpoint("D://chkspark");
		JavaReceiverInputDStream<String> socketTextStream=jsc.socketTextStream("10.115.27.234", 1000);
		JavaDStream<String> wordsDstream=socketTextStream.flatMap(new FlatMapFunction<String, String>() {

			private static final long serialVersionUID=1L;
			public Iterable<String> call(String line) throws Exception {
					return Arrays.asList(line.split(" "));
			}
			});
		JavaPairDStream<String, Integer> wordsToPairDstream=wordsDstream.mapToPair(new PairFunction<String, String,Integer>() {

			private static final long SerialVersionUID=1L;
			public Tuple2<String, Integer> call(String word) throws Exception {
				
				return new Tuple2<String, Integer>(word, 1);
			}
		});
		/**
		 * 一个batch对应一个RDD。 
		 * */ 
		JavaPairDStream<String, Integer> resultDstream=wordsToPairDstream.updateStateByKey(new Function2<List<Integer>, Optional<Integer>, Optional<Integer>>() {

			private static final long serialVersionUID=1L;
			public Optional<Integer> call(List<Integer> values, Optional<Integer> state) throws Exception {
				Integer oldValue=0;   //默认旧value是0
				if (state.isPresent()) {
					oldValue=state.get();
				}
				for (Integer value:values) {
					oldValue+=value;
				}
				return Optional.of(oldValue);
			}
		});
		//打印结果
		resultDstream.print();
		jsc.start();
		jsc.awaitTermination();
	}
}

程序测试: 从linux端的nc 下输入任意字符串,spark streaming会实时对输入的数据做出统计。类似于wordcount. 除非手动kill这个进程,否则会一直运行下去。因为它的原理就是和自来水的水流一样,是一连串的数据流。

运行结果展示:

wKiom1mBk-LCML2DAACguUayFE4171.png-wh_50

也可以用scala写出同样的程序,代码量更少。

需要深入理解spark streaming的架构原理。

本文转自  ChinaUnicom110  51CTO博客,原文链接:http://blog.51cto.com/xingyue2011/1953031

相关文章
|
3月前
|
分布式计算 流计算 Spark
【赵渝强老师】Spark Streaming中的DStream
本文介绍了Spark Streaming的核心概念DStream,即离散流。DStream通过时间间隔将连续的数据流转换为一系列不连续的RDD,再通过Transformation进行转换,实现流式数据的处理。文中以MyNetworkWordCount程序为例,展示了DStream生成RDD的过程,并附有视频讲解。
|
4月前
|
设计模式 数据采集 分布式计算
企业spark案例 —出租车轨迹分析
企业spark案例 —出租车轨迹分析
146 0
|
4月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
99 0
|
4月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
77 0
|
4月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
124 0
|
4月前
|
消息中间件 分布式计算 Kafka
大数据-102 Spark Streaming Kafka ReceiveApproach DirectApproach 附带Producer、DStream代码案例
大数据-102 Spark Streaming Kafka ReceiveApproach DirectApproach 附带Producer、DStream代码案例
83 0
|
4月前
|
SQL 分布式计算 大数据
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(一)
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(一)
72 0
|
4月前
|
存储 分布式计算 大数据
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(二)
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(二)
75 0
|
存储 分布式计算 Spark
Spark会把数据都载入到内存么?
这篇文章算是个科普贴。如果已经熟悉Spark的就略过吧。
1915 0
|
存储 分布式计算 Spark
Spark会把数据都载入到内存么?
前言         很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。   比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导:   RDD的定义,RDD是一个分布式的不可变数据集合   Spark 是一个内
2463 0