温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SparkStreaming如何写入Hive延迟

发布时间:2021-12-10 11:25:10 来源:亿速云 阅读:378 作者:小新 栏目:大数据

小编给大家分享一下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 的源码发现:

SparkStreaming如何写入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 了,减少中间环节。这是,尽可能的规避小文件,需要尽可能减少文件个数。

以上是“SparkStreaming如何写入Hive延迟”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI