在项目中使用spark-stream读取kafka数据源的数据,然后转成dataframe,再后通过sql方式来进行处理,然后放到hive表中,

遇到问题如下,hive-metastor在没有做高可用的情况下,有时候会出现退出,这个时候,spark streaminG的微批作业就会失败,

然后再启重动hive-metastore进程后,作业继续正常执行,数据就有丢失.

分析如下:

第一步,观察日志发现,

我原来的代码这么写的:

xx.foreachRdd(rdd=>

processRdd(rdd)

updatezkOffset(rdd)

)
原以为,如果任务不成功,就应该不更新offset,
原想的是,如果processrdd出现异常,则不会执行后面的updateoffset,
但processrdd是在线程池中运行的,它出现的异常只是warning,根本不影响后面的updateoffset.
故需要修改代码,把updateoffset部分放置processrdd中,当其执行完成后调用即可.

第二步测试:
经过测试发现,把updateoffset部分放置processrdd后,模拟hive metastore出问题,
spark-streaming 任务失败,然后offset 确实没有更新.
但问题在这里,下一批次的作业,读取的offset并不是你没有更新的那一个,而是它计算出来的.
例如假设batch1 job读取的是0-20,batch2 job读取的就是21-40,batch3 job读取的是41-60
即使batch1 job处理任务失败了,但是后面的batch2 job或batch3 job 读取数据并执行成功了,
它就会把自己的offset更新.

第三步测试:
经测试发现,使用可恢复的方式,即使用checkpoint.
spark streaming保留了最近的五个batchjob信息,但是也不能解决上面遇到的问题,
如果hive metastore出问题,再恢复,原来存储的元数据信息也会被新的给替换掉了.

想到的解决方案:

1.如果batch job出现失败的情况,就直接让它退出,这是一种解决思路.

2.还使用手工更新zookeeper offset的方法,

如果出现部分batch job失败的情况,仍不退出,但是我们给应用写一个支持传入

offset 范围的版本,重新执行,把数据补进去.

另外,如何提交spark streaming 已经失败的batch job?

spark-streaming读kafka数据到hive遇到的问题的更多相关文章

  1. Spark Streaming接收Kafka数据存储到Hbase

    Spark Streaming接收Kafka数据存储到Hbase fly spark hbase kafka 主要参考了这篇文章https://yq.aliyun.com/articles/60712 ...

  2. demo1 spark streaming 接收 kafka 数据java代码WordCount示例

    1. 首先启动zookeeper windows上的安装见zk 02之 Windows安装和使用zookeeper 启动后见: 2. 启动kafka windows的安装kafka见Windows上搭 ...

  3. spark streaming 接收 kafka 数据java代码WordCount示例

    http://www.cnblogs.com/gaopeng527/p/4959633.html

  4. Spark streaming消费Kafka的正确姿势

    前言 在游戏项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不 ...

  5. Spark Streaming和Kafka整合保证数据零丢失

    当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢失机制.为了体验这个关键的特性,你需要满足以下几个先决条件: 1.输入的数据来自可靠的数据源 ...

  6. Spark Streaming和Kafka整合是如何保证数据零丢失

    转载:https://www.iteblog.com/archives/1591.html 当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢 ...

  7. Spark Streaming使用Kafka保证数据零丢失

    来自: https://community.qingcloud.com/topic/344/spark-streaming使用kafka保证数据零丢失 spark streaming从1.2开始提供了 ...

  8. Spark Streaming、Kafka结合Spark JDBC External DataSouces处理案例

    场景:使用Spark Streaming接收Kafka发送过来的数据与关系型数据库中的表进行相关的查询操作: Kafka发送过来的数据格式为:id.name.cityId,分隔符为tab zhangs ...

  9. Spark Streaming on Kafka解析和安装实战

    本课分2部分讲解: 第一部分,讲解Kafka的概念.架构和用例场景: 第二部分,讲解Kafka的安装和实战. 由于时间关系,今天的课程只讲到如何用官网的例子验证Kafka的安装是否成功.后续课程会接着 ...

随机推荐

  1. freemarker3

    结束标签 可以在结束标签中忽略user_def_dir_exp 也就是说可以写</@>来代替</@anything> 循环变量 <@myRepeatMacro count ...

  2. Windows网络接口API函数

    Windows提供了一套非常轻量级的网络函数,方便进行网络应用开发,整理出来供参考使用. The following functions are used in Windows networking: ...

  3. mysql备份数据库常见问题

    如果遇到mysqldump: unknown option '--no-beep'  ,可以加上 --no-dafaults 命令结尾无需分号 mysqldump --no-defaults -uro ...

  4. Python 正则表达式贪婪模式

    贪婪模式也就是我们使用 .* 匹配任意字符时会尽可能长地向后匹配,如果我们想阻止这种贪婪模式,需要加个问号,尽可能少地匹配,如下例子: In []: import re In []: html = ' ...

  5. 使用vue来做局部刷新

    我们都知道,vue的组件化是他最强大的核心所在,路由也是特别可爱的一部分,但是路由适合一些大型的组件,看url路径的时候会出现变化,但是有时候我们想要一些小的局部小刷新,这个时候就需要用到它的动态组件 ...

  6. SSH电力项目一 搭建Hibernate框架

    Hibernate所需要的基本文件: ElectText.java ElecText.hbm.xml hibernate.cfg.xml 第一步:创建测试表Elec_Text: create tabl ...

  7. Vue.js_getter and setter

    computed 计算属性: 1.get 读取 <div id="test2"> <input type="text" v-model=&qu ...

  8. jQuery UI dialog 参数说明

    前段时间碰到个问题 jquery UI dialog弹出层 弹出多个层是 比如弹出两个层A和B  B层如果显示的数据表格太大,伸到了A层的外面,那伸到A层之外的部分就看不到了,因为B层是在A层上弹出的 ...

  9. NoSQL 常用资源

    Hadoop:http://www.apache.org/dyn/closer.cgi/hadoop/common/ easyhadoop:https://github.com/xianglei/ea ...

  10. local unversioned, incoming add upon update问题

    当update的时候遇到如下问题 svn status D C ~/workspace/test/a.c > local unversioned, incoming add upon updat ...