【问题标题】:sqoop merge-key creating multiple part files instead of one which doesn't serve the purpose of using merge-keysqoop 合并键创建多个部分文件,而不是一个不符合使用合并键目的的文件
【发布时间】:2019-03-09 12:51:09
【问题描述】:

理想情况下,当我们在没有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

其中一个部分文件保存初始数据,第二个保存更新数据。谁能告诉我我哪里出错了,因为我无法使用更新的数据集获取一个部分文件。在此先感谢

【问题讨论】:

  • 我发现手册中对此的描述相当混乱。
  • 好的。哪个部分令人困惑,所以我明天可以编辑它
  • 之前相同的代码运行良好,但今天我再次测试时,它失败了。奇怪!
  • 手册有点混乱。看看这里sqoop.apache.org/docs/1.4.2/…
  • 是的,我已经读过了。他们在那里提到了用于合并新旧数据集的合并工具

标签: mysql hadoop bigdata sqoop


【解决方案1】:

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

我觉得中间目标目录需要外部表和一些 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 个文件都不是具有大量数据的有效假设。您的语句可能适用于额外的参数,但这也适用。

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

【讨论】:

  • 是的,使用合并工具我能够合并两个数据集。
  • 大声笑!谢谢 。也感谢您的努力
  • 你能帮我解决这个问题吗stackoverflow.com/questions/52906895/…
  • 明天看看
  • 好的np。只要你有时间
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 2022-01-04
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
相关资源
最近更新 更多