如果你已经试过了别的博客提供的修改内存的方法,但是美效果的话,不妨看看我的解决办法。

为什么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行。​