Dataproc 上的 Sqoop 无法将数据导出为 Avro 格式

Posted

技术标签:

【中文标题】Dataproc 上的 Sqoop 无法将数据导出为 Avro 格式【英文标题】:Sqoop on Dataproc cannot export data to Avro format 【发布时间】:2019-02-26 05:12:12 【问题描述】:

我想使用 Sqoop 从 Postgres 数据库中提取数据,我使用 Google Dataproc 来执行 Sqoop。但是,当我提交 Sqoop 作业时出现错误。

我使用以下命令:

使用1.3.24-deb9镜像版本创建集群

gcloud dataproc clusters create <CLUSTER_NAME> \ 
    --region=asia-southeast1 --zone=asia-southeast1-a \
    --properties=hive:hive.metastore.warehouse.dir=gs://<BUCKET>/hive-warehouse \
    --master-boot-disk-size=100 

提交工作

gcloud dataproc jobs submit hadoop --cluster=<CLUSTER_NAME> \
    --region=asia-southeast1 \
    --class=org.apache.sqoop.Sqoop \
    --jars=gs://<BUCKET>/sqoop-1.4.7-hadoop260.jar,gs://<BUCKET>/avro-tools-1.8.2.jar,gs://<BUCKET>/postgresql-42.2.5.jar \
    -- \
    import -Dmapreduce.job.user.classpath.first=true \
    --connect=jdbc:postgresql://<HOST>:5432/<DATABASE> \
    --username=<USER> \
    --password-file=gs://BUCKET/pass.txt \
    --target-dir=gs://<BUCKET>/<OUTPUT> \
    --table=<TABLE> \
    --as-avrodatafile

错误

19/02/26 04:52:38 INFO mapreduce.Job: Running job: job_1551156514661_0001
19/02/26 04:52:48 INFO mapreduce.Job: Job job_xxx_0001 running in uber mode : false
19/02/26 04:52:48 INFO mapreduce.Job:  map 0% reduce 0%
19/02/26 04:52:48 INFO mapreduce.Job: Job job_xxx_0001 failed with state FAILED due to: Application application_xxx_0001 failed 2 times due to AM Container for appattempt_xxx_0001_000002 exited with  exitCode: 1
Failing this attempt.Diagnostics: [2019-02-26 04:52:47.771]Exception from container-launch.
Container id: container_xxx_0001_02_000001
Exit code: 1

[2019-02-26 04:52:47.779]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
log4j:WARN No such property [containerLogFile] in org.apache.hadoop.yarn.ContainerLogAppender.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/hadoop/yarn/nm-local-dir/usercache/root/filecache/10/libjars/avro-tools-1.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.25.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.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (org.apache.hadoop.mapreduce.v2.app.MRAppMaster).


[2019-02-26 04:52:47.780]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
log4j:WARN No such property [containerLogFile] in org.apache.hadoop.yarn.ContainerLogAppender.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/hadoop/yarn/nm-local-dir/usercache/root/filecache/10/libjars/avro-tools-1.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.25.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.slf4j.impl.Log4jLoggerFactory]

【问题讨论】:

【参考方案1】:

问题可能出在 Dataproc 的 Hadoop (Avro 1.7.7) 和 Sqoop 1.4.7 (Avro 1.8.1) 中的不同 Avro 版本中。

您可能想尝试将 Sqoop 降级到依赖 Avro 1.7 的 1.4.6 并在作业提交期间使用 avro-tools-1.7.7.jar

已编辑:

要解决类加载问题,您需要在提交 Dataproc 作业时设置mapreduce.job.classloader=true

gcloud dataproc jobs submit hadoop --cluster=<CLUSTER_NAME> \
    --class=org.apache.sqoop.Sqoop \
    --jars=gs://<BUCKET>/sqoop-1.4.7-hadoop260.jar \
    --properties=mapreduce.job.classloader=true \
    -- \
    . . .

【讨论】:

那行不通。我使用的是 1.3.24-deb9 镜像版本、Sqoop 1.4.6 和 avro-tools-1.7.7.jar 尝试在作业提交命令中通过Dataproc属性设置mapreduce.job.user.classpath.first属性:--properties=mapreduce.job.user.classpath.first=true 另外,您可能想尝试设置mapreduce.job.classloader 属性而不是mapreduce.job.user.classpath.first 属性:--properties=mapreduce.job.classloader=true 我更改为类加载器,它可以工作! --properties=mapreduce.job.classloader=true 我在使用 sqoop + hadoop 时遇到了同样的问题。 --properties=mapreduce.job.classloader=true 也为我修复了它。

以上是关于Dataproc 上的 Sqoop 无法将数据导出为 Avro 格式的主要内容,如果未能解决你的问题,请参考以下文章

错误 - 使用 Apache Sqoop 和 Dataproc 从 SQL Server 导入 GCS

Dataproc 笔记本无法导入或导出到 BigQuery:找不到类异常

数据导出/迁移(Sqoop技术)

Sqoop 导出失败。无法解析输入数据:'<data>'

sqoop export 无法将数据从 hive 仓库文件夹加载到 mysql

一个sqoop export案例中踩到的坑