1.背景

公司自建的Hadoop集群,后期使用阿里的Maxcompute,就需要迁移数据到新环境中,阿里提供众多的迁移方案,在经过我们的实践后,最终选择了MMA,迁移数据Hive到Maxcompute。

2.MMA介绍

MMA(MaxCompute Migration Assist)是一款MaxCompute数据迁移工具。

在 Hive 迁移至 MaxCompute 的场景下,MMA 实现了 Hive 的 UDTF,通过 Hive 的分布式能力,实现 Hive 数据向 MaxCompute 的高并发传输。

这种迁移方式的优点有:

  • 读数据由 Hive 自身完成,因此可以被 Hive 读的数据(包括 Hive 外表),都可以用 MMA 向 MaxCompute 迁移,且不存在任何数据格式问题
  • 支持增量数据迁移
  • 迁移效率高,迁移速率可以随资源分配线性提高

这种迁移方式的前置条件有:

  • Hive 集群各节点需要具备访问 MaxCompute 的能力

架构与原理

当用户通过 MMA client 向 MMA server 提交一个迁移 Job 后,MMA 首先会将该 Job 的配置记录在元数据中,并初始化其状态为 PENDING。

随后,MMA 调度器将会把这个 Job 状态置为 RUNNING,向 Hive 请求这张表的元数据,并开始调度执行。这个 Job 在 MMA 中会被拆分为若干 个 Task,每一个 Task 负责表中的一部分数据的传输,每个 Task 又会拆分为若干个 Action 进行具体传输和验证。在逻辑结构上,每一个 Job 将会包含若干个 Task 组成的 DAG,而每一个 Task 又会包含若干个 Action 组成的 DAG。整体的流程大致如下:

┌──────────────────────────────────────────────────────────────────────────────────────────────-┐
 │                                     HiveToMcTableJob                                         │
 │                                                                              		            │
 │ ┌───────────────────────────┐                                                                │
 │ │         SetUpTask         │     ┌────────────────────────────────────────────────────────┐ │
 │ │                           │     │               TableDataTransmissionTask                │ │
 │ │      DropTableAction      │     │                                                        │ │
 │ │             |             │     │              TableDataTransmissionAction(数据传输)     │ │
 │ │     CreateTableAction     ├────►│                   |               |                    │ │
 │ │             |             │     │ HiveVerificationAction          McVerificationAction   │ │
 │ │    DropPartitionAction    │     │                   |               |                    │ │
 │ │             |             │     │                   VerificationAction(对比验证结果)      │ │
 │ │     AddPartitionAction    │     └────────────────────────────────────────────────────────┘ │
 │ └───────────────────────────┘                                                                │
 │                                                                                              │
 └──────────────────────────────────────────────────────────────────────────────────────────────┘

官方文档:https://github.com/aliyun/alibabacloud-maxcompute-tool-migrate/blob/master/documents/HiveToMaxCompute_zh_v0.1.0.md

3.安装

3.1下载解压

版本选择跟自己的Hive版本相符即可。这里选择mma-0.1.1-hive-2.x.zip

下载链接:https://github.com/aliyun/alibabacloud-maxcompute-tool-migrate/releases

下载解压后:

[root@bigdata-01 mma]# unzip mma-0.1.1-hive-2.x.zip
[root@bigdata-01 mma]# cd mma-0.1.1
[root@bigdata-01 mma-0.1.1]# pwd
/data/soft/mma/mma-0.1.1
[root@bigdata-01 mma-0.1.1]# ll
total 20
drwxr-xr-x 2 root root 4096 Mar 28 12:01 bin
drwxr-xr-x 2 root root 4096 Sep 19  2021 conf
drwxr-xr-x 5 root root 4096 Apr 22 16:25 lib
drwxr-xr-x 3 root root 4096 Apr 22 16:25 res
-rw-r--r-- 1 root root    5 Apr 22 16:25 version.txt
[root@bigdata-01 mma-0.1.1]#

3.2配置 MMA server

解压安装包之后,运行配置引导脚本:/data/soft/mma/mma-0.1.1/bin

