Sqoop --split by 支持的类型及现象

本文探讨了在使用Sqoop进行数据导入时如何选择合适的拆分列,避免数据倾斜和任务不平衡的问题。详细介绍了split-by参数的使用场景,特别是在面对不同数据类型时的注意事项,以及如何解决varchar类型splitkey带来的挑战。

如果主键存在的话就默认使用主键作为拆分列
如果主键的实际值在其范围内不均匀分布,则可能导致任务不平衡。您应该使用–split-by参数显式选择不同的列
Sqoop目前无法拆分多列索引。如果表没有索引列,或者具有多列键,则还必须手动选择拆分列。
–split-by对非数字类型的字段支持不好,会导致无法切分任务。一般用于主键及数字类型的字段

split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域
当int的范围特别小的时候,最后一个mapper会有一定倾斜

split key 要求 非空

  • sqoop mysql -> hive 当指定 split key 为 varchar类型时会遇到的情况
    现象
    1、任务无法切分,数据倾斜造成速度慢或者内存溢出
    2、split key 字段存在空值时会丢失数据

目前想到的解决办法是:将-m 设置称1,split-by不设置,即只有一个map运行,缺点是不能并行map录入数据。(注意,当-m 设置的值大于1时,split-by必须设置字段)

split key 支持的好的有一下数据类型

BigDecimal,Boolean,Date,Float,Integer

BigDecimalSplitter.java

BooleanSplitter.java

DBSplitter.java

DateSplitter.java

FloatSplitter.java

IntegerSplitter.java

OracleDateSplitter.java
#! /bin/bash sqoop=/bigdata/sqoop-1.4.7.bin__hadoop-2.6.0/bin/sqoop (){ $sqoop import \ --connect jdbc:mysql://192.168.141.130:3306/telecom_billing \ --username root \ --password Mzp_2022! \ --target-dir /origin_data/telecom_billing/db/$1/$do_date \ --delete-target-dir \ --query $2 and \$CONDITIONS \ --num-mappers 1 \ --fields-terminated-by '\t' } import_Customer(){ Customer select customer_id , customer_name, customer_type from Customer } import_publicCustomer(){ publicCustomer select customer_id, customer_name, customer_type, community, community_manager, Industry, Telecommunications_Officer from publicCustomer } import_businessCusomer(){ businessCusomer select customer_id , customer_name , customer_type, community , community_manager, Industry , Telecommunications_Officer from businessCusomer } import_bigCusomer(){ bigCusomer select customer_id , customer_name, customer_type, community , community_manager, Industry , Telecommunications from bigCusomer } import_speciality(){ speciality select customer_id, customer_name, customer_type, community , community_manager from speciality } import_Account(){ Account select ID , sk_ID, zhanhao , OpenBank, subBank, readyAmount_ BIGINT, CostAmount_ BIGINT , curMonthAmount_ BIGINT from Account } import_phone_info(){ phone_info select When_number , P_address , Settlement_Account from phone_info } import_sale(){ sale select Phone_number , kh_ID, publicCustomer_Ratio, businessCusomer_Ratio from sale } import_call_records(){ call_records select id , Phone_number , Phone_address , Call_Duration from call_records } case $1 in Customer ) import_Customer ;; publicCustomer ) import_publicCustomer ;; businessCusomer ) import_businessCusomer ;; bigCusomer ) import_bigCusomer ;; speciality ) import_speciality ;; Account ) import_Account ;; phone_info ) import_phone_info ;; sale ) import_sale ;; call_records ) import_call_records ;; first ) import_Customer import_publicCustomer import_businessCusomer import_bigCusomer import_speciality import_Account import_phone_info import_sale import_call_records ;; all ) import_Customer import_publicCustomer import_businessCusomer import_bigCusomer import_speciality import_Account import_phone_info import_sale import_call_records ;; esac echo 数据同步完成。
最新发布
11-19
### Sqoop 的常见用法及问题总结 #### 一、Sqoop 基本概念 Sqoop 是一种用于在 Hadoop 和关系型数据库之间高效传输数据的工具。它支持将结构化数据导入到 HDFS 中,或者从 HDFS 导出到关系型数据库中[^1]。 --- #### 二、常见问题及解决方案 ##### 1. **空值问题** 当使用 Sqoop 进行数据迁移时,可能会遇到因为空值而导致的数据错误或程序崩溃的情况。这种情况下可以通过调整 SQL 查询语句来过滤掉可能引起问题的空值记录。 ##### 2. **数据类型映射问题** 不同数据库之间的数据类型可能存在差异,因此在使用 Sqoop 转移数据时需要注意目标表和源表之间的数据类型匹配。如果不一致,则可能导致插入失败或其他异常情况发生。针对此问题,可以手动指定列名以及对应的 Java 类型作为参数传递给 Sqoop 工具以实现精确控制[^2]。 ##### 3. **大数据量传输性能优化** 对于大规模数据集来说,默认单线程模式下的速度往往无法满足需求。此时可通过增加 `--num-mappers` 参数数量提高并发度进而提升效率;但是要注意的是还需要配合合理选择拆分键(`--split-by`)使得每条 map task 处理的工作负载尽可能均衡以免造成资源浪费甚至任务超时等问题出现[^4]。 ##### 4. **数据一致性保障机制** 为了防止在网络中断或者其他意外状况下丢失部分已成功写入但未提交事务的部分更改内容, 可考虑采用如下策略之一: - 使用增量抽取方式只获取新增加或者修改过的记录; - 启用 lastmodified 模式定期同步那些自上次操作以来发生变化的信息项. --- #### 三、实际案例分析 假设我们已经运行了一个简单的 Sqoop 数据提取命令并将结果保存到了 HDFS 上面某个目录里边去之后想要查看具体文件里面存储的内容是什么样子的话就可以利用下面这条 Linux shell 命令完成该目的:`hdfs dfs -cat /sqoopdata/emp/par*` 。这里展示了如何通过HDFS客户端读取由Sqoop生成的结果文件片段[^3]。 --- #### 四、注意事项 关于设置多个 Mapper 数目 (`--num-mappers N`) 来加速整个过程的同时也要考虑到实际情况比如是否存在热点分区现象等等因素的影响最终决定最佳配置方案。 --- ```bash # 示例代码:从 MySQL 到 HDFS 的基本 Sqoop 命令 sqoop import \ --connect jdbc:mysql://localhost/mydb \ --username root \ --password secret \ --table employees \ --target-dir /user/hive/warehouse/sqoop_imported_employees \ --fields-terminated-by ',' \ --lines-terminated-by '\n' \ --null-string '\\N' \ --null-non-string '\\N' ``` 上述脚本展示了一种标准做法即把来自远程MySQL服务器上的employee表格全部迁移到本地集群内的/user/hive/warehoue路径之下,并且指定了逗号分隔符以及其他一些选项用来处理特殊字符如NULL值等情形^. --- #### 五、结论 综上所述,Sqoop 不仅能够简化跨平台间的大规模数据交换流程而且提供了丰富的功能模块帮助开发者应对各种复杂场景下的挑战。然而要想充分发挥其潜力则需要深入理解各个核心组件的作用原理并结合项目特点灵活运用相关技巧才能达到理想效果^. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值