Sqoop fetchsize失效

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

前几天线上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,如需转载请自行联系原作者


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL 流计算
Flink CDC 3.0中,如果你想在同步MySQL数据时排除某列
Flink CDC 3.0中,如果你想在同步MySQL数据时排除某列
72 1
|
20小时前
|
SQL 存储 算法
【Hive】Hive 小文件过多怎么解决?
【4月更文挑战第16天】【Hive】Hive 小文件过多怎么解决?
|
4月前
|
缓存 分布式数据库 API
hbase查询速度很慢
hbase查询速度很慢
195 1
|
9月前
|
SQL 存储 分布式计算
hive 小文件问题及解决方法【重要】
hive 小文件问题及解决方法【重要】
293 0
|
11月前
|
SQL HIVE
Hdfs 导入Hive,时间相关的字段 导入后为NULL
Hdfs 导入Hive,时间相关的字段 导入后为NULL
67 0
|
SQL 存储 分布式计算
【Hive】(二十二)往 Hive 表中插入与导出数据方式load 、insert 、sqoop 等方式详解
【Hive】(二十二)往 Hive 表中插入与导出数据方式load 、insert 、sqoop 等方式详解
911 0
|
SQL 分布式计算 Hadoop
|
SQL 存储 关系型数据库
|
SQL 关系型数据库 MySQL
HIVE HDFS 同步到MYSQL里,在HIVE里存为目录的分区键的如何同步呢?
请教下 ,HIVE HDFS 同步到MYSQL的时候,如果在源端HIVE里是分区表,分区字段要这么同步到目标端MYSQL呢
140 1
HIVE HDFS 同步到MYSQL里,在HIVE里存为目录的分区键的如何同步呢?
|
SQL 存储 HIVE
彻底解决Hive小文件问题
小文件产生的原因和危害以及解决方法。
458 0
彻底解决Hive小文件问题