Sqoop fetchsize失效

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

前几天线上Sqoop的一个Job(从MySQL抽取数据到Hadoop)突然报了OOME,后重跑并做java trace发现内存占用都是byte[],同时cpu top 3的方法都是com.mysql.jdbc.ByteArraryBuffer.getBytes即内存都是被数据消耗掉了;很奇怪,为什么在option里指定了fetch-size=100怎么会OOME呢(平均记录长度不到1kb);

再看昨天成功的发现100W条记录,发现占用了860MB内存,明显是fetch-size没有生效

+---------+---------+------------+----------+-------------+--------------+

|type | status | host | cpusec | mrinput_rec |memory_mb |

+---------+---------+------------+----------+-------------+--------------+

|CLEANUP | SUCCESS | A | 0.3400 | NULL | 191.84765625 |

|MAP | SUCCESS | A | 335.6400 | 1006942 | 862.39843750 |

|SETUP | SUCCESS | B | 0.2000 | NULL | 179.34765625 |

+---------+---------+------------+----------+-------------+--------------+

没办法,把sqoop源码翻出来终于发现RC了:fetchsize被忽略掉了

protectedvoidinitOptionDefaults() {

if(options.getFetchSize() == null) {

LOG.info("Preparing to use a MySQL streaming resultset.");

options.setFetchSize(Integer.MIN_VALUE);

elseif(

!options.getFetchSize().equals(Integer.MIN_VALUE)

&&!options.getFetchSize().equals(0)) {

LOG.info("Argument '--fetch-size "+ options.getFetchSize()

"' will probably get ignored by MySQL JDBC driver.");

}

}

究其原因是MySQL提供的API只支持row-by-rowall模式:

By default,ResultSets are completely retrieved and stored in memory. In most cases this isthe most efficient way to operate, and due to the design of the MySQL networkprotocol is easier to implement. If you are working with ResultSets that have alarge number of rows or large values, and cannot allocate heap space in yourJVM for the memory required, you can tell the driver to stream the results backone row at a time.

http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html

最后把fetchsize给去掉了,Job执行成功,700W行占用内存400MB

+---------+---------+------------+----------+-------------+--------------+

| type | status | host | cpusec | mrinput_rec | memory_mb |

+---------+---------+------------+----------+-------------+--------------+

| CLEANUP | SUCCESS | A | 0.4200 | NULL | 183.49218750 |

| MAP | FAILED | B | NULL | NULL | NULL |

| MAP | SUCCESS | A | 377.1200 | 7195560 | 408.08593750 |

| SETUP | SUCCESS | C | 0.2900| NULL | 188.64843750 |

+---------+---------+------------+----------+-------------+--------------+



本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1298634,如需转载请自行联系原作者


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
69
分享
相关文章
Flink问题之隔断时间重启如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
11月前
|
flink问题之state过期设置如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
473 0
HBase常用shell操作(未完成)
HBase常用shell操作(未完成)
122 1
Hive操作超时错误:Session 0x0 for server null
Hive操作超时错误:Session 0x0 for server null
114 1
hbase_异常_01_Hbase: Failed to become active master
一、异常现象 启动hbase之后,抛出异常,异常信息如下: master.HMaster: Failed to become active master hbase java.net.ConnectException: Call From to 9000 failed on connection exception: java.
2905 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等