Sqoop导入数据发生数据倾斜问题 及更好解决

Sqoop导入数据发生数据倾斜问题 及更好解决

一:问题

在生产环境中,由于数据是庞大的,且是复杂的

Sqoop抽数使用单实例报内存溢出以及抽数时间过长,决定采用sqoop的多实例并行抽数

官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

二:具体原理:

Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中。同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306//gmall \
--username xxxx \
--passwoed xxxx \
--table xxxx \
--columns xxxx.xxxx \
--where "xxxx" \
--target_dir /xxxx \
--fields-terminated-by '\t'  \
--num-mappers 2 \
--split-by xxxx

注意:

–split-by 后面要是int类型,并且是连续递增的,那么sqpli-by 会平分的很均匀,要是不是自增的那么有的maptask还是很忙,而有的maptask则不是很忙
–num-mappers 后面设置的maptask数目大于1的话,那么–split-by 后面必须跟字段,因为–num-mappers 后面要是1的话,那么
–split-mappers 后面跟不跟字段都没有意义,因为,他只会启动一个maptask进行数据处理。

三:如果id数据分布不均及id重复同样会出现数据倾斜

里需要使用–query 方式:涉及参数 --query、–split-by、–boundary-query

–query: select column1、 column2、 column3、 columnN from (select ROWNUM() OVER() AS ETL_ID, T.* from table T where xxx ) where $CONDITIONS

–split-by: ETL_ID

–boundary-query: select 1 as MIN , sum(1) as MAX from table where xxx

具体原理就是通过ROWNUM() 生成一个严格均匀分布的字段,然后指定为分割字段

参考资源链接:[使用sqoop将mysql数据导入parquet格式的hive](https://wenku.csdn.net/doc/7h9ojm3mtx?utm_source=wenku_answer2doc_content) 在通过Sqoop将MySQL数据库的数据迁移到Hive的Parquet格式表中,首先需要确保已经安装并配置好Sqoop以及相关的Hadoop环境。以下是操作步骤和需要注意的细节: 1. **Sqoop安装与配置**:确保Sqoop与Hadoop环境兼容,包括Java环境配置、Hadoop配置文件(core-site.xml和hdfs-site.xml)的正确设置,以及Sqoop配置文件(conf/sqoop-site.xml)中的连接信息。 2. **创建Hive表**:在Hive中创建一个Parquet格式的表,该表结构需要与MySQL中的表结构相对应。例如,如果MySQL中的表有一个INT类型的id字段,Hive表中的对应字段也应为INT类型。 3. **使用Sqoop执行数据迁移**: - 使用命令`sqoop import --connect jdbc:mysql://[MySQL_HOST]:[PORT]/[DATABASE] --username [USERNAME] --password [PASSWORD] --table [TABLE_NAME] --hive-table [HIVE_DATABASE].[HIVE_TABLE] --fields-terminated-by ',' --null-non-string '\\N' --null-string '\\N' --delete-target-dir --direct --map-column-java [COLUMN_NAME]=String --num-mappers [NUMBER_OF_MAP_TASKS] --split-by [SPLIT_BY_COLUMN] --target-dir [HDFS_OUTPUT_DIR] ***press.SnappyCodec --as-parquetfile`来执行数据导入。 4. **检查数据完整性**:在数据迁移完成后,需要验证Hive表中的数据是否完整且与MySQL源表一致。 5. **错误排查与解决方案**: - **数据类型不匹配**:确保MySQL数据类型与Hive中的Parquet定义类型兼容,例如,MySQL的CHAR和VARCHAR类型在Parquet中对应String类型。 - **Sqoop版本兼容性**:旧版本的Sqoop可能不支持Parquet格式的直接导入,这时需要升级Sqoop到支持的版本。 - **MapReduce作业失败**:如果遇到MapReduce作业失败,需要检查Hadoop集群的状态,调整Sqoop的`--num-mappers`参数,优化资源分配。 6. **数据迁移的性能优化**: - 考虑使用`--split-by`参数将数据均匀分配到不同的Map任务中,减少数据倾斜。 - 根据数据量和集群的处理能力调整Map任务的数量。 通过以上步骤和注意事项,可以有效地使用Sqoop将MySQL中的数据迁移到Hive的Parquet格式表中。如需进一步深入了解Sqoop的使用和优化,建议参考《使用sqoop将mysql数据导入parquet格式的hive》这一资料。它不仅包含了操作步骤的详细说明,还涵盖了数据迁移的最佳实践和高级配置技巧,能够帮助你更深入地理解和掌握Sqoop的使用。 参考资源链接:[使用sqoop将mysql数据导入parquet格式的hive](https://wenku.csdn.net/doc/7h9ojm3mtx?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值