精选30+云产品,助力企业轻松上云!>>>

点击蓝色“大数据每日哔哔”关注我

加个“星标”,第一时间获取大数据架构,实战经验


背景:

Hive版本:1.2.1,Spark 版本:2.3.0, 实时程序逻辑比较简单,从 Kafka 消费数据,写到 Hive 表。

数据量级上亿,SparkStreaming 的 bath time 为 1 min, 在某一个时刻开始出现任务堆积,即大量任务处于 Queued 状态,卡在了某个 job,最长延迟时间为 1.7 h。

查看 job 状态一直处于 processing, 但是发现该 job 写 hive 的时间也就花费了 30 秒左右,但是该 job 最终执行完的时间远远大于这个时间。

慢慢的,每一批次都要慢几分钟,出现堆积,最终造成数据大面积延迟。

分析:

写入 Hive 的部分逻辑代码,很简单,如下:

// 上面 RDD 的转换过程略....toDF.write.mode(SaveMode.Append).insertInto("ods.user_events")

通过查看 Hive 的源码发现:

阅读上面的源码,可以发现往 Hive 中写数据的时候会在目标表中(1.1 版本之后是默认位置目标表的文件夹)生成一个以.hive-staging 开头的lin时文件夹,结果会在临时文件夹存放。执行完成后会,将临时文件夹 rename,放到对应的目标表文件下。

这里的 rename 并不是直接修改 hive 元数据那么简单。是在特定条件下才会执行 mv file 的,否则还是会 copy file 的形式。

如果源目录和目标目录是同一个根目录,则会源目录下的每个文件执行复制操作。反之,执行 remane 操作(只涉及 namenode 元数据,不会有额外数据操作)。

源码参考:https://github.com/apache/hive/blob/23db35e092ce1d09c5993b45c8b0f790505fc1a5/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java

hive 1.1 之后临时文件就直接放在目标表对应的目录下面了,所以最后执行的 copy 操作,如果文件多或者数据量大的情况下,会很慢。

解决:


方案一:修改临时目录


<property>  <name>hive.exec.stagingdir</name>    <value>/tmp/hive/.hive-staging</value>  <description>hive任务生成临时文件夹地址</description></property><property>          <name>hive.insert.into.multilevel.dirs</name>  <value>true</value>  <description>hive.insert.into.mulltilevel.dirs设置成false的时候,insert 目标目录的上级目录必须存在;trued的时候允许不存在</description></property>

方案二:spark 直接落文件到 HDFS的对应分区中 ,hive 表见外部表与数据进行关联。这种就不依赖与 hive 了,减少中间环节。这是,尽可能的规避小文件,需要尽可能减少文件个数。


(完)

本文分享自微信公众号 - 大数据每日哔哔(bb-bigdata)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

记录一次线上事故:SparkStreaming 写入 Hive 延迟相关推荐

  1. 记录一次线上事故:GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20, creating 0

    前几天同事说项目出问题了,请求一直报错,我看了下服务器日志,发现服务器一直报错Caused by: com.alibaba.druid.pool.GetConnectionTimeoutExcepti ...

  2. “���”引发的线上事故

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 最近遇到了一起依赖升级 + 异常数据引发的线上事故,教训惨痛,本文 ...

  3. 程序员惊魂 12 小时:“���”引发线上事故

    作者 | 饶全成 来源 | 码农桃花源(ID:CoderPark) 最近遇到了一起依赖升级 + 异常数据引发的线上事故,教训惨痛,本文对此进行回故和总结. 背景 起因是我们使用的服务框架版本比较老,G ...

  4. 线上事故应该由谁来承担?

    前不久线上发生了一个事故,主线是这样的,XX 平台对接了 web 端和手机终端,一个伸手不见五指的夜晚,web 端出现了问题,SRE 发现故障后迅速发起了 oncall 机制,建立了作战室.一个小时后 ...

  5. RPC的超时设置,一不小心就是线上事故

    来自:IT人的职场进阶 上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨 ...

  6. 醉了,RPC 超时设置也能引起线上事故!

    上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨多个服务调用后才能返回结 ...

  7. 同时设置超时时间_刚入职的小菜鸡,设错了RPC超时,搞了个线上事故

    上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨多个服务调用后才能返回结 ...

  8. 记录一次线上超时异常查询

    线上事故复盘 前言 前一次上线,当时正常,第二天发现有部分超时报警,最终发现应为Dubbo接口一次传输数据量太大导致线程虚拟内存占用 线上问题排查过程 报警邮件中查询到有一部分接口超时量激增,查询定位 ...

  9. RPC 的超时设置,一不小心就是线上事故!

    作者 | 骆俊武 来源 | IT人的职场进阶(ID:BestITer) 上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微 ...

最新文章

  1. codeforces Gargari and Permutations(DAG+BFS)
  2. JUC之CountDownLatch的源码和使用场景分析
  3. python上海培训哪里比较好-上海哪个python培训机构好
  4. Android之提示订阅配置订阅需要传新的包 添加结算权限。
  5. linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...
  6. 如何让我们的VMware虚拟机上网——转载
  7. 二叉树的建立与遍历(数据结构)
  8. 鸽子的迷信行为(pigeon superstition)
  9. 网易微专业java高级笔记_网易前端微专业------页面架构笔记
  10. 2021年中国嵌入式系统软件业务收入及业务收入结构分析[图]
  11. android 移动拼图效果实现
  12. Unity 雨水滴到屏幕效果
  13. 学计算机在职硕士,计算机在职研究生的学习方式有哪些?
  14. 查询条件中含有加号_中国邮储银行信用卡公众号账单查询
  15. 【算法】Sunday算法(模式匹配)
  16. WNM2020-3/TR MOS场效应晶体管
  17. ML之PDP:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用DT决策树RF随机森林+PDP部分依赖图可视化实现模型可解释性之详细攻略
  18. exfat文件系统分析
  19. 张量分解浅谈(四 Tucker 分解)
  20. Pg sql 创建自动增长列及修改序列当前值

热门文章

  1. Linux学习(四)- 文件查找和压缩
  2. urllib的实现---请求响应and请求头处理
  3. 实操《深入浅出React和Redux》第一期
  4. 迷宫(AHOI2016初中组T3)
  5. 实现可折叠的分组tableview
  6. 面试:Websocket
  7. 响应式系统的依赖收集追踪原理
  8. Oracle死锁解决常用方法
  9. python如何批量下载邮箱全部附件_Python编写执行测试用例及定时自动发送最新测试报告邮件...
  10. Java+Selenium+Testng自动化测试学习(三)— 断言