[root@bigdata-01 bin]# ./configure
Hive configurations
Please input Hive metastore URI(s):
HELP: See: "hive.metastore.uris" in hive-site.xml
EXAMPLE: thrift://localhost:9083
>{thrift}
Please input Hive JDBC connection string
HELP: Same as the connection string used in beeline, which starts with jdbc:hive2
EXAMPLE: jdbc:hive2://localhost:10000
>{hive2}
Please input Hive JDBC user name
HELP: Same as the user name used in beeline. The default value is "Hive"
EXAMPLE: Hive
>{username}
Please input Hive JDBC password
HELP: Same as the password used in beeline
>{password}
Hive security configurations
Has Kerberos authentication? (Y/N)
>{isKerberos}
MaxCompute configurations
Please input MaxCompute endpoint
HELP: See: https://help.aliyun.com/document_detail/34951.html
EXAMPLE: http://service.cn.maxcompute.aliyun-inc.com/api
>{maxComputeEndpoint}
Please input MaxCompute project name
HELP: The target MaxCompute project
>{maxComputeProject}
Please input Alibaba cloud accesskey id
HELP: See: https://help.aliyun.com/document_detail/27803.html
>{accesskeyId}
Please input Alibaba accesskey secret
HELP: See: https://help.aliyun.com/document_detail/27803.html
>{accesskeySecret}
Generating MMA server configuration
MMA server configuration file path: /data/soft/mma/mma-0.1.1/conf/mma_server_config.json
Validating MMA server configurations
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/soft/mma/mma-0.1.1/lib/client/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/soft/mma/mma-0.1.1/lib/connector/hive-uber.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Passed
Please execute the following commands manually to create required Hive UDTF
Upload Hive UDTF resource jar to HDFS:
hdfs dfs -put -f /data/soft/mma/mma-0.1.1/lib/data-transfer-hive-udtf-0.1.1-jar-with-dependencies.jar hdfs:///tmp/
Create Hive function in beeline:
DROP FUNCTION IF EXISTS default.odps_data_dump_multi;
CREATE FUNCTION default.odps_data_dump_multi as 'com.aliyun.odps.mma.io.McDataTransmissionUDTF' USING JAR 'hdfs:///tmp/data-transfer-hive-udtf-0.1.1-jar-with-dependencies.jar';
Press "ENTER" to confirm that the Hive UDTF has been created successfully
>
Congratulations! The configuration is completed!
[root@bigdata-01 bin]#

参数说明: {thrift}:见 hive-site.xml 中"hive.metastore.uris"

{hive2}:通过 beeline 使用 Hive 时输入的 JDBC 连接串,必须为 default 库, 前缀为 jdbc:hive2

{username}:通常通过 beeline 使用 Hive 时输入的 JDBC 连接用户名, 默认值为 Hive

{password}:通常通过 beeline 使用 Hive 时输入的 JDBC 连接密码, 默认值为空

{isKerberos}:在使用 Kerberos 的情况下,需要配置其他参数,这里否

{maxComputeEndpoint}:经典网络Endpoint

{maxComputeProject}:建议配置为目标 MaxCompute project, 规避权限问题

{accesskeyId}:阿里云 accesskey id

{accesskeySecret}:阿里云 accesskey secret

3.3创建 Hive 函数

配置过程中还需要将某些文件上传至 HDFS,并在 beeline 中创建 MMA 需要的 Hive 永久函数。MMA 配置引导脚本会自动生成需要执行的命令,直接复制粘贴到安装有 hdfs 命令与 beeline 的服务器上执行即可。命令示例如下:

上传 Hive UDTF Jar 包至 HDFS:

hdfs dfs -put -f ${MMA_HOME}/res/data-transfer-hive-udtf-${MMA_VERSION}-jar-with-dependencies.jar hdfs:///tmp/

使用 beeline 创建 Hive 函数:

DROP FUNCTION IF EXISTS default.odps_data_dump_multi;
CREATE FUNCTION default.odps_data_dump_multi as 'com.aliyun.odps.mma.io.McDataTransmissionUDTF' USING JAR 'hdfs:///tmp/data-transfer-hive-udtf-${MMA_VERSION}-jar-with-dependencies.jar';

4.使用

4.1启动 MMA server

MMA server 进程在迁移期间应当一直保持运行。若 MMA server 因为各种原因中断了运行,直接执行以下命令重启即可。MMA server 进程在一台服务器最多只能存在一个。默认端口为 18889

/bin/mma-server

启动成功后,MMA支持WebUI:http://${hostname}:18888

4.2生成任务配置

在生成配置任务前,需要先组织临时映射文件,有表级别和库级别,这里演示表级别,复制模板

[root@bigdata-01 ~]# cd /data/soft/mma/mma-0.1.1/conf/
[root@bigdata-01 conf]# cp table_mapping.txt.template table_mapping.txt

