基于持久化的wordcount程序 foreachRDD

RDD上的持久化操作 大数据实验教学系统RDD上的持久化操作Spark非常重要的一个功能特性就是可以将RDD 持久化在内存中,当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition,这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD ,而不需要计算多次该RDD   巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升10倍。对于迭代式算法和快速交互式 阅读详情

基于持久化的wordCount程序!中途遇到了一个坑!
自己手动封装一个静态线程池,使用RDD的foreachPartition操作,并且在该操作内部,从静态连接池中,通过静态方法,获取一个连接,使用之后再换回来,这样的话,可以在对个RDD的partition之间,也可以复用连接了,而且可以让连接池采取懒创建的策略,并且空闲一段时间后,将其释放掉。
代码:
package com.bynear.spark_Streaming;

import com.bynear.tool.ConnectionPool;
import com.google.common.base.Optional;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.*;
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.sql.Connection;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
 /* 2018/5/16
 * 11:30
 * 基于持久化的wordcount程序
 */
public class PersisWordCount {
    public static void main(String[] args) {
        final SparkConf conf = new SparkConf().setAppName("persiswordcount").setMaster("local[2]");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        JavaStreamingContext jssc = new JavaStreamingContext(jsc, Durations.seconds(5));
        jssc.checkpoint("hdfs://Spark01:9000/zjs/chepoint");
        JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);
        JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterable<String> call(String line) throws Exception {
                return Arrays.asList(line.split(" "));
            }
        });
        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);
            }
        });
        final JavaPairDStream<String, Integer> wordcount = pairs.updateStateByKey(new Function2<List<Integer>, Optional<Integer>, Optional<Integer>>() {
            @Override
            public Optional<Integer> call(List<Integer> values, Optional<Integer> state) throws Exception {
                Integer newValue = 0;
                if (state.isPresent()) {
                    newValue = state.get();
                }
                for (Integer value : values) {
                    newValue += value;
                }
                return Optional.of(newValue);
            }
        });
        wordcount.foreachRDD(new Function<JavaPairRDD<String, Integer>, Void>() {
            @Override
            public Void call(JavaPairRDD<String, Integer> wordCountsRDD) throws Exception {
                wordCountsRDD.foreachPartition(new VoidFunction<Iterator<Tuple2<String, Integer>>>() {
                    @Override
                    public void call(Iterator<Tuple2<String, Integer>> wordcounts) throws Exception {
                        Connection conn = ConnectionPool.getConection();
                        Tuple2<String, Integer> wordcount = null;
                        while (wordcounts.hasNext()) {
                            wordcount = wordcounts.next();
                            String sql = "insert into word (word,count) values ('" + wordcount._1 + "'," + wordcount._2 + ")";
                            System.out.println(sql+conn+"YES");
                            Statement stmt = conn.createStatement();
                            stmt.executeUpdate(sql);
                        }

                        ConnectionPool.returnConnection(conn);
                    }
                });
                return null;
            }
        });


        jssc.start();
        jssc.awaitTermination();
        jssc.stop();
    }
}

手动搭建的线程池

package com.bynear.tool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
/**
 * 2018/5/16
 * 12:24
 */
