Hadoop Apache配置单元未正确返回应用程序结果

Hadoop Apache配置单元未正确返回应用程序结果,hadoop,hive,yarn,apache-tez,Hadoop,Hive,Yarn,Apache Tez,我正在AWS EC2上运行一个从头开始的集群。我使用S3上的数据定义了一个外部表分区。我可以通过简单的select*语句查询此表并将结果接收到控制台: hive> set hive.execution.engine=tez; hive> select * from external_table where partition_1='1' and partition_2='2'; <correct results returned> 但是,如果我在日志和文件系统中挖掘,我

我正在AWS EC2上运行一个从头开始的集群。我使用S3上的数据定义了一个外部表分区。我可以通过简单的select*语句查询此表并将结果接收到控制台:

hive> set hive.execution.engine=tez;
hive> select * from external_table where partition_1='1' and partition_2='2';
<correct results returned>
但是,如果我在日志和文件系统中挖掘,我可以从该查询中找到结果:

(yarn.resourcemanager.log) org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger: USER=root     OPERATION=AM Released Container TARGET=SchedulerApp     RESULT=SUCCESS  APPID=application_1572972524483_0022      CONTAINERID=container_1572972524483_0022_01_000002      RESOURCE=<memory:1024, vCores:1>        QUEUENAME=default
(container_folder/syslog_attempt) [TezChild] |exec.FileSinkOperator|: New Final Path: FS file:/tmp/<REALLY LONG FILE PATH>/000000_0
[root #] cat /tmp/<REALLY LONG FILE PATH>/000000_0
SEQ"org.apache.hadoop.io.BytesWritableorg.apache.hadoop.io.Textl▒ꩇ1som}▒▒j¹▒    2060
但是,尝试插入覆盖本地目录失败:

hive> set hive.execution.engine=tez;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' select count(*) from external_table where partition_1='1' and partition_2='2';
[root #] cat /tmp/local_out/000000_0
cat: /tmp/local_out/000000_0: No such file or directory
如果我为该查询对容器结果文件进行cat,则只显示编号,没有类名或特殊字符:

[root #] cat /tmp/<REALLY LONG FILE PATH>/000000_0
2060
我能找到的唯一不合适的日志消息来自Thread ResourceManager日志:

(yarn.resourcemanager.log) INFO org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger: USER=root     OPERATION=AM Released Container TARGET=SchedulerApp     RESULT=SUCCESS  APPID=application_1572972524483_0023      CONTAINERID=container_1572972524483_0023_01_000004      RESOURCE=<memory:1024, vCores:1>        QUEUENAME=default
(yarn.resourcemanager.log) WARN org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger: USER=root     IP=NMIP   OPERATION=AM Released Container TARGET=Scheduler        RESULT=FAILURE    DESCRIPTION=Trying to release container not owned by app or with invalid id.    PERMISSIONS=Unauthorized access or invalid container    APPID=application_1572972524483_0023    CONTAINERID=container_1572972524483_0023_01_000004

根据最模糊的印象,我猜测在将结果写入本地文件系统时会出现字符编码问题,因此在容器结果文件中会出现特殊字符,但这实际上只是猜测,我不知道如何验证/解决该问题。非常感谢您的帮助

如何将数据插入配置单元表?Hive从metastore提供count*结果,而不是运行计数作业以优化性能。首先在此表上尝试MSCK修复,让配置单元知道新的外部文件,并相应地修改配置单元元存储

Apache Hive邮件列表中的某个人表示,这是由Thread容器将其结果文件写入运行它的本地计算机而不是HDFS造成的。我对源代码进行了一些挖掘,发现:

mapreduce.framework.name=local
这是Hadoop 3.2.1中的默认设置,是导致问题的原因

解决方法:

set mapreduce.framework.name=yarn

您在哪里更改了此值?在hive上的纱线群集或纱线客户端?@Kiwy您可以在配置文件mapred-site.xml中设置它,或将其包含在查询中以在hive会话中设置它,这就是此答案的作用。好的,我不明白为什么它不工作,但我在mapred-site.xml中的配置被注释,然后不工作。。。非常感谢你。
mapreduce.framework.name=local
set mapreduce.framework.name=yarn