Sqoop 导入具有带 where 子句和并行处理的 SQL 查询

Posted

技术标签:

【中文标题】Sqoop 导入具有带 where 子句和并行处理的 SQL 查询【英文标题】:Sqoop import having SQL query with where clause and parallel processing 【发布时间】:2018-12-15 17:21:35 【问题描述】:

我在 mysql 中有一个如下表:

订单详情:

+---------+------------+-------------------+--------------+                                                                                                                                                        
| orderid | order_date | order_customer_id | order_status |                                                                                                                                                        
+---------+------------+-------------------+--------------+                                                                                                                                                        
| A001    | 10/30/2018 | C003              | Completed    |                                                                                                                                                        
| A002    | 10/30/2018 | C005              | Completed    |                                                                                                                                                        
| A451    | 11/02/2018 | C376              | Pending      |                                                                                                                                                        
| P9209   | 10/30/2018 | C234              | Completed    |                                                                                                                                                        
| P92099  | 10/30/2018 | C244              | Pending      |                                                                                                                                                        
| P9210   | 10/30/2018 | C035              | Completed    |                                                                                                                                                        
| P92398  | 10/30/2018 | C346              | Pending      |                                                                                                                                                        
| P9302   | 10/30/2018 | C034              | Completed    |                                                                                                                                                        
+---------+------------+-------------------+--------------+ 

以及如下描述:

mysql> desc Order_Details_Sankha;                                                                                                                                                                                  
+-------------------+-------------+------+-----+---------+-------+                                                                                                                                                 
| Field             | Type        | Null | Key | Default | Extra |                                                                                                                                                 
+-------------------+-------------+------+-----+---------+-------+                                                                                                                                                 
| orderid           | varchar(20) | NO   | PRI |         |       |                                                                                                                                                 
| order_date        | varchar(20) | YES  |     | NULL    |       |                                                                                                                                                 
| order_customer_id | varchar(20) | YES  |     | NULL    |       |                                                                                                                                                 
| order_status      | varchar(20) | YES  |     | NULL    |       |                                                                                                                                                 
+-------------------+-------------+------+-----+---------+-------+  

我正在使用以下 sqoop 并行处理导入

sqoop import 
--connect jdbc:mysql://ip-10-0-1-10.ec2.internal/06july2018_new 
--username labuser 
--password abc123
--driver com.mysql.jdbc.Driver 
--query "select * from Order_Details where order_date = '10/30/2018'  AND \$CONDITIONS" 
--target-dir /user/sankha087_gmail_com/outputs/EMP_Sankha_1112201888 
--split-by ","   
--m 3

我收到以下错误消息

18/12/15 17:15:14 WARN security.UserGroupInformation: PriviledgedActionException as:sankha087_gmail_com (auth:SIMPLE) cause:java.io.IOException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You hav
e an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '), MAX(,) FROM (select * from Order_Details_Sankha where order_date = '10/30/201' a
t line 1                                                                                                                                                                                                           
18/12/15 17:15:14 ERROR tool.ImportTool: Import failed: java.io.IOException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to 
your MySQL server version for the right syntax to use near '), MAX(,) FROM (select * from Order_Details_Sankha where order_date = '10/30/201' at line 1                                                            
        at org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.getSplits(DataDrivenDBInputFormat.java:207)                                                                                                       
        at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:305)                                                                                                                          
        at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:322)                                                                                                                             
        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:200)                                                                                                                       
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1307)   

请在我的导入声明中告知需要更改的内容。

【问题讨论】:

【参考方案1】:

Sqoop 并行执行不会发生在垂直拆分中,它会发生在水平拆分中。

--split-by 应该是一个列名。列应该是均匀分布的。

https://sqoop.apache.org/docs/1.4.0-incubating/SqoopUserGuide.html#id1765770

阅读:7.2.4。控制并行度

【讨论】:

如果您在查询中使用的映射器数量比您不需要使用 --split-by 子句 感谢 Gaurang,它成功了 :)。我在 --split-by 中给出了主键列。但是告诉我一件事在什么情况下,我可以使用:--split-by "," 感谢 Mahesh 的回复,我尝试只提供映射器编号,然后它再次特别要求 --split-By 这是不正确的。如果您使用多个映射器,则必须指定--split-by,因为sqoop 无法根据需要为多个映射器划分哪些表来理解。仅当您使用单个映射器时才需要-m1 嗨 Gaurang,你是绝对正确的,通过你的解决方案,我能够成功执行它。但除此之外,我执行了以下导入,其中我为映射器指定了 --split-by "," 1 并且成功了。

以上是关于Sqoop 导入具有带 where 子句和并行处理的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop 导入映射器失败,但 sqoop 作业显示正在运行

当少数表没有主键时,sqoop import-all 具有并行性

Sqoop 导入失败,“on 子句”中有未知列

使用 Sqoop 并行导入 Oracle 表的最佳方法是啥?

利用SQOOP将数据从数据库导入到HDFS(并行导入,增量导入)

如何使用 sqoop 导入支持带空格的列名?