如果你已经试过了别的博客提供的修改内存的方法,但是美效果的话,不妨看看我的解决办法。
为什么Sqoop Import抛出这个异常?
22/04/08 16:22:35 INFO mapreduce.Job: Task Id : attempt_1649398255409_0017_m_000000_0, Status : FAILED Exception from container-launch. Container id: container_1649398255409_0017_01_000002 Exit code: 255 Stack trace: ExitCodeException exitCode=255: at org.apache.hadoop.util.Shell.runCommand(Shell.java:585) at org.apache.hadoop.util.Shell.run(Shell.java:482) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:776) at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Container exited with a non-zero exit code 255
也有可能是这样
Container exited with a non-zero exit code 255 22/04/08 16:23:16 INFO mapreduce.Job: Task Id : attempt_1649398255409_0017_m_000000_2, Status : FAILED Error: GC overhead limit exceeded Container killed by the ApplicationMaster. Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143
总结
1.为什么只有map的原始任务生成的小文件太多?
原表的生成脚本是从一个小分区很多的大表中筛选一部分数据出来,所以原表的数据就很分散,如果原表不执行小文件合并则会导致map出很多小文件,所以在生成原表时就要注意控制文件数量。
2.怎么判断 GC overhead limit exceeded 的缘由?
内存溢出有很多情况,如果像上面遇到的情况一样,无法开始正常的MR任务,无法显示启动了多少个map reduce,则可能是因为启动资源过大造成的内存溢出,这时候就要看表原始的数据,数据量是不是有问题;如果是map和reduce执行了一段时间显示内存溢出的问题,很有可能是脚本设计不合理或者原始数据倾斜,则需要通过set参数来进行调整,最常见的就是group by,或者map,reduce处理的数据量不均匀导致
是-在这个过程中,
RDBMS数据库(不是SQOOP)一次性获取所有的行
并试图将所有的行加载到内存中
这会导致内存溢出并抛出错误
为了克服这个问题,需要告诉RDBMS数据库批量返回数据
以下参数“?”
dontTrackOpenResources=true
& defaultfetchsize =10000
& usecursorfetch =true "
跟随jdbc连接字符串告诉数据库每批获取10000行。
这里逻辑是
sqoop import \ --connect jdbc:mysql://192.168.23.45:3306/shtd_store?useSSL=false\&dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true \ --driver com.mysql.jdbc.Driver \ --username root \ --password 123456 \ --table PARTSUPP \ --hive-import \ --hive-table ods.PARTSUPP \ --hive-overwrite \ --hive-partition-key etldate \ --hive-partition-value '20220407' \ --fields-terminated-by '|' \ --m 1
注意!
这里jdbc连接的分割符号要用\&
重点!!!
dontTrackOpenResources=true & defaultfetchsize =10000 & usecursorfetch =true " 跟随jdbc连接字符串告诉数据库每批获取10000行。
也可以自己根据实际数据量调整参数,欢迎讨论这个性能问题
\&dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true