配置单元版本0.13.1中的性能问题

b5lpy0ml  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(424)

我使用aws emr运行配置单元查询,在运行配置单元版本0.13.1时出现性能问题。
新版本的hive运行10行数据大约需要5分钟。但230804行的同一个脚本需要2天时间,并且仍在运行。我应该如何分析和解决问题?
样本数据:
表1:

hive> describe foo;
OK
orderno    string
Time taken: 0.101 seconds, Fetched: 1 row(s)

表1的示例数据:

hive>select * from foo;        
OK
1826203307
1826207803
1826179498
1826179657

表2:

hive> describe de_geo_ip_logs;
OK
id          bigint                                      
startorderno        bigint                                      
endorderno          bigint                                      
itemcode                int                                         
Time taken: 0.047 seconds, Fetched: 4 row(s)

表2的样本数据:

hive> select * from bar;

127698025   417880320   417880575   306
127698025   3038626048  3038626303  584
127698025   3038626304  3038626431  269
127698025   3038626560  3038626815  163

我的问题:

SELECT b.itemcode
FROM foo a,  bar b
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno;

5ssjco0h

5ssjco0h1#

在您的配置单元日志输出的最顶部,它声明“警告:阶段'stage-1 mapred'中的shuffle join[4][tables a,b]是一个叉积。”
编辑:“叉积”或笛卡尔积是无条件的联接,它返回“b”表中的每一行以及“a”表中的每一行。因此,如果以‘a’是5行,而‘b’是10行为例,就得到了乘积,或者,5乘以10=50行。对于一个或其他表,将有许多行完全为“null”。
现在,如果您有一个20000行的表'a'并将其联接到另一个500000行的表'b',您将要求sql引擎返回1000000000行的数据集'a,b',然后对1000万行执行between操作。
因此,如果去掉“b”行的数量,您会看到比“a”有更多的好处—在您的示例中,如果您可以过滤ip_logs表,表2,因为我猜测它的行数比您的order number表的行数多,它将减少执行时间。结束编辑
通过不指定联接的条件,可以强制执行引擎处理笛卡尔积。它必须一遍又一遍地扫描整个a表。有10行,就不会有问题了。使用20k,您将遇到几十个map/reduce波。
尝试此查询:

SELECT b.itemcode
 FROM foo a JOIN bar b on <SomeKey>
 WHERE a.orderno BETWEEN b.startorderno AND b.endorderno;

但我很难搞清楚你的模特会允许加入哪个栏目。也许这个表达式的数据模型可以改进?可能是我看不清样品。
无论哪种方式,都需要在where子句之前过滤比较的数量。我在hive中完成这项工作的其他方法是使用较小的数据集创建一个视图,并连接/匹配视图而不是原始表。

相关问题