public class ConnectionPool {
    //    静态的Connection队列
    public static LinkedList<Connection> connectionQueue;
    //      加载驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //    获取连接,多线程访问并发控制
    public synchronized static Connection getConection() {
        connectionQueue = new LinkedList<Connection>();
        try {
            if (connectionQueue.isEmpty()) {
                for (int i = 0; i < 2; i++) {
                    Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.2.10:3306/testdb",
                            "root", "123456");
                    connectionQueue.push(conn);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return connectionQueue.poll();
    }

    public static void returnConnection(Connection conn) {
        connectionQueue.push(conn);
    }
}

最开始自己搭建的线程池中,用的方法为
if (connectionQueue==null) {
for (int i = 0; i < 2; i++) {
Connection conn = DriverManager.getConnection(“jdbc:mysql://192.168.2.10:3306/testdb”,
“root”, “123456”);
connectionQueue.push(conn);
}
}
将代码提交到集群上时,一直抱空指指针。
后来 System.out.println(sql+conn+”YES”);输出一下conn
conn = ConnectionPool.getConection();
insert into wordcount (word,count) values (‘heool,word’,1)nullYES 为null

跑成功代码:
if (connectionQueue.isEmpty()) {
for (int i = 0; i < 2; i++) {
Connection conn = DriverManager.getConnection(“jdbc:mysql://192.168.2.10:3306/testdb”,
“root”, “123456”);
connectionQueue.push(conn);
}
}
输出结果:在SQL中查询:
mysql> select * from word;
+—-+———————+————+——-+
| id | updated_time | word | count |
+—-+———————+————+——-+
| 1 | 2018-05-16 01:11:10 | ???,?? | 1 |
| 2 | 2018-05-16 01:11:15 | ???,?? | 1 |
| 3 | 2018-05-16 01:13:00 | hello,word | 1 |
| 4 | 2018-05-16 01:16:00 | hello | 1 |
| 5 | 2018-05-16 01:16:00 | word | 1 |
| 6 | 2018-05-16 01:16:05 | hello | 1 |
| 7 | 2018-05-16 01:16:05 | word | 1 |
+—-+———————+————+——-+
7 rows in set (0.00 sec)
完美成功!!!!

保姆级教程:用Spark Streaming 3.4.1 + Kafka 3.0.0实现实时词频统计(Direct方式避坑指南) 本文提供Spark Streaming 3.4.1与Kafka 3.0.0整合的保姆级教程,重点介绍Direct连接方式实现实时词频统计的避坑指南。从环境准备、版本兼容性到核心代码实现,详细解析如何构建低延迟、高可靠的实时数据处理系统,并分享生产环境调优策略与监控技巧。 阅读详情

相关推荐

Spark Streaming微批处理架构解析与生产级实时计算实践

实时流处理是处理海量数据、获取即时洞察的关键技术,其核心在于对连续数据流进行高效、可靠的计算。微批处理架构通过将数据流离散化为一系列小批次,在实时性与吞吐量之间取得了平衡,是实现高可靠流处理的主流范式之一。这种架构提供了强一致性语义和优异的容错性,特别适合对延迟要求在秒级、同时需要高吞吐的场景,如实时监控、实时ETL等。Apache Spark Streaming正是这一范式的经典实现,它凭借与Spark生态的无缝集成和成熟的**状态管理**与**容错**机制,成为构建生产级实时数据管道的稳健选择。本文将以

weixin_34197488的博客 963

RDD的持久化机制

RDD的持久化操作有两种方法,分别是cache()方法和persist()方法。每一个持久化的RDD都可以使用不同的存储级别存储,从而允许持久化数据集在硬盘或者内存中作为字列化的Java对象存储,甚至可以跨节点复制。 persist()方法的存储级别是通过StorageLevel对象(Scala、Java、Python)设置的。 cache()方法的存储级别是使用默认的存储级别(即 StorageLevel.MEMORY_ONLY将反序列化的对象存入内存)。 1、使用persist()方法对R..

m0_59839948的博客 1584

Ubuntu输出语句时提示wordcount.foreach(print) ^ SyntaxError: invalid

用于个人笔记,学习交流 在spark 的WordCount实验中。 提示wordcount.foreach(print) ^ SyntaxError: invalid(语法错误)。 首先检查自己的语法(如:多的空格)等。 而我这里是错误是,语法不兼容(python3的语句我用python2输出)。 这是python3语句 这是python2 解决方法:配置PySpark使用python3作为编程语言 $ nano ~/.bashrc 文件末尾添加如下语句 export PYTHONPATH=SPARKH

DAFENGZI123_的博客 739

java rdd_JAVA RDD 介绍

RDD,全称Resilient Distributed Datasets(弹性分布式数据集),是Spark最为核心的概念,是Spark对数据的抽象。RDD是分布式的元素集合,每个RDD只支持读操作,且每个RDD都被分为多个分区存储到集群的不同节点上。除此之外,RDD还允许用户显示的指定数据存储到内存和磁盘中,掌握了RDD编程是SPARK开发的第一步。1:创建操作(creation operatio...

weixin_35948624的博客 2028

【信息科学与工程学】【数据科学】数据科学领域 第十二篇 大数据主要算法07 任务工序(2)

工序类别工序名称工序描述处理时序输入输出控制点质量指标异常处理数据接入工序​流数据源连接连接到外部流数据源初始阶段流数据源配置流数据连接连接参数配置连接成功率重连机制,失败告警数据拉取从数据源拉取数据持续实时数据源连接原始数据流拉取频率,批大小数据延迟,吞吐量超时重试,流量控制反序列化将二进制数据反序列化数据到达时二进制数据结构化数据记录序列化格式反序列化成功率格式异常处理数据预处理工序​数据验证验证数据完整性和格式反序列化后原始数据记录验证后数据验证规则数据质量合格率丢弃无效数据,异常记录数据清洗清洗脏数

weixin_49199313的博客 783

基于Spark与LFM的电影推荐系统实战

推荐系统是大数据领域最典型的应用场景之一。传统的协同过滤算法虽然直观,但面对海量用户与物品时,相似度矩阵的存储和计算代价极高,且难以挖掘深层关联。隐语义模型(LFM)通过矩阵分解将用户-物品评分矩阵拆解为低维隐向量,有效缓解了这些问题,配合ALS交替最小二乘算法可在分布式环境下高效求解。Apache Spark作为统一的大数据计算引擎,其SQL模块负责数据清洗与ETL,MLlib提供分布式的模型训练,Streaming则能实时感知用户行为,形成离线+实时的双层推荐架构。这种方案兼顾了推荐质量与时效性,广泛应

weixin_33892359的博客 383

Spark Java API:foreach、foreachPartition、lookup

foreach 官方文档描述: Applies a function f to all elements of this RDD. 函数原型: def foreach(f: VoidFunction[T]) foreach用于遍历RDD,将函数f应用于每一个元素。 源码分析: def foreach(f: T =&gt; Unit): Unit = withScope { ...

hellozhxy的博客 4355

来!简单了解一下计算机发展史!

​ 1936年,英国数学家阿兰・麦席森・图灵提出了一种抽象的计算模型——图灵机( Turing machine)。图灵机,又称图灵计算机,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。​ 图灵机是一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。

m0_57290404的博客 2910

Spark学习笔记1

一、Spark 的简介: -》spark只是一种类类似于Mapreduce的计算模型 -》用来处理数据 -》处理数据:RDD -》RDD:弹性分布式数据集(集合) -》内存,分布式,分区(可以优化的点:分区数》=线程数,一般1核处理1-2个分区的数据) -》读取数据:将不同的数据读取到RDD中 -》处理数据:调用RDD中的方法,处理数据,生成新的R

Poche.Long的博客 326

【JavaSE】之流程控制与方法

Java基础之Java流程控制与方法相关知识介绍~

小新要变强的博客 5800

madgwick算法基于MPU9250姿态融合漂移问题的原因

基于MPU9250的madgwick算法姿态漂移问题原因 0、声明 因为这个是现象是不是共性目前本人还没研究过,只是在个体问题研究的基础上得出的结论,或许我买到的MPU9250是一个盗版:),所以只具备参考性。 1、现象 使用MPU9250的加速度计、角速度计、磁力计(AK8963)原始数据输入到madgwick算法中,得到的姿态最终会在停止姿态变化后仍然漂移一小段时间。其中加速度计和角速度计读取速率为400hz,磁力计为100hz,加速度计采样范围±2g,角速度计采样范...

GreedyZombie的博客 3874

spark 持久化 mysql_请大神指点,持久化到MySql中 VoidFunction报错

wordcounts.foreachRDD(new VoidFunction > (){private static final long serialVersionUID = 1L;@Overridepublic void call(JavaPairRDD wordcountsRDD)throws Exception {wordcountsRDD.foreachPartition(new...

weixin_36251341的博客 181

瑞萨RZN2L工业以太网开发避坑指南:EtherCAT从入门到通信调试全流程

本文详细解析了瑞萨RZN2L MPU在工业以太网开发中的EtherCAT从站配置与通信优化全流程。通过硬件设计关键点、协议栈选型、PDO映射策略及DC同步精度优化等实战技巧,帮助开发者快速搭建高效通信框架并解决调试中的常见问题,特别适合工业自动化领域的实时通信需求。

aitie1479的博客 462

大数据-SparkStreaming(四)

大数据-SparkStreaming(四) Output foreachRDD package com.kaikeba.streaming import java.sql.DriverManager import org.apache.log4j.{Level, Logger} import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, Stream...

海恋北斗星 156

深入理解「二进制掩码」:从原理到实践

二进制掩码本质上是一个二进制数,用于通过位操作(如与、或、非、异或等)选择性地操作目标数据的某些位。掩码的每一位(bit)可以看作一个“开关”,决定是否对目标数据的对应位进行操作。二进制掩码是位操作的灵魂,掌握它不仅能提升代码效率,还能解锁许多高级编程技巧。从基础的位提取到复杂的子集枚举,掩码的应用无处不在。希望本文的讲解和代码示例能帮助你快速上手,并在实际项目中灵活运用。如果你有更多关于掩码的疑问或应用场景,欢迎在评论区留言交流!

m0_73494933的博客 2433

模拟量输入功能块 S_ITR(Easy系列PLC完整ST源代码)

IN Input INT 输入数字量 1IN ISH INT 输入数字量上限 2IN ISL INT 输入数字量下限 3IN OSH REAL 输出工程量上限 4IN OSL REAL 输出工程量下限 5OUT OUTPUT REAL 输出工程量 6VAR temp1 REAL 临时变量1 7VAR temp2 REAL 临时变量2 8。

RXXW_Dor的博客 716

Spark Streaming开发入门——WordCount(Java&Scala)

https://blog.youkuaiyun.com/lxhandlbb/article/details/51211631 一、Java方式开发 1、开发前准备 假定您以搭建好了Spark集群。 2、开发环境采用eclipse maven工程,需要添加Spark Streaming依赖。 &lt;dependency&gt;       &lt;groupId&gt;org.apache.spark...

大仁哥、的博客 487

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。可以看到根据客户需求产生了对应的计划订单,我们创建的时候选择的KSV是按库存生产的,所以转换的时候生产订单也按单生产的。上面填写的这些字段的信息是不是和我们销售订单里面的字段的信息很相似。1)填写交货日期,可以选择按月 ,按日,按周等类型选择对应的日期。保存后会显示对应的客户独立需求的号码,如下图。

我小时候很黑的博客 2907

Spark-Streaming核心编程

给定一个由(键,事件)对构成的 DStream,并传递一个指定如何根据新的事件更新每个键对应状态的函数,它可以构建出一个新的DStream,其内部数据为(键,状态) 对。与 RDD 中的惰性求值类似,如果一个 DStream 及其派生出的 DStream 都没有被执行输出操作,那么这些 DStream 就都不会被求值。updateStateByKey() 的结果会是一个新的 DStream,其内部的 RDD 序列是由每个时间区间对应的(键,状态)对组成的。1. 定义状态,状态可以是一个任意的数据类型。

2401_82438126的博客 1793

智能手表PCB布局:PPG与IMU传感器噪声隔离与应力解耦设计

在可穿戴设备硬件开发中,PCB布局已超越传统布线范畴,成为决定信号完整性、电磁兼容性与机械可靠性的核心环节。心率传感器(PPG)依赖微伏级光电容积脉搏波信号,极易受数字开关噪声与电源纹波干扰;姿态传感器(IMU)则对PCB弯曲形变引发的机械应力高度敏感。其布局需融合电磁场建模、热-力-电多物理协同及高密度互连约束。关键技术价值体现在噪声路径切断、地弹抑制、应力方向解耦与电源域隔离等工程实践。典型应用场景涵盖智能手表、医疗级贴片设备及微型运动传感终端。本文聚焦PPG与IMU两大模组在STM32L4平台上的实操

weixin_32869687的博客 175

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java SparkStream WordCount

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33716941的博客 145

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spark Streaming实时流处理项目实战笔记——将统计结果写入到MySQL数据库中

思路 两种方式,一种可优化(foreachRDD后,直接创建连接Mysql),一种在(foreachRDD后通过foreachPartition,通过分区获取) 代码实现 import java.sql.DriverManager import Spark.UpdateStateByKey.workds import Spark.WordCount.ssc impor...

优质后端技术知识记录 1213

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

spark中序列化错误,sparkStreaming将wordcount单词统计结果插入mysql

做spark开发错误 task不能序列化 18/09/25 14:47:35 ERROR JobScheduler: Error running job streaming job 1537858055000 ms.1org.apache.spark.SparkException: Task not serializable 是什么不能序列化呢?是mysql连接,这种写法是错误的 ...

dizaoshen1316的博客 155

day74 Spark - streaming

文章目录一、Spark - streaming1、WordCount2、UpdateStateByKey3、foreachRDD4、模拟带状态算子5、滑动窗口6、稽查布控 I know, i know 地球另一端有你陪我 一、Spark - streaming 微批处理,一定时间内将该段时间产生的数据进行批处理,是一种近似的实时处理 1、WordCount package streaming import org.apache.spark.streaming.dstream.Receiv

qq_41464008的博客 261

PySpark安装及WordCount实现(基于Ubuntu)

Hadop伪分布式+PySpark local+词频统计WordCount案例

qq_43629945的博客 2022

我作为Java后端,分享一下入门Spark编程的经历!

作者:陌北有棵树,玩Java,架构师社区合伙人!最近由于工作任务,需要掌握大数据技术栈的相关知识,于是开始了入门大数据的漫漫之路。相比传统Java后端的技术栈来说,大数据...

架构师小秘圈 1005
上一篇: Spark中的Window滑动窗口之热点搜索词滑动统计!
下一篇: Hive出现 return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTa
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值