sqoop merge-key 创建多个部分文件而不是一个不符合使用 merge-key 目的的文件
sqoop merge-key creating multiple part files instead of one which doesn't serve the purpose of using merge-key
理想情况下,当我们 运行 没有 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) 即使我使用 merge-key
概念,我也可以在 hdfs 目录中看到两个部分文件。
[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
其中一部分文件保存初始数据,第二部分文件保存更新后的数据。谁能告诉我我哪里出错了,因为我无法获得包含更新数据集的零件文件。提前致谢
我对此进行了研究,发现您的方法出现了同样的错误。所以,这是不正确的——阅读我不得不说的各种内容,我认为它不是那么清楚。不管怎样
我的印象是中间目标目录需要外部 tables 和一些 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、小丑
原来我有 1, XXX 而不是 6, Joker
这有点不同,所以我不确定该说些什么。在任何情况下,1 个文件都不是具有大量数据的有效假设。您的陈述可能适用于额外的参数,但这也适用。
这里的线索是通过合并更新 immutable 系统,需要不同的目标,这些目标可以通过外部 table 命令根据位置进行切换。
总是有好的回答时间,永远不会迟到!!!
只是刷新了我的回忆,希望你会得到它。
我在上面的incremental import sqoop命令中看到了很多东西:
- merge key的概念只针对“lastmodified”增量加载类型引入,这样可以照顾更新的记录- 但以上要求用于追加模式。
*始终在附加模式下,创建新的映射器分区文件:
/departments/part-m-00000
/departments/part-m-00001
- 要获取一部分文件 - 仅使用 lastmodified" 增量加载。
- merge-key 不推荐到 运行 通过 sqoop jobs-technically 命令会起作用,但是 merge-key 的 main objective 将无法实现。
4)这只是在sqoop命令中调用reducer进程的地方。
/departments/part-r-00000 ( r -reducer ) ---> 如果 merge-key 是 运行 对于 lastmodified 增量负载。
sqoop 导入
--connect jdbc:mysql://localhost/practice
--用户名 root
--密码cloudera
--table departments_demo
--m 1
--target-dir /部门
--incremental lastmodified\ ===>所做的更改
--merge-key department_id \
--check-column \ ==>只允许日期和时间戳数据类型
--last-value 0
理想情况下,当我们 运行 没有 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) 即使我使用 merge-key
概念,我也可以在 hdfs 目录中看到两个部分文件。
[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
其中一部分文件保存初始数据,第二部分文件保存更新后的数据。谁能告诉我我哪里出错了,因为我无法获得包含更新数据集的零件文件。提前致谢
我对此进行了研究,发现您的方法出现了同样的错误。所以,这是不正确的——阅读我不得不说的各种内容,我认为它不是那么清楚。不管怎样
我的印象是中间目标目录需要外部 tables 和一些 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、小丑
原来我有 1, XXX 而不是 6, Joker
这有点不同,所以我不确定该说些什么。在任何情况下,1 个文件都不是具有大量数据的有效假设。您的陈述可能适用于额外的参数,但这也适用。
这里的线索是通过合并更新 immutable 系统,需要不同的目标,这些目标可以通过外部 table 命令根据位置进行切换。
总是有好的回答时间,永远不会迟到!!! 只是刷新了我的回忆,希望你会得到它。
我在上面的incremental import sqoop命令中看到了很多东西:
- merge key的概念只针对“lastmodified”增量加载类型引入,这样可以照顾更新的记录- 但以上要求用于追加模式。 *始终在附加模式下,创建新的映射器分区文件: /departments/part-m-00000 /departments/part-m-00001
- 要获取一部分文件 - 仅使用 lastmodified" 增量加载。
- merge-key 不推荐到 运行 通过 sqoop jobs-technically 命令会起作用,但是 merge-key 的 main objective 将无法实现。 4)这只是在sqoop命令中调用reducer进程的地方。 /departments/part-r-00000 ( r -reducer ) ---> 如果 merge-key 是 运行 对于 lastmodified 增量负载。
sqoop 导入
--connect jdbc:mysql://localhost/practice
--用户名 root
--密码cloudera
--table departments_demo
--m 1
--target-dir /部门
--incremental lastmodified\ ===>所做的更改
--merge-key department_id \
--check-column \ ==>只允许日期和时间戳数据类型
--last-value 0