如何使用Sqoop命令同时将数据保存至HDFS与AWS S3?
解决Sqoop同时导出到HDFS和AWS S3的问题
嗨,我来帮你搞定这个问题!首先得明确:Sqoop本身不支持一次import操作同时将数据输出到两个不同的存储系统,你命令里重复使用--target-dir的方式是无效的——Sqoop的参数解析逻辑中,重复的路径参数要么只会识别最后一个,要么像你遇到的那样只生效第一个,这是因为Sqoop底层依赖的MapReduce作业只能指定一个输出路径和对应的存储适配。
下面给你几个可行的解决方案,按实用性和复杂度排序:
方案1:先导入到一个存储,再用distcp同步到另一个(推荐)
这个方法只需要扫源数据库一次,然后用Hadoop原生的distcp工具完成跨存储的高效复制,既减少了对数据库的压力,又能保证数据一致性。
步骤1:先将数据导入到HDFS(或S3,选哪个都可以)
sqoop import -D mapreduce.job.name=XXX -D mapred.job.queue.name=XX -Dhadoop.security.credential.provider.path=<path> -Dfs.s3a.server-side-encryption-algorithm=#### --options-file <path> --query "select cols from DB.Table where UPDATETIME between to_date('2015-09-11 00:00:00','yyyy/mm/dd hh24:mi:ss') and to_date('2018-05-24 04:28:16','yyyy/mm/dd hh24:mi:ss') and \$CONDITIONS" --hive-delims-replacement ' ' --direct --m 1 --split-by ID --target-dir <hdfs path>
步骤2:用distcp将HDFS数据同步到S3
hadoop distcp <hdfs path> <S3 path>
如果你的集群已经配置好正确的S3权限(比如通过hadoop.security.credential.provider.path里的凭证),这个命令会自动并行复制数据,效率很高。
方案2:执行两次Sqoop import(简单但对数据库压力大)
如果你的数据库能承受两次查询的压力,可以直接分别执行两次Sqoop命令,一次输出到S3,一次输出到HDFS:
导入到S3的命令
sqoop import -D mapreduce.job.name=XXX -D mapred.job.queue.name=XX -Dhadoop.security.credential.provider.path=<path> -Dfs.s3a.server-side-encryption-algorithm=#### --options-file <path> --query "select cols from DB.Table where UPDATETIME between to_date('2015-09-11 00:00:00','yyyy/mm/dd hh24:mi:ss') and to_date('2018-05-24 04:28:16','yyyy/mm/dd hh24:mi:ss') and \$CONDITIONS" --hive-delims-replacement ' ' --direct --m 1 --split-by ID --target-dir <S3 path>
导入到HDFS的命令
sqoop import -D mapreduce.job.name=XXX -D mapred.job.queue.name=XX -Dhadoop.security.credential.provider.path=<path> -Dfs.s3a.server-side-encryption-algorithm=#### --options-file <path> --query "select cols from DB.Table where UPDATETIME between to_date('2015-09-11 00:00:00','yyyy/mm/dd hh24:mi:ss') and to_date('2018-05-24 04:28:16','yyyy/mm/dd hh24:mi:ss') and \$CONDITIONS" --hive-delims-replacement ' ' --direct --m 1 --split-by ID --target-dir <hdfs path>
注意:如果两次执行期间数据库数据有变化,可能会导致两个存储的数据不一致,所以更推荐方案1。
方案3:自定义OutputFormat(复杂,不推荐普通场景)
如果你有开发能力,可以自定义一个支持同时输出到HDFS和S3的OutputFormat,但这个需要修改Sqoop的作业配置,开发和维护成本很高,除非有特殊需求,否则不建议使用。
内容的提问来源于stack exchange,提问作者LUZO
相关产品推荐
相关产品推荐

