mysql - sqoop merge-key 创建多个部分文件而不是一个不符合使用 merge-key 目的的文件

标签 mysql hadoop bigdata sqoop

理想情况下,当我们在不使用 merge-key 的情况下运行增量时,它将创建带有附加数据集的新文件,但如果我们使用 merge-key 那么它将创建新的整体数据集仅包含一个文件中的前一个数据集。但是当我在我的 sqoop 作业中使用 incremental append 时,我没有得到一个零件文件。以下是我的步骤:

1)初始数据:

mysql> select * from departments_per;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             2 | Fitness         |
|             3 | Footwear        |
|             4 | Apparel         |
|             5 | Golf            |
|             6 | Outdoors        |
|             7 | Fan Shop        |
+---------------+-----------------+  

2) 最初将数据导入到hdfs的sqoop命令:

sqoop import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_per \
--target-dir /departments \
-m 1

现在,当我看到 hdfs 下的目录 departments 时,我可以看到一个很好的部分文件。

3) 现在我在 mysql 中更新我的初始数据:

mysql> select * from departments_demo;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
|             2 | Fitness         |
|             3 | Footwear        |
|             4 | Apparel         |
|             5 | Golf            |
|             6 | Outdoors        |
|             7 | Fan             |
|             8 | Tushar MC       |
+---------------+-----------------+

4) 现在我创建增量附加作业并执行它:

sqoop job --create appendJobs12 \
-- import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_demo \
-m 1 \
--target-dir /departments \
--incremental append \
--merge-key department_id \
--check-column department_id \
--last-value 0 

sqoop job --exec appendJobs12   

5) 我可以在 hdfs 目录中看到两个部分文件,即使我使用了 merge-key 概念。

[cloudera@quickstart ~]$ hadoop fs -ls /departments
Found 3 items
-rw-r--r--   1 cloudera supergroup          0 2018-10-04 00:31 /departments/_SUCCESS
-rw-r--r--   1 cloudera supergroup         60 2018-10-04 00:31 /departments/part-m-00000
-rw-r--r--   1 cloudera cloudera           67 2018-10-04 00:37 /departments/part-m-00001  

当我显示数据时,它如下所示:

[cloudera@quickstart ~]$ hadoop fs -cat /departments/part-m-00000
2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan Shop 
[cloudera@quickstart ~]$ hadoop fs -cat /departments/part-m-00001
    2,Fitness
    3,Footwear
    4,Apparel
    5,Golf
    6,Outdoors
    7,Fan
    8, Tushar MC

其中一个部分文件保存初始数据,第二个部分文件保存更新后的数据。谁能告诉我我哪里出错了,因为我无法获得包含更新数据集的零件文件。提前致谢

最佳答案

我对此进行了研究,并在您的方法中遇到了同样的错误。所以,这是不正确的——阅读我不得不说的各种内容,我认为它不是那么清楚。无论如何。

我的印象是中间目标目录需要外部表和一些 LINUX 脚本。

所以,1) 我在 mysql 中添加了数据,然后 2) 执行了 sqoop 导入,然后 3) 在 mysql 中进行了更新,然后 4) 另一个增量导入,我认为这是不正确的,但你想要更新好的,接下来是 5) codegen,最后是 6) sqoop MERGE。

主要步骤如下:

初始导入

sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged  --warehouse-dir=/user/hive/warehouse --create-hive-table --hive-import --fields-terminated-by ',' --hive-drop-import-delims

像你一样增加负载

sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged  --warehouse-dir=/user/hive/warehouse --fields-terminated-by ',' --hive-drop-import-delims --last-value 0 --merge-key id --incremental append --check-column id

代码生成

 sqoop codegen --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged

合并

 sqoop merge --new-data /user/hive/warehouse/ged --onto /user/hive/warehouse/new_ged --merge-key id --target-dir /user/hive/merged/ged2 --jar-file /tmp/sqoop-cloudera/compile/c8d374075351d228c50d89354959762e/ged.jar -class-name ged

结果: [cloudera@quickstart ~]$ hadoop fs -cat/user/hive/merged/ged2/* 1,年年年 2、彼得 3、鲍比 4、玛丽亚 5、笑话 6、 clown

因此我最初有 1, XXX 而不是 6, Joker

这有点不同,所以我不确定该说些什么。在任何情况下,1 个文件都不是具有大量数据的有效假设。您的陈述可能适用于额外的参数,但这也适用。

这里的线索是通过合并更新不可变系统,需要不同的目标,这些目标可以通过外部表命令根据位置进行切换。

关于mysql - sqoop merge-key 创建多个部分文件而不是一个不符合使用 merge-key 目的的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52641463/

相关文章:

mysql - 问题: Joining two views in MySQL

java - 如何使用 Java 将 MySQL 数据库连接到 GWT 应用程序?

python - 在 Python 中处理大型数据库表的每一行

php - 数据库SELECT查询问题

hadoop - 从 REDUCER 将输出写入多个表

arrays - 在数组或Scala Spark中的其他任何集合中迭代RDD和存储的值

hadoop - Apache Ranger 2.0.0-SNAPSHOT:无法安装和配置HDFS插件

r - 将 data.frame 转换为 ff

parallel-processing - 弗林克 : how does the parallelism set in the Jobmanager UI relate to task slots?

c# - 查询映射的 CustomObject 时出现 NullPointerException