[图片] 使用 spark 从 kafka 消费数据写入 hive 动态分区表(二) 上次咱们说到数据从 kafka 到 hive,也从 hive 非分区表到分区表的迁移。经过测试发现曲线救国的方法虽然 kafka 到 hive 快了,但是 hive 非分区表到分区表贼慢,再一次难受,不着急咱们慢慢来分析原因。 分析日 ..

使用 spark 从 kafka 消费数据写入 hive 动态分区表(二)

使用 spark 从 kafka 消费数据写入 hive 动态分区表(二)

上次咱们说到数据从 kafka 到 hive,也从 hive 非分区表到分区表的迁移。经过测试发现曲线救国的方法虽然 kafka 到 hive 快了,但是 hive 非分区表到分区表贼慢,再一次难受,不着急咱们慢慢来分析原因。

分析日志

拿到日志文件看看什么日志最多,什么操作最耗时间。日志大体分为一下几类:

Starting task 53.0 in stage 0.0 (TID 47, IP, executor 5, partition 53, PROCESS_LOCAL, 4920 bytes)
Finished task 53.0 in stage 0.0 (TID 40) in 76 ms on IP(executor 5) (24/3135)
metadata.Hive: Renaming src: hdfs://分区表文件存储路径/.hive-staging_hive_2019-05-20_10-24-43_342_2230325038880850463-1/-ext-10000/tradedate=2017-12-02/part-00086-e563b05e-3202-4510-8951-3d05d246c279.c000, dest: hdfs://分区表文件存储路径/tradedate=2017-12-02/part-00086-e563b05e-3202-4510-8951-3d05d246c279.c000, Status:true

经过对比时间发现:task 执行时间也就几十秒,Ranme 执行时间几分钟,甚至十几分钟。

对症下药

问题找到就是 Rename 阶段时间长拖慢了整个进度,想办法解决呗。

我为什么这么着重的说 reduce,因为 reduce 的数量一一对应 hive 表数据文件的数量(仅仅针对本次写入涉及的分区)。reduce 的数量减少,那么临时文件数量减少,那么 rename 的对象就少,大大减少了 rename 所消耗的时间。

重点

hive 非分区表到分区表的数据迁移 sql
insert into partition(分区字段) select * from table DISTRIBUTE BY 分区字段

  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    69 引用 • 45 回帖 • 574 关注
  • Hive
    10 引用 • 5 回帖
1 操作
ludengke95 在 2019-05-20 18:24:44 更新了该帖
1 回帖   
请输入回帖内容...
  • ludengke95  

    我写着两篇博客主要是看到网上都是啥也不说了,直接贴代码,代码全是一样的,一点原创精神都没有。我是真的讨厌,百度一下全是 cv 大师。我为什么不贴全部代码,如果我贴全部代码还要你干嘛,我只是提供一个思路,我不敢说你看完这两篇博客之后你一定能够会了这块,起码这块遇到的问题有一种思路可以帮你,如果你有更好的办法可以联系我,大家一起讨论。为了能够通俗易懂博客里面用了简化的 hive,spark 处理逻辑,实际上 sql 和 streaming 的执行比这个复杂的多,如果感兴趣,可以自己去看内部是如何处理的。