我们在CDH 5.3.2设置中使用Hadoop,Hive和Impala构建了一个报告应用程序。我们的所有作业都是从一个节点(称为Orchestration Node)调度的。此节点上未部署Hadoop服务。然而,由于它是整个应用程序的潜在单点故障,我们通过添加另一个被动Orchestration节点并使用rcron(keep-alive)来维护主动被动同步,从而为其引入了高可用性。
然而,由于实施中存在一些缺陷,有两个节点出现的情况。在此期间,有些作业试图写入同一个HDFS目录,导致以下异常被抛入日志中:
8/03/16 07:26:16 WARN hdfs.DFSClient: Error Recovery for block BP-793706682-10.3.8.147-1434350563384:blk_1128320405_57247539 in pipeline 10.3.3.163:50010, 10.3.8.130:50010, 10.3.3.252:50010: bad datanode 10.3.3.163:50010
18/03/16 07:26:16 WARN hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): BP-793706682-10.3.8.147-1434350563384:blk_1128320405_57247539 does not exist or is not under Constructionnull
其中一个Orch节点被手动关闭,但后来我们开始从我们的一个脚本中看到以下错误,这些脚本试图将数据从HDFS加载到表中
Query: load DATA INPATH '/tmp/aaa/bbbb' INTO TABLE temp.data_aaa_bbbb_temp
ERROR: AnalysisException: INPATH location 'hdfs://xyz-nameservice/tmp/aaa/bbbb' contains no visible files.
Could not execute command: load DATA INPATH '/tmp/aaa/bbbb' INTO TABLE temp.data_aaa_bbbb_temp
我不确定导致此错误的原因。当两个作业同时尝试写入同一位置时,HDFS目录是否已损坏?
我能够通过删除和重新创建hdfs位置来解决这个问题,但是这个问题似乎一次又一次地发生。
除了可能的根本原因,我也在寻找永久解决此问题的建议。
答案 0 :(得分:1)
这里的问题是脚本的设计。 它做了两件事: 1)将数据加载到临时表中 2)经过一些处理后将数据插入主表。
脚本在第2步失败了,但由于脚本中内置的重试机制,它正在重试步骤1中的脚本,而不仅仅是失败的部分。
因此,正在再次执行加载数据步骤。但是,此步骤已成功执行,并且没有剩余文件要移动,导致没有可见文件异常。
我最终将我的脚本重构为两个单独的组件来处理这个问题。