spark steaming java_Spark Streaming 实现数据实时统计案例

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

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

上图讲解

832f30a0bd5aa16d3957026676a98eb3.png

运行环境:需要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 socketTextStream=jsc.socketTextStream("10.115.27.234", 1000);

JavaDStream wordsDstream=socketTextStream.flatMap(new FlatMapFunction() {

private static final long serialVersionUID=1L;

public Iterable call(String line) throws Exception {

return Arrays.asList(line.split(" "));

}

});

JavaPairDStream wordsToPairDstream=wordsDstream.mapToPair(new PairFunction() {

private static final long SerialVersionUID=1L;

public Tuple2 call(String word) throws Exception {

return new Tuple2(word, 1);

}

});

/**

* 一个batch对应一个RDD。

* */

JavaPairDStream resultDstream=wordsToPairDstream.updateStateByKey(new Function2, Optional, Optional>() {

private static final long serialVersionUID=1L;

public Optional call(List values, Optional 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这个进程,否则会一直运行下去。因为它的原理就是和自来水的水流一样,是一连串的数据流。

运行结果展示:

e41ba0b95ea2608350fba4b076d2f0bb.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值