然后修改映射文件:vim table_mapping.txt

# generated for each of the following lines. Take the first line for an example, the source
# catalog(or database) and table are 'source_catalog' and 'source_table1', while the destination
# MaxCompute project and table are 'dest_pjt' and 'dest_table1'.
# 通过bin/gen-job-conf工具,以下每一行一行将会分别生成一个表迁移任务配置文件。每一行中,冒号(:)前后分别为源表和目标表
# 的全名。全名的格式为库名.表名,如source_catalog.source_table1:dest_pjt.dest_table1表示源表为source_catalog
# 库中的表source_table1,目标表为dest_pjt项目下的表dest_table1。
db_assets_pool.t_abs_payable:edy_dbwarehouse.db_assets_pool_t_abs_payable_mma
db_assets_pool.t_assets_device_backup:edy_dbwarehouse.db_assets_pool_t_assets_device_backup_mma
db_assets_pool.t_customer_received:edy_dbwarehouse.db_assets_pool_t_customer_received_mma

然后执行生成任务命令:

/bin/gen-job-conf --objecttype TABLE --tablemapping ${table_mapping_file}

其他参数

-jobid:可以指定 Job ID

-output:可以指定配置文件输出路径,不指定会默认生成到/conf目录下${objectType}-${sourceCatalog}-${destCatalog}-${job_id}.json

修改配置

生成配置文件后,需要指定迁移分区

{
  "mma.filter.partition.begin":"2020-01-01",
  "mma.filter.partition.end":"2020-05-01",
  "mma.filter.partition.orders":"lex"
}

修改后:

{
  "mma.object.source.catalog.name": "db_core_assets",
  "mma.object.source.name": "b_asset",
  "mma.object.type": "TABLE",
  "mma.object.dest.catalog.name": "edy_dbwarehouse",
  "mma.object.dest.name": "db_core_assets_b_asset_mma"
  ,"mma.filter.partition.begin":"2020-01-01","mma.filter.partition.end":"2020-05-01","mma.filter.partition.orders":"lex"
}

4.3提交任务

/bin/mma-client --action SubmitJob --conf

4.4查看任务状态

先查看所有迁移任务列表:

/bin/mma-client --action ListJobs
Job ID: 2263e913e9ba4130ac1e930b909dafab, status: FAILED, progress: 0.00%
Job ID: cf2c5f2f335041a1a1729b340c1d5fde, status: SUCCEEDED, progress: 0.00%
OK
/bin/mma-client --action GetJobInfo --jobid YOUR_JOB_ID

4.5其他命令

停止任务

/bin/mma-client --action StopJob --jobid YOUR_JOB_ID

重置任务

  • 状态为 SUCCEEDED FAILED CANCELED 三种状态下的任务可以被重置
  • 当需要增量同步时,重置 SUCCEEDED 状态下的任务
  • 当需要重试失败任务时,重置 FAILED CANCELED 状态下的任务
/bin/mma-client --action ResetJob --jobid YOUR_JOB_ID

删除任务

/bin/mma-client --action DeleteJob --jobid YOUR_JOB_ID

5.优化

为了更自动化执行任务,生成任务配置,修改分区,提交任务,分别编写以下脚本

首先最新目录结构如下,db_crm,db_risk是对应的任务配置目录,后期再有其他库,可按照此方式添加

MMA_HOME
└── bin
    ├── configure				     # 生成 mma server 配置的工具
    ├── gen-job-conf		     # 生成任务配置的工具
    ├── mma-client			     # 客户端命令行工具
    └── mma-server			     # 服务端命令行工具
└── conf
    ├── gss-jaas.conf.template					
    ├── mma_server_config.json.template					
    └── table_mapping.txt.template
		└── db_crm
        ├── finished             # 完成的任务存放目录		
        ├── table_mapping.txt 	 # 任务配置文件
        └── TABLE-*              # 生成的任务json文件
		└── db_risk
        ├── finished             # 完成的任务存放目录		
        ├── table_mapping.txt 	 # 任务配置文件
        └── TABLE-*              # 生成的任务json文件

5.1 生成配置任务脚本

vim /data/soft/mma/mma-0.1.0/bin/mma_gen_job

#!/bin/bash
#desc: 生成任务job

pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

mma=/data/soft/mma/mma-0.1.0
db=$@ #所dd有参数
echo  $db
$mma/bin/gen-job-conf  --objecttype TABLE --output $mma/conf/$db --tablemapping $mma/conf/$db/table_mapping.txt

