Sqoop导数据GC Limit或者Java Heap Space

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>的参数可以让sqoopjob启动的时候申请更多的资源,上述的脚本修改如下;

  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任务,每一个任务占用8G的内存。所以,这个就没有啥问题。
简单的介绍一下

  • 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任务调优

总结

如果有什么更好的建议,请在评论区里留言,谢谢!

发布了56 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/OldDirverHelpMe/article/details/104759889