hive sql 查询如何作为 mr 作业从 hive cli 提交
How do the hive sql queries are submitted as mr job from hive cli
我部署了一个 CDH-5.9 集群,用 MR 作为 Hive 执行引擎。我有一个名为 "users" 的配置单元 table,有 50 行。每当我执行查询时,select * from users
工作正常,如下所示:
hive> select * from users;
OK
Adam 1 38 ATK093 CHEF
Benjamin 2 24 ATK032 SERVANT
Charles 3 45 ATK107 CASHIER
Ivy 4 30 ATK384 SERVANT
Linda 5 23 ATK132 ASSISTANT
.
.
.
Time taken: 0.059 seconds, Fetched: 50 row(s)
但是提交为 mr 作业后发布 select max(age) from users
失败。容器日志也没有任何信息可以弄清楚为什么它会失败。
hive> select max(age) from users;
Query ID = canballuser_20170808020101_5ed7c6b7-097f-4f5f-af68-486b45d7d4e
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1501851520242_0010, Tracking URL = http://hadoop-master:8088/proxy/application_1501851520242_0010/
Kill Command = /opt/cloudera/parcels/CDH-5.9.1-1.cdh5.9.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1501851520242_0010
Hadoop job information for Stage-1: number of mappers: 0; number of reducers: 0
2017-08-08 02:01:11,472 Stage-1 map = 0%, reduce = 0%
Ended Job = job_1501851520242_0010 with errors
Error during job, obtaining debugging information...
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 0 HDFS Write: 0 FAIL
Total MapReduce CPU Time Spent: 0 msec
如果我从 hive cli 获得了 hive 查询执行的工作流程,这可能对我进一步调试问题有帮助。
Hive 查询执行流程涉及很多组件。高级架构在这里解释:https://cwiki.apache.org/confluence/display/Hive/Design
本文档中有指向更详细组件文档的链接。
典型的查询执行流程(高级)
- UI调用Driver的执行接口。
- Driver 为查询创建一个 session 句柄,并将查询发送给编译器以生成执行计划。
- 编译器从元存储中获取必要的元数据。此元数据用于对查询树中的表达式进行类型检查,如
以及根据查询谓词修剪分区。
- 编译器生成的计划是阶段的 DAG,每个阶段都是 map/reduce 作业、元数据操作或
HDFS 上的操作。对于 map/reduce 个阶段,计划包含地图
运算符树(在映射器上执行的运算符树)和
reduce 运算符树(用于需要 reducer 的操作)。
- 执行引擎将这些阶段提交给适当的组件在每个任务 (mapper/reducer) 中,反序列化器关联
table 或中间输出用于从中读取行
HDFS 文件,这些文件通过关联的运算符传递
树。一旦生成输出,它就会被写入一个临时的
通过序列化程序的 HDFS 文件(这发生在映射器中以防万一
该操作不需要减少)。使用临时文件
为计划的后续 map/reduce 阶段提供数据。对于 DML
操作最终临时文件移动到table的
地点。该方案用于保证不读到脏数据
(文件重命名是 HDFS 中的原子操作)。
- 对于查询,临时文件的内容由执行引擎直接从 HDFS 读取,作为 fetch 调用的一部分
Driver .
Hive 文档根目录在此处:https://cwiki.apache.org/confluence/display/Hive/Home 您可以找到有关不同组件的更多详细信息。
您还可以研究资源以获取有关某些 class 实现的更多详细信息。
Hadoop 作业跟踪器文档:https://wiki.apache.org/hadoop/JobTracker
我部署了一个 CDH-5.9 集群,用 MR 作为 Hive 执行引擎。我有一个名为 "users" 的配置单元 table,有 50 行。每当我执行查询时,select * from users
工作正常,如下所示:
hive> select * from users;
OK
Adam 1 38 ATK093 CHEF
Benjamin 2 24 ATK032 SERVANT
Charles 3 45 ATK107 CASHIER
Ivy 4 30 ATK384 SERVANT
Linda 5 23 ATK132 ASSISTANT
.
.
.
Time taken: 0.059 seconds, Fetched: 50 row(s)
但是提交为 mr 作业后发布 select max(age) from users
失败。容器日志也没有任何信息可以弄清楚为什么它会失败。
hive> select max(age) from users;
Query ID = canballuser_20170808020101_5ed7c6b7-097f-4f5f-af68-486b45d7d4e
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1501851520242_0010, Tracking URL = http://hadoop-master:8088/proxy/application_1501851520242_0010/
Kill Command = /opt/cloudera/parcels/CDH-5.9.1-1.cdh5.9.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1501851520242_0010
Hadoop job information for Stage-1: number of mappers: 0; number of reducers: 0
2017-08-08 02:01:11,472 Stage-1 map = 0%, reduce = 0%
Ended Job = job_1501851520242_0010 with errors
Error during job, obtaining debugging information...
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 0 HDFS Write: 0 FAIL
Total MapReduce CPU Time Spent: 0 msec
如果我从 hive cli 获得了 hive 查询执行的工作流程,这可能对我进一步调试问题有帮助。
Hive 查询执行流程涉及很多组件。高级架构在这里解释:https://cwiki.apache.org/confluence/display/Hive/Design
本文档中有指向更详细组件文档的链接。
典型的查询执行流程(高级)
- UI调用Driver的执行接口。
- Driver 为查询创建一个 session 句柄,并将查询发送给编译器以生成执行计划。
- 编译器从元存储中获取必要的元数据。此元数据用于对查询树中的表达式进行类型检查,如 以及根据查询谓词修剪分区。
- 编译器生成的计划是阶段的 DAG,每个阶段都是 map/reduce 作业、元数据操作或 HDFS 上的操作。对于 map/reduce 个阶段,计划包含地图 运算符树(在映射器上执行的运算符树)和 reduce 运算符树(用于需要 reducer 的操作)。
- 执行引擎将这些阶段提交给适当的组件在每个任务 (mapper/reducer) 中,反序列化器关联 table 或中间输出用于从中读取行 HDFS 文件,这些文件通过关联的运算符传递 树。一旦生成输出,它就会被写入一个临时的 通过序列化程序的 HDFS 文件(这发生在映射器中以防万一 该操作不需要减少)。使用临时文件 为计划的后续 map/reduce 阶段提供数据。对于 DML 操作最终临时文件移动到table的 地点。该方案用于保证不读到脏数据 (文件重命名是 HDFS 中的原子操作)。
- 对于查询,临时文件的内容由执行引擎直接从 HDFS 读取,作为 fetch 调用的一部分 Driver .
Hive 文档根目录在此处:https://cwiki.apache.org/confluence/display/Hive/Home 您可以找到有关不同组件的更多详细信息。 您还可以研究资源以获取有关某些 class 实现的更多详细信息。
Hadoop 作业跟踪器文档:https://wiki.apache.org/hadoop/JobTracker