Sqoop导入数据内存溢出
利用sqoop
可以将RDBMS
的数据导入到HDFS
上,但是在使用sqoop
的时候,以mysql
数据导入到hive
数据为例,如果不注意设置MapReduce
的资源,是会出现一个叫做GC limit xxxxx
的错误的。
如下面的脚本
sqoop import \
--connect jdbc:mysql://localhost:3306/your_database \
--username root \
--password 123456 \
--target-dir /user/hive/warehouse/xxxx/xxx \
--hive-import \
--hive-database hive_database \
--hive-table hive_tableName\
--as-parquetfile \
--null-string '\\N' \
--null-non-string '\0' \
--fields-terminated-by '\001' \
--table mysql_tableName \
--fetch-size 1000
运行这个命令的时候,程序在yarn中申请到了5GB
(这个因环境而异)的内存,然后,任务失败了,报出一个GC limit
的错误
当出现这样的错误的时候,很显然就是sqoop
在进行数据传输的过程当中,因为内存不足,引发了错误。
那么,如何让sqoop
在创建一个mapreduce
的任务时候,使用比较大的硬件资源呢。通过官网的文档得知,sqoop
中有一个参数可以调整hadoop
的参数,利用sqoop
的-D <key=value>
的参数可以让sqoop
的job
启动的时候申请更多的资源,上述的脚本修改如下;
sqoop import \
-D yarn.scheduler.minimum-allocation-mb=8096 \
-D yarn.scheduler.maximum-allocation-mb=16192 \
-D mapreduce.map.memory.mb=8096 \
-D mapreduce.reduce.memory.mb=8096 \
--connect jdbc:mysql://localhost:3306/your_database \
--username root \
--password 123456 \
--target-dir /user/hive/warehouse/xxxx/xxx \
--hive-import \
--hive-database hive_database \
--hive-table hive_tableName\
--as-parquetfile \
--null-string '\\N' \
--null-non-string '\0' \
--fields-terminated-by '\001' \
--table mysql_tableName \
--fetch-size 1000
使用上述的脚本之后,程序占用了33G
的内存,因为sqoop
默认开启4个map
任务,每一个任务占用8
个G
的内存。所以,这个就没有啥问题。
简单的介绍一下
- yarn.scheduler.minimum-allocation-mb
每个container想RM申请内存的最小大小。兆字节。内存请求小于此值,实际申请到的是此值大小。默认值偏大 - yarn.scheduler.maximum-allocation-mb
每个container向RM申请内存的最大大小,兆字节。申请值大于此值,将最多得到此值内存。 - mapreduce.map.memory.mb
一个 Map Task 可使用的内存上限(单位:MB),默认为 1024。如果 Map Task 实际使用的资源量超过该值,则会被强制杀死。 - mapreduce.reduce.memory.mb
一个 Reduce Task 可使用的资源上限(单位:MB),默认为 1024。如果 Reduce Task 实际使用的资源量超过该值,则会被强制杀死。
相关的其它参数请在下方的文档中寻找
sqoop 1.4.7用户手册
hadoop 调优参数汇总
mapreduce任务调优
总结
如果有什么更好的建议,请在评论区里留言,谢谢!