Sql 配置单元:从小时开始执行查询
我正在尝试在Azure HDInsight群集上执行下面的配置单元查询,但它花费了前所未有的时间来完成。已实施配置单元设置,但没有任何用处。详情如下:Sql 配置单元:从小时开始执行查询,sql,hadoop,hive,hiveql,azure-hdinsight,Sql,Hadoop,Hive,Hiveql,Azure Hdinsight,我正在尝试在Azure HDInsight群集上执行下面的配置单元查询,但它花费了前所未有的时间来完成。已实施配置单元设置,但没有任何用处。详情如下: 表格 CREATE TABLE DB_MYDB.TABLE1( MSTR_KEY STRING, SDNT_ID STRING, CLSS_CD STRING, BRNCH_CD STRING, SECT_CD STRING, GRP_CD STRING, GRP_NM STRING, SUBJ_DES STRIN
表格
CREATE TABLE DB_MYDB.TABLE1(
MSTR_KEY STRING,
SDNT_ID STRING,
CLSS_CD STRING,
BRNCH_CD STRING,
SECT_CD STRING,
GRP_CD STRING,
GRP_NM STRING,
SUBJ_DES STRING,
GRP_DESC STRING,
DTL_DESC STRING,
ACTV_FLAG STRING,
CMP_NM STRING)
STORED AS ORC
TBLPROPERTIES ('ORC.COMPRESS'='SNAPPY');
Hive查询
INSERT OVERWRITE TABLE DB_MYDB.TABLE1
SELECT
CURR.MSTR_KEY,
CURR.SDNT_ID,
CURR.CLSS_CD,
CURR.BRNCH_CD,
CURR.SECT_CD,
CURR.GRP_CD,
CURR.GRP_NM,
CURR.SUBJ_DES,
CURR.GRP_DESC,
CURR.DTL_DESC,
'Y',
CURR.CMP_NM
FROM DB_MYDB.TABLE2 CURR
LEFT OUTER JOIN DB_MYDB.TABLE3 PREV
ON (CURR.SDNT_ID=PREV.SDNT_ID
AND CURR.CLSS_CD=PREV.CLSS_CD
AND CURR.BRNCH_CD=PREV.BRNCH_CD
AND CURR.SECT_CD=PREV.SECT_CD
AND CURR.GRP_CD=PREV.GRP_CD
AND CURR.GRP_NM=PREV.GRP_NM)
WHERE PREV.SDNT_ID IS NULL;
但是查询运行了几个小时。详情如下:
--------------------------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
--------------------------------------------------------------------------------
Map 1 .......... SUCCEEDED 46 46 0 0 0 0
Map 3 .......... SUCCEEDED 169 169 0 0 0 0
Reducer 2 .... RUNNING 1009 825 184 0 0 0
--------------------------------------------------------------------------------
VERTICES: 02/03 [======================>>----] 84% ELAPSED TIME: 13622.73 s
--------------------------------------------------------------------------------
我确实设置了一些蜂巢属性
SET hive.execution.engine=tez;
SET hive.tez.container.size=10240;
SET tez.am.resource.memory.mb=10240;
SET tez.task.resource.memory.mb=10240;
SET hive.auto.convert.join.noconditionaltask.size=3470;
SET hive.vectorized.execution.enabled = true;
SET hive.vectorized.execution.reduce.enabled=true;
SET hive.vectorized.execution.reduce.groupby.enabled=true;
SET hive.cbo.enable=true;
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.type=BLOCK;
SET hive.compute.query.using.stats=true;
SET hive.merge.mapfiles = true;
SET hive.merge.mapredfiles = true;
SET hive.merge.tezfiles = true;
SET hive.merge.size.per.task=268435456;
SET hive.merge.smallfiles.avgsize=16777216;
SET hive.merge.orcfile.stripe.level=true;
表中的记录:
DB_MYDB.TABLE2=337319653
DB_MYDB.TABLE3=1946526625
这似乎对查询没有任何影响。谁能帮我:
使用版本:
Hadoop 2.7.3.2.6.5.3033-1
Hive 1.2.1000.2.6.5.3033-1
Azure HDInsight 3.6
尝试1:
根据@leftjoin的建议,尝试设置set hive.exec.reducers.bytes.per.reducer=32000000代码>。这一直工作到配置单元脚本的第二个最后一步,但在最后一步失败,原因是:java.io.IOException:Map_1:Shuffle失败,获取失败太多,进度不足代码>
最后查询:
INSERT OVERWRITE TABLE DB_MYDB.TABLE3
SELECT
CURR_FULL.MSTR_KEY,
CURR_FULL.SDNT_ID,
CURR_FULL.CLSS_CD,
CURR_FULL.BRNCH_CD,
CURR_FULL.GRP_CD,
CURR_FULL.CHNL_CD,
CURR_FULL.GRP_NM,
CURR_FULL.GRP_DESC,
CURR_FULL.SUBJ_DES,
CURR_FULL.DTL_DESC,
(CASE WHEN CURR_FULL.SDNT_ID = SND_DELTA.SDNT_ID THEN 'Y' ELSE
CURR_FULL.SDNT_ID_FLAG END) AS SDNT_ID_FLAG,
CURR_FULL.CMP_NM
FROM
DB_MYDB.TABLE2 CURR_FULL
LEFT OUTER JOIN DB_MYDB.TABLE1 SND_DELTA
ON (CURR_FULL.SDNT_ID = SND_DELTA.SDNT_ID);
-----------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
-----------------------------------------------------------------
Map 1 ......... RUNNING 1066 1060 6 0 0 0
Map 4 .......... SUCCEEDED 3 3 0 0 0 0
Reducer 2 RUNNING 1009 0 22 987 0 0
Reducer 3 INITED 1 0 0 1 0 0
-----------------------------------------------------------------
VERTICES: 01/04 [================>>--] 99% ELAPSED TIME: 18187.78 s
错误:
原因:java.io.IOException:Map_1:Shuffle失败,获取失败太多,进度不足!failureCounts=8,pendingInputs=1058,fetcherHealthy=false,ReducerProgressDenough=false,reducerStalled=false
如果您的fk列上没有索引,您应该肯定地添加它们,我的建议如下:
create index idx_TABLE2 on table DB_MYDB.TABLE2 (SDNT_ID,CLSS_CD,BRNCH_CD,SECT_CD,GRP_CD,GRP_NM) AS 'COMPACT' WITH DEFERRED REBUILD;
create index idx_TABLE3 on table DB_MYDB.TABLE3(SDNT_ID,CLSS_CD,BRNCH_CD,SECT_CD,GRP_CD,GRP_NM) AS 'COMPACT' WITH DEFERRED REBUILD;
请注意,从配置单元3.0版开始,索引已从配置单元中删除,或者,您可以使用物化视图(由配置单元2.3.0及以上版本支持)来提供相同的性能。如果是reducer vertex运行缓慢,您可以通过减少每个reducer配置的字节数来提高reducer并行性。检查您当前的设置,并相应地减小数值,直到运行2倍或更多的减速器:
set hive.exec.reducers.bytes.per.reducer=67108864; --example only, check your current settings
--and reduce accordingly to get twice more reducers on Reducer 2 vertex
更改设置,启动查询,检查Reducer 2
vertex上的容器数量,如果容器数量没有增加,则终止并再次更改
如果您还想增加映射器上的并行性,请阅读以下答案:谢谢您的输入。但是我使用了Tez
作为执行引擎。获取错误消息失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。尝试创建索引时,Tez执行引擎不支持索引
。
@UnicornUnion hmmm。。。可能在创建索引之前将验证检查设置为忽略:set hive.msck.path.validation=ignore代码>谢谢。你的建议一直有效到最后一步。在配置单元脚本的最后一部分,由于失败,原因是:java.io.IOException:Map_1:Shuffle失败,获取失败太多,进度不足代码>。我已经用详细信息更新了问题。@UnicornUnion现在在另一个查询中失败,在Mapper1上失败,而不是在reducer上失败。请避免在您的初始问题中添加新问题,因为这是在浪费我们的时间:没有人对范围的增加感到满意,因为范围已经改变,所以答案从未被接受。至于你的新问题,我建议你把第一个问题和最后一个问题结合起来。不用加载中间表,而是使用子查询,至少当前失败的映射步骤将被完全消除。对不起,我无意在这里浪费任何人的时间。您的建议确实有助于进行更多的调整。@UnicornUnion检查联接是否在右侧联接表中的唯一列上执行并且不重复,相应地进行修复,这应该对所有联接执行。还可以阅读关于如何检测和修复连接上的倾斜:和