sqoop合并密钥创建多个零件文件,而不是一个不使用合并密钥的文件

时间:2018-10-04 07:40:08

标签: 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)sqoop命令最初将数据导入hdfs:

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

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

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

其中一个部分文件包含初始数据,第二个文件包含更新的数据。谁能告诉我我要去哪里错了,因为我无法使用更新的数据集获得一个零件文件。预先感谢

1 个答案:

答案 0 :(得分:0)

我对此进行了研究,并发现与您的方法相同的错误。因此,这是不正确的-阅读各种内容我不得不说,我认为这还不是很清楚。无论如何。

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

因此,1)我在mysql中添加了数据,并且2)在进行了sqoop导入,然后3)在mysql中进行了更新,然后进行了4)另一个增量导入,就像你所做的那样,我认为这不是很正确,但是你想要更新好的,接下来是5)代码生成,最后是6)合并合并。

这些是主要步骤:

初始导入

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

Codegen

 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,YYY     2,彼得     3,鲍比     4,玛丽亚     5,笑话     6,小丑

我原来只有1,XXX,但没有6,小丑

这有些不同,所以我不确定要说什么。在任何情况下,一个文件都不是具有大量数据的有效假设。您的语句可以使用其他参数,但这也可以。

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