使用示例:mma_gen_job db_crm

[root@data-es21 db_crm]# mma_gen_job db_crm
db_crm
mma_1bee5728-e5a3-4735-8818-9070ef47d0c1
Job configuration generated: /data/soft/mma/mma-0.1.0/conf/db_crm/TABLE-db_crm.t_visit_record-edy_dbwarehouse.db_crm_t_visit_record_mma-1658900626169.json
[root@data-es21 db_crm]# ll
total 12
drwxr-xr-x 2 root root 4096 Jul 27 11:44 done
-rw-r--r-- 1 root root  232 Jul 27 13:43 TABLE-db_crm.t_visit_record-edy_dbwarehouse.db_crm_t_visit_record_mma-1658900626169.json
-rw-r--r-- 1 root root  794 Jul 27 13:38 table_mapping.txt

完成后,将生成json文件,目录在 /conf/{db}下

5.2 添加分区任务

任务脚本生成之后,需要添加分区

vim /data/soft/mma/mma-0.1.0/bin/mma_modify_job

#!/bin/bash
#desc: 修改任务文件,添加分区范围

pcount=$#
if((pcount <3)); then
echo no args;
exit;
fi

#获取文件名称
p1=$1
fname=`basename $p1`
fname_bak=`basename $p1`_bak
echo fname=$fname

#获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#分区开始时间
p2=$2
#分区结束时间
p3=$3

#自定义jobid
uuid=`cat /proc/sys/kernel/random/uuid`
jobid=ods_`echo ${uuid//-/}`
#新的json文件名
nfname=`echo $fname |cut -d"-" -f1-3`-"$jobid".json
echo "最新json文件名"$nfname
echo "任务jobid为:"$jobid

mma=/data/soft/mma/mma-0.1.0/bin
#提交任务
cat $pdir/$fname | jq '. + {"mma.filter.partition.begin":"'$p2'","mma.filter.partition.end":"'$p3'","mma.filter.partition.orders":"lex","mma.job.id":"'$jobid'"}' >> $pdir/$fname_bak
#重新生成json文件
rm -rf $pdir/$fname
cat $pdir/$fname_bak >> $pdir/$nfname
rm -rf $pdir/$fname_bak

使用示例:

mma_modify_job TABLE-db_crm.t_visit_record-edy_dbwarehouse.db_crm_t_visit_record_mma-1658902900181.json 2015-01-01 2022-05-01

[root@data-es21 db_crm]# mma_modify_job TABLE-db_crm.t_visit_record-edy_dbwarehouse.db_crm_t_visit_record_mma-1658902900181.json 2015-01-01 2022-05-01
fname=TABLE-db_crm.t_visit_record-edy_dbwarehouse.db_crm_t_visit_record_mma-1658902900181.json
pdir=/data/soft/mma/mma-0.1.0/conf/db_crm
最新json文件名TABLE-db_crm.t_visit_record-edy_dbwarehouse.db_crm_t_visit_record_mma-mma_f45c37bd31f64775b73bd6f88518ad07.json
任务jobid为:mma_f45c37bd31f64775b73bd6f88518ad07

5.3 提交任务脚本

vim /data/soft/mma/mma-0.1.0/bin/mma_submit_job

#!/bin/bash
#desc: 提交单个mma任务

pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir


mma=/data/soft/mma/mma-0.1.0/bin
#提交任务
nohup $mma/mma-client --action SubmitJob --conf $pdir/$fname 2>&1 &

使用示例

mma_submit_job TABLE-db_crm.t_call_log_current-edy_dbwarehouse.db_crm_t_call_log_current_mma-mma_1b37cda58bd446afabe355a86d488309.json

5.4查看任务脚本

vim /data/soft/mma/mma-0.1.0/bin/mma_getinfo_job

#!/bin/bash
#desc: 查看任务列表

mma=/data/soft/mma/mma-0.1.0
$mma/bin/mma-client --action GetJobInfo --jobid $1

5.5一键批量迁移任务

以上各脚本是单独执行,下面把这些脚本合成到一个脚本中,实现更加自动化的操作。

目前按照一个库迁移。

迁移步骤

  • mapping映射文件需要手动一次性完成,文件目录:/data/soft/mma/mma-0.1.0/conf/db_crm/table_mapping.txt
  • 根据映射文件生成json配置文件,对应一个表的迁移,使用脚本:mma_gen_job
  • 根据json配置文件添加迁移分区,按照年迁移,一个json配置文件可生成多个,表示一个表对应多个迁移任务,使用脚本:mma_modify_job
  • 按照顺序提交任务,使用脚本:mma_submit_job

