1.实时插入mysql时遇到的问题,使用的updateStaeBykey有状态的算子 必须设置checkpoint  如果报错直接删掉checkpoint

在创建的时候自己保存偏移量即可 再次启动时读取正确偏移量就行了 管他checkpoint  无关的事了

实时插入时有个问题是怎么进行mysql的数据覆盖 掉一批次的值:

1.使用局部更新的sql :

insert into area_user_amt (date,country,provence,amt)  values('${datekey}','${countrykey}','${provencekey}','${amt}') ON DUPLICATE KEY UPDATE `amt`= '${amt}'

2.使用replace 相当于先删除在插入

replace into stream_offset(topic,partitions,groupid,brokerlist,offset)values (?,?,?,?,?)

2.使用redis 不使用叠加状态的updateStaeBykey ,进行完reduceBykey(list1,list2)=>(list.zip(list2)).map(_.1+_.2)  reduceBykey的两个参(累计值,当前值)一直做zip操作,做完后
(10,1).zip(20,2)=》((10,20),(1,2))在做map对里面每一个进行相加就是累加值 (只是当前批次的)

使用redis的hincrby 值增加的方法实现 累加求和

.foreachPartition(iter=>{  
//在各分区获取redis连接
val jedis=JedisUtil.getJedisClient()
iter.foreach(tp=>{
//B2019040114 ,成功量 ,总量
jedis.hincrBy("P-"+tp._1._1.substring(0,8),tp._1._2,tp._2(0).toLong)
//设置key的有效时间
jedis.expire(tp._1._1,60*60*24*7) }) jedis.close()
})

SparkStreaming使用checkpoint存在的问题

SparkStreaming在处理kafka中的数据时,存在一个kafka offset的管理问题:

  • 官方的解决方案是checkpoint:

    • checkpoint是对sparkstreaming运行过程中的元数据和 每次rdds的数据状态保存到一个持久化系统中,当然这里面也包含了offset,一般是HDFS,S3,如果程序挂了,或者集群挂了,下次启动仍然能够从checkpoint中恢复,从而做到生产环境的7*24高可用。如果checkpoint存储做hdfs中,会带来小文件的问题。

但是checkpoint的最大的弊端在于,一旦你的流式程序代码或配置改变了,或者更新迭代新功能了,这个时候,你先停旧的sparkstreaming程序,然后新的程序打包编译后执行运行,会出现两种情况:

  • (1)启动报错,反序列化异常
  • (2)启动正常,但是运行的代码仍然是上一次的程序的代码。

为什么会出现上面的两种情况?

  • 这是因为checkpoint第一次持久化的时候会把整个相关的jar给序列化成一个二进制文件,每次重启都会从里面恢复,但是当你新的 程序打包之后序列化加载的仍然是旧的序列化文件,这就会导致报错或者依旧执行旧代码。有的同学可能会说,既然如此,直接把上次的checkpoint删除了,不就能启动了吗? 确实是能启动,但是一旦你删除了旧的checkpoint,新启动的程序,只能从kafka的smallest或者largest的偏移量消费,默认是从最新的,如果是最新的,而不是上一次程序停止的那个偏移量 就会导致有数据丢失,如果是老的,那么就会导致数据重复。不管怎么样搞,都有问题。

在sparkStreaming实时存储时的问题的更多相关文章

  1. js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  2. 求int型正整数在内存中存储时1的个数

    题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入例子: 5 输出例子: ...

  3. 基于spark-streaming实时推荐系统

    基于spark-streaming实时推荐系统(一) 基于spark-streaming实时推荐系统( 二) 基于spark-streaming实时推荐系统(三)

  4. 华为oj之求int型正整数在内存中存储时1的个数

    题目: 求int型正整数在内存中存储时1的个数 热度指数:4427 时间限制:1秒 空间限制:32768K 题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: ...

  5. (一)求 int 型数据在内存中存储时 1 的个数

    题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入 ...

  6. Oracle RAC:使用 NFS 共享存储时的 mount 选项 总结

    oracle rac 使用nfs作为共享存储时,mount的选项有 要求,不能随便设置 grid的要求:      rw,bg,hard,nointr,rsize=32768,wsize=32768, ...

  7. 华为机试 求int型数据在内存中存储时1的个数

    题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入 5 输出 2 普通运算方 ...

  8. 求int型数据在内存中存储时1的个数

    1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> u ...

  9. php实现 求int型数据在内存中存储时1的个数(函数都可自己实现)

    php实现 求int型数据在内存中存储时1的个数(函数都可自己实现) 一.总结 一句话总结:函数我们自己都可以实现,尤其是很多基础函数,没有工具的时候自己写. 1.php进制转换函数? base_co ...

随机推荐

  1. node版本升级参考

    https://www.cnblogs.com/sese/p/9557161.html

  2. npm 安装 chromedriver 失败的解决办法

    https://segmentfault.com/a/1190000008310875 npm install chromedriver --chromedriver_cdnurl=http://cd ...

  3. js 第三期 小肩膀 第一段

    var 时间戳 = new.Date().getTime();//系统引擎 var 时间戳 = Date.now(); //V8引擎 数据类型 false =  underfuned =null = ...

  4. java--List、Set、Map的基础

    好像面试很多面试官都喜欢问这它们的一些问题,所以在这里我稍微总结一下,并把大佬们的文章链接贴在后面. 首先我们借鉴了https://www.cnblogs.com/SnowingYXY/p/67273 ...

  5. Django数据库,在原有表中添加新字段

    1.在你要添加新字段的app的 models.py 文件中添加需要新增的字段(这里新增的是dress字段): from django.db import models # Create your mo ...

  6. kettle 通用的数据库迁移流程

    需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kettle重复的画着:表输入-表输出.创建表,而烦恼. 下面为你实现了一套通用的数据库迁移流程. ...

  7. LeetCode 13 Roman to Integer 解题报告

    题目要求 Roman numerals are represented by seven different symbols: I, V, X, L, C, Dand M. Symbol Value ...

  8. Jmeter post请求传参问题

    同线程组引用参数 举例1:新增数据bizId,然后将此次新增数据删除 添加新增数据接口,然后查询数据列表,正则表达式提取bizId 在删除接口引用此值${bizId} 添加断言,执行查看结果

  9. Python_tkinter(2)_常用控件

    1.Label--标签(文字/位图)控件 from tkinter import * root = Tk() root.geometry('200x200') # Label控件 字体.边框.背景 l ...

  10. sizeof操作符的一些例子

    例一: #include <iostream> using namespace std; class A { public: char c; }; class B { public: in ...