故事是我一直试图转换一个非常大的Hive表(~8TB)的列,这些表是平面格式的并且包含~20K分区到镶木地板,这样我就可以开始利用效率更高的二人组镶木地板和PrestoDB的查询。为了保留原始表的分区,我使用HQL脚本一次加载一个分区的数据,并且我以一种方式并行化这些进程,以便同时运行10个加载进程。
我在拥有8GB可用内存和4英特尔Xeon @ 2.5 GHz的计算机上运行Hive 2.1.0。
加载一个分区(分区的大小各不相同,但它们在平面Hive表中大约500MB)当镶木桌空是空的时候大约需要190秒,但随着越来越多的查询并行运行,运行时间急剧增加!
正如你所看到的,第一批9大约在同一时间运行,然后运行时间实际上减少了,但是一切都开始在18左右显着减慢。
我知道有很多方法可能会出错,但我最初的怀疑是这是镶木地板写作的问题。所以,我尝试调查那里潜在的瓶颈,并发现了一个有趣的电子邮件交换here关于Spark中的摘要文件,但显然Hive甚至不使用它们。然后我考虑了它可能是一个内存问题,所以我将hive-env.sh中的HADOOP_HEAPSIZE参数提升到了5GB - 没有任何改变。
我在最后一站,想知道是否有人遇到过类似的情况。如果是这样,如果您能分享主要罪魁祸首以及您如何解决所有问题,我们将不胜感激。
谢谢!
编辑:有人希望我分享我的代码和日志,所以这里是最相关的东西。我有一个shell脚本,它会发出一个名为tasks.txt的文本文件,该文件有一个参数化的hive命令列表,可以为每个分区加载运行。该文本文件如下所示:
hive -f insert.hql -hiveconf ATTRIBUTE=alpha -hiveconf MONTH=01 -hiveconf DAY=01
hive -f insert.hql -hiveconf ATTRIBUTE=beta -hiveconf MONTH=01 -hiveconf DAY=01
hive -f insert.hql -hiveconf ATTRIBUTE=gamma -hiveconf MONTH=01 -hiveconf DAY=01
hive -f insert.hql -hiveconf ATTRIBUTE=alpha -hiveconf MONTH=01 -hiveconf DAY=02
hive -f insert.hql -hiveconf ATTRIBUTE=beta -hiveconf MONTH=01 -hiveconf DAY=02
hive -f insert.hql -hiveconf ATTRIBUTE=gamma -hiveconf MONTH=01 -hiveconf DAY=02
.
.
.
这是加载和分区镶木地板的insert.hql脚本
INSERT INTO TABLE foo_bar_pq
PARTITION (year=2017, month=${hiveconf:MONTH}, day=${hiveconf:DAY}, attribute='${hiveconf:ATTRIBUTE}')
SELECT
a,
b,
c,
d,
e
FROM foo_bar_flat
WHERE year=2017
AND month=${hiveconf:MONTH}
AND day=${hiveconf:DAY}
AND attribute='${hiveconf:ATTRIBUTE}';
我将此过程并行化并确保它不会通过运行nohup bash runner.sh而停止运行。 runner.sh在下面。
#!/bin/sh
cat tasks.txt | xargs -n 1 -I CMD -P 10 bash -c CMD
就日志而言,它们包含敏感信息,即使是单个加载查询,也不可能对500多行进行模糊处理。我盯着他们看了很长时间,并且只收集了地图占用了大约90%的查询执行时间,并且还花费了越来越长的时间来运行。
例如:
2017-06-27T19:54:14,524 INFO [c6a35f57-aacf-4c23-bf37-f22095f02855 main([])]: client.TezClient (TezClient.java:submitDAGSession(522)) - Submitting dag to TezSession, sessionName=HIVE-c6a352017-06-27T19:54:16,518 INFO [5e8d02e1-0880-45ee-953f-b31520c58a1d main([])]: SessionState (SessionState.java:printInfo(1054)) - Map 1: 0(+1)/1
2017-06-27T19:54:19,547 INFO [5e8d02e1-0880-45ee-953f-b31520c58a1d main([])]: SessionState (SessionState.java:printInfo(1054)) - Map 1: 0(+1)/1
2017-06-27T19:54:22,565 INFO [5e8d02e1-0880-45ee-953f-b31520c58a1d main([])]: SessionState (SessionState.java:printInfo(1054)) - Map 1: 0(+1)/1
.
.
.
2017-06-27T20:00:09,526 INFO [5e8d02e1-0880-45ee-953f-b31520c58a1d main([])]: SessionState (SessionState.java:printInfo(1054)) - Map 1: 0(+1)/1
2017-06-27T20:00:12,539 INFO [5e8d02e1-0880-45ee-953f-b31520c58a1d main([])]: SessionState (SessionState.java:printInfo(1054)) - Map 1: 0(+1)/1
2017-06-27T20:00:14,647 INFO [5e8d02e1-0880-45ee-953f-b31520c58a1d main([])]: SessionState (SessionState.java:printInfo(1054)) - Map 1: 1/1