小编给大家分享一下SparkStreaming如何写入Hive延迟,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网站空间、营销软件、网站建设、乐安网站维护、网站推广。
成都创新互联主打移动网站、成都网站设计、网站制作、外贸营销网站建设、网站改版、网络推广、网站维护、域名注册、等互联网信息服务,为各行业提供服务。在技术实力的保障下,我们为客户承诺稳定,放心的服务,根据网站的内容与功能再决定采用什么样的设计。最后,要实现符合网站需求的内容、功能与设计,我们还会规划稳定安全的技术方案做保障。
背景:
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 操作,如果文件多或者数据量大的情况下,会很慢。
解决:
方案一:修改临时目录
hive.exec.stagingdir
/tmp/hive/.hive-staging
hive任务生成临时文件夹地址
hive.insert.into.multilevel.dirs
true
hive.insert.into.mulltilevel.dirs设置成false的时候,insert 目标目录的上级目录必须存在;trued的时候允许不存在
方案二:spark 直接落文件到 HDFS的对应分区中 ,hive 表见外部表与数据进行关联。这种就不依赖与 hive 了,减少中间环节。这是,尽可能的规避小文件,需要尽可能减少文件个数。
以上是“SparkStreaming如何写入Hive延迟”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!