vim /data/soft/mma/mma-0.1.0/bin/mma_batch_job

#!/bin/bash
#desc: 一键批量迁移任务
# 1.生成任务
# 2.添加分区
# 3.提交任务
# 参数 $1:数据库  $2:分区开始  $3:分区结束

pcount=$#
#分区开始时间
p2=2015-01-01
#分区结束时间
p3=2022-05-01
if((pcount==1)); then
	echo "批量迁移$1,默认迁移分区:$p2~$p3";
elif((pcount==3)); then
	#分区开始时间
	p2=$2
	#分区结束时间
	p3=$3
else
	echo "命令实例:mma_batch_job db_crm 2015-01-01 2022-01-01"
	echo "或者:mma_batch_job db_crm,不填分区,会使用默认分区"
	exit;
fi

function ding_alert() {
    webhook="https://oapi.dingtalk.com/robot/send?access_token=钉钉群机器人"
    curl ${webhook} \
        -H 'Content-Type: application/json' \
        -d '{"msgtype": "text",
                "text": {
                    "content": "'$1'"
                }
            }'
}

path=/data/soft/mma/mma-0.1.0/conf/$1

echo "批量迁移任务 $1 >> 开始分区:$p2,结束分区:$p3"

mma=/data/soft/mma/mma-0.1.0/bin
#根据映射文件生成配置任务
$mma/mma_gen_job $1

#添加分区
for fname in $path/TABLE*
do
	if [[ $fname =~ "ods_" ]];
		# 包含ods_则表示已经添加了分区,跳过即可
		then continue
	fi
	echo "添加任务分区:$fname"
	$mma/mma_modify_job $fname $p2 $p3
done

#提交任务
for fname in $path/TABLE*
do
	if [[ $fname =~ "ods_" ]]; then
		echo "提交任务:$fname"
		$mma/mma_submit_job $fname
		ding_alert "迁移任务提交:$fname"
	fi
done

使用示例:mma_batch_job db_crm,或者:mma_batch_job db_crm 2015-01-01 2022-05-01

5.6监测任务进度

前面已经指定,完成的配置任务单独备份到 finished 目录下,这里加一个监测任务进度的脚本,成功后将配置迁移走

vim /data/soft/mma/mma-0.1.0/bin/mma_check_job

#!/bin/bash
#desc: 查看mma任务状态,如果成功,则将配置任务移动到finished目录下
#需要走定时,是环境变量生效
source /etc/profile

path=/data/soft/mma/mma-0.1.0/conf
mma=/data/soft/mma/mma-0.1.0/bin

function ding_alert() {
    webhook="https://oapi.dingtalk.com/robot/send?access_token=钉钉群机器人"
    curl ${webhook} \
        -H 'Content-Type: application/json' \
        -d '{"msgtype": "text",
                "text": {
                    "content": "'$1\ $2'"
                }
            }'
}

#循环每个库的配置任务是否完成
for db in $path/db*
do
    echo "监测的库:"$db
    for fname in $db/TABLE*
    do
            if [[ $fname =~ "ods_" ]]; then
                    echo "json配置任务:"$fname
                    jobid=`echo "$fname"|cut -d'-' -f5|cut -d'.' -f1`
                    echo "获取任务jobid:"$jobid
                    echo "获取任务进度..."
                    result=`$mma/mma_getinfo_job $jobid |grep "status:"|awk -F ' ' '{print $NF}'`
		    echo "当前任务进度:$result"
		    dt=$(date +'%Y-%m-%d %H:%M:%S')
                    if [[ $result == 'SUCCEEDED' ]];then
			    echo "完成时间:$dt"
                            echo "任务同步完成,完成时间:$dt,将任务移动到finished目录下"
                            mv $fname $db/finished
			    msg="迁移任务<"$fname">已完成,完成时间:"$dt""
                            ding_alert $msg
                    elif [[ $result != 'PENDING' && $result != 'RUNNING' && $result != 'SUCCEEDED' && $result != 'FAILED' && $result != 'CANCELED'  ]];then
			echo "未获取到任务进度,尝试重新提交任务..."
			$mma/mma_submit_job $fname
                    fi
            fi

    done
done

6.问题排查

查找导致失败的具体 Action

获取失败的jobid

/bin/mma-client --action ListJobs | grep FAILED

