Sql 配置单元:从小时开始执行查询

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

我正在尝试在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 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检查联接是否在右侧联接表中的唯一列上执行并且不重复,相应地进行修复,这应该对所有联接执行。还可以阅读关于如何检测和修复连接上的倾斜:和