访问 S3/MinIO 上的数据时,hive-on-tez 映射器卡在初始化中,容器总数为 -1
hive-on-tez mapper stuck in INITIALIZING with total number of containers being -1 when accessing data on S3/MinIO
我从头开始设置 Hadoop+Hive+Tez(这意味着我一个组件一个组件地部署它)。
使用 Tez 作为执行引擎设置 Hive。
在当前状态下,Hive 可以访问 HDFS 上的 table,但无法访问存储在 MinIO 上的 table(使用 s3a
文件系统实现)。
如下截图所示,
当执行 SELECT COUNT(*) FROM s3_table
,
- Tez 执行永远停滞不前
Map 1
一直处于INITIALIZING
状态
Map 1
总计数为 -1
,待处理计数为 -1
。 (为什么 -1
?)
已检查的内容:
- Hadoop 可以毫无问题地访问 MinIO/S3。例如,
hdfs dfs -ls s3a://bucketname
效果很好。
- Hive-on-Tez 可以针对 HDFS 上的 tables 进行计算,并成功快速地生成映射器和缩减器。
- Hive-on-MR 可以毫无问题地针对 MinIO/S3 上的 table 进行计算。
导致此问题的可能原因是什么?
附上 Tez UI 屏幕截图:
版本信息:
- Hadoop 3.2.1
- 配置单元 3.1.2
- Tez 0.9.2
- MinIO RELEASE.2020-01-25T02-50-51Z
原来问题是必须在编译时显式启用 Tez 的 S3 支持。对于 hadoop 2.8+,要启用 S3 支持,必须使用以下命令从源代码编译 Tez:
mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -Paws -Phadoop28 -P\!hadoop27
之后,将生成的tez-x.y.z.tar.gz
拖放到HDFS,将tez-x.x.x-minimal.tar.gz
解压到$TEZ_LIB_DIR
。然后它对我有用。针对 MinIO/S3 的 Hive 执行运行顺利。
但是,Tez installation guide didn't mention anything about enabling S3 support. Nor does the default Tez binary releases 使用 S3 或 Azure 支持构建。
(希望)完整的构建选项和陷阱实际上记录在 BUILDING.txt 中,它说:
However, to build against hadoop versions higher than 2.7.0, you will
need to do the following:
For Hadoop version X where X >= 2.8.0
$ mvn package -Dhadoop.version=${X} -Phadoop28 -P\!hadoop27
For recent versions of Hadoop (which do not bundle aws and azure by
default), you can bundle AWS-S3 (2.7.0+) or Azure (2.7.0+) support:
$ mvn package -Dhadoop.version=${X} -Paws -Pazure
我的团队遇到了类似的问题,但在从 HDFS 读取时,映射阶段永远停留在初始化。
这可能会帮助其他面临类似问题的人。实际上 application-master 正在变得 Out-of-Memory。
将以下值增加到 12 GB 对我们有用。
tez.am.resource.memory.mb
我从头开始设置 Hadoop+Hive+Tez(这意味着我一个组件一个组件地部署它)。 使用 Tez 作为执行引擎设置 Hive。
在当前状态下,Hive 可以访问 HDFS 上的 table,但无法访问存储在 MinIO 上的 table(使用 s3a
文件系统实现)。
如下截图所示,
SELECT COUNT(*) FROM s3_table
,
- Tez 执行永远停滞不前
Map 1
一直处于INITIALIZING
状态Map 1
总计数为-1
,待处理计数为-1
。 (为什么-1
?)
已检查的内容:
- Hadoop 可以毫无问题地访问 MinIO/S3。例如,
hdfs dfs -ls s3a://bucketname
效果很好。 - Hive-on-Tez 可以针对 HDFS 上的 tables 进行计算,并成功快速地生成映射器和缩减器。
- Hive-on-MR 可以毫无问题地针对 MinIO/S3 上的 table 进行计算。
导致此问题的可能原因是什么?
附上 Tez UI 屏幕截图:
版本信息:
- Hadoop 3.2.1
- 配置单元 3.1.2
- Tez 0.9.2
- MinIO RELEASE.2020-01-25T02-50-51Z
原来问题是必须在编译时显式启用 Tez 的 S3 支持。对于 hadoop 2.8+,要启用 S3 支持,必须使用以下命令从源代码编译 Tez:
mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -Paws -Phadoop28 -P\!hadoop27
之后,将生成的tez-x.y.z.tar.gz
拖放到HDFS,将tez-x.x.x-minimal.tar.gz
解压到$TEZ_LIB_DIR
。然后它对我有用。针对 MinIO/S3 的 Hive 执行运行顺利。
但是,Tez installation guide didn't mention anything about enabling S3 support. Nor does the default Tez binary releases 使用 S3 或 Azure 支持构建。
(希望)完整的构建选项和陷阱实际上记录在 BUILDING.txt 中,它说:
However, to build against hadoop versions higher than 2.7.0, you will need to do the following:
For Hadoop version X where X >= 2.8.0
$ mvn package -Dhadoop.version=${X} -Phadoop28 -P\!hadoop27
For recent versions of Hadoop (which do not bundle aws and azure by default), you can bundle AWS-S3 (2.7.0+) or Azure (2.7.0+) support:
$ mvn package -Dhadoop.version=${X} -Paws -Pazure
我的团队遇到了类似的问题,但在从 HDFS 读取时,映射阶段永远停留在初始化。
这可能会帮助其他面临类似问题的人。实际上 application-master 正在变得 Out-of-Memory。 将以下值增加到 12 GB 对我们有用。
tez.am.resource.memory.mb