故事是,我一直在尝试将一个非常大的配置单元表(~8tb)的列转换为parquet,该配置单元表是平面格式的,包含~20k个分区,这样我就可以开始使用parquet和prestodb这两个效率更高的组合进行查询了。为了保留原始表的分区,我使用hql脚本一次加载一个分区的数据,并以10个加载进程并行运行的方式对进程进行了并行化。
我在一台有8gb可用ram和4个intel xeons@2.5GHz的机器上运行Hive2.1.0。
当parquet表为空时,加载一个分区(分区的大小各不相同,但在扁平的hive表中它们约为500mb)大约需要190秒,但是随着越来越多的查询并行运行,运行时会急剧增加!
正如您所看到的,第一批9运行在大约相同的时间,然后运行时间实际上减少了,但是在18点左右,一切都开始显著减慢。
我知道有很多方法可能会出错,但我最初的怀疑是Parquet文字有问题。所以,我试着调查潜在的瓶颈,发现这里有一个有趣的电子邮件交换,关于spark中的摘要文件,但显然hive甚至没有使用它们。然后我考虑了可能是内存问题的可能性,所以我将hive-env.sh中的hadoop\u heapsize参数增加到5gb-没有任何更改。
我的生命垂危,我想知道是否有人经历过类似的情况。如果是这样的话,如果你能告诉我们罪魁祸首是什么,以及你是如何解决所有问题的,我们将不胜感激。
谢谢!
编辑:有人想让我分享我的代码和日志,所以这里是最相关的东西。
我有一个shell脚本,它输出一个名为tasks.txt的文本文件,该文件有一个为每个分区加载运行的参数化配置单元命令列表。该文本文件如下所示:
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
.
.
.
这是加载和分割Parquet地板的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多行是不可行的。我盯着它们看了很长时间,只发现Map占用了约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
暂无答案!
目前还没有任何答案,快来回答吧!