[root@data-es21 log]# ../bin/mma-client --action ListJobs | grep FAILED
Job ID: mma_1b37cda58bd446afabe355a86d488309, status: FAILED, progress: 0.00%
Job ID: 4bdc8676092a4dbc9dfd509936a03c07, status: FAILED, progress: 0.00%
OK

获得 Job ID 后可以执行以下命令获取失败的原因

grep "Job failed" /log/mma_server.LOG | grep mma_1b37cda58bd446afabe355a86d488309

[root@data-es21 log]# grep "Job failed" mma_server.LOG|grep mma_1b37cda58bd446afabe355a86d488309
2022-07-27 15:10:46,960 INFO  [main] job.AbstractJob (AbstractJob.java:fail(326)) - Job failed, id: mma_1b37cda58bd446afabe355a86d488309, reason: com.aliyun.odps.mma.server.task.HiveToMcTableDataTransmissionTask failed, id(s): 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3,2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.6,2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.7
2022-07-27 15:21:39,333 INFO  [main] job.AbstractJob (AbstractJob.java:fail(326)) - Job failed, id: mma_1b37cda58bd446afabe355a86d488309, reason: com.aliyun.odps.mma.server.task.HiveToMcTableDataTransmissionTask failed, id(s): 7b0ae9cc-5cb7-4a3d-81c4-381a31ccf1c8.DataTransmission.part.0,7b0ae9cc-5cb7-4a3d-81c4-381a31ccf1c8.DataTransmission.part.1,7b0ae9cc-5cb7-4a3d-81c4-381a31ccf1c8.DataTransmission.part.2
2022-07-27 15:32:36,619 INFO  [main] job.AbstractJob (AbstractJob.java:fail(326)) - Job failed, id: mma_1b37cda58bd446afabe355a86d488309, reason: com.aliyun.odps.mma.server.task.HiveToMcTableDataTransmissionTask failed, id(s): 2618bc2e-da37-421b-afd1-ca1c55cf3941.DataTransmission.part.0,2618bc2e-da37-421b-afd1-ca1c55cf3941.DataTransmission.part.1,2618bc2e-da37-421b-afd1-ca1c55cf3941.DataTransmission.part.2
[root@data-es21 log]#

获取失败的Action

grep 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3 mma_server.LOG | grep FAIL

[root@data-es21 log]# grep 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3 mma_server.LOG | grep FAIL
2022-07-27 14:58:19,139 ERROR [main] action.AbstractAction (AbstractAction.java:afterExecution(135)) - Action failed, actionId: 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3.DataTransmission, stack trace: java.util.concurrent.ExecutionException: java.sql.SQLException: org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
2022-07-27 14:58:19,139 INFO  [main] action.AbstractAction (AbstractAction.java:setProgress(160)) - Set action status, id: 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3.DataTransmission, from: RUNNING, to: FAILED
2022-07-27 14:58:19,139 INFO  [main] task.DagTask (DagTask.java:setStatus(92)) - Set task status, id: 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3, from: RUNNING, to: FAILED
2022-07-27 14:58:20,460 INFO  [main] server.JobScheduler (JobScheduler.java:handleTerminatedActions(245)) - Action terminated, id: 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3.DataTransmission, status: FAILED
2022-07-27 14:58:30,547 INFO  [main] server.JobScheduler (JobScheduler.java:handleTerminatedTasks(202)) - Task terminated, id: 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3, status: FAILED
2022-07-27 15:11:17,880 INFO  [main] job.JobManager (JobManager.java:listSubJobsByStatus(736)) - List sub jobs by status, parent job id: basics: mma_1b37cda58bd446afabe355a86d488309, TABLE, Hive, Hive, MaxCompute, MaxCompute, db_crm, t_call_log_current, PENDING, extended: 98a44535-3bb8-4465-894a-791a557d8095.SetUp, SUCCEEDED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.0, SUCCEEDED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.1, SUCCEEDED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.2, SUCCEEDED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3, FAILED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.4, SUCCEEDED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.5, SUCCEEDED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.6, FAILED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.7, FAILED, 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.8, SUCCEEDED, status: PENDING
[root@data-es21 log]#

Action失败类型,这里是DataTransmission,继续查找错误

grep 2ba83078-9db8-4d68-bf4c-f63aa60139bf.DataTransmission.part.3 mma_server.LOG | grep "stack trace"

按照这个步骤基本上可以确定错误原因。

更多请在公号平台搜索:选手一号位,本文编号:2006,回复即可获取。