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命令中看到了很多东西:

  1. merge key的概念只针对“lastmodified”增量加载类型引入,这样可以照顾更新的记录- 但以上要求用于追加模式。 *始终在附加模式下,创建新的映射器分区文件: /departments/part-m-00000 /departments/part-m-00001
  2. 要获取一部分文件 - 仅使用 lastmodified" 增量加载。
  3. 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