最近在测试动态分区时,猜测可能是动态分区的数太多,导致一个SQL始终报错:
aused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.io.IOException: Bad connect ack with firstBadLink as 192.168.2.24:50010
at org.apache.hadoop.hive.ql.exec.FileSinkOperator.processOp(FileSinkOperator.java:602)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:84)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:83)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:531)
... 8 more
Caused by: java.io.IOException: Bad connect ack with firstBadLink as 192.168.2.24:50010
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.createBlockOutputStream(DFSClient.java:3465)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:3381)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2600(DFSClient.java:2589)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2829)
当时我们看到的时候,就认为很简单,不就是关闭防火墙,然后就再修改/etc/selinux/config里的SELINUX=disabled。
确实当时的测试环境里,确实有些机器没有关闭防火墙这些,然后就关闭防火墙等,想想应该不会再运行出错了吧,
测试的结果恰恰相反,还是报此错误(对分区字段也做了distribute by)。
如果我们将数据量缩小,执行此动态分区的SQL语句是能够成功。
目前根据经验判断应该是动态分区数太多导致,也正在努力检查其真正原因。
判断的方式:
我们打算用一个时间段3000多万记录来做一个动态分区,如果执行成功,那么出来的结果应该是一个动态分区,
然后我们用5年的时间段3000多万的记录来做一个动态分区,如果执行失败,就能证明是动态分区数太多导致。
反之其他场景也就说明了我们的判断是有误的。
最近听说此问题与交换机有关,我正在检查中。
测试结果与预期相反,并不是动态分区的问题导致,而且当集群里的数据量突然猛增时,出现对block处理不及时导致。
在测试的过程中,很多环境变量在命令行里设置的时候,是没有效果的,在配置文件(hive-site.xml)里才有效果。