往 hive 里批量插数据如果大于了 10M 左右就会出错

2017-07-18 17:23:36 +08:00
 gouchaoer

现在需要把 mysql 里面的数据进行一些脱敏处理,然后往 hive 里面插,我用的 hiveserver2 作为服务器端,然后用客户端通过 thrift 去连接 hiveserver2 来插数据的。

由于一次 mapreduce 耗时很长,所以我尽可能一次插很多的数据进去,也就是用的 INSERT INTO table VALUES...这个语法。现在问题来了就是如果插得数据大于 10M 的话就会出错,客户端提示的错误就是:

Hive ERROR_STATE Error Message: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

去找出 yarn 的 log 就是这样:

2017-07-18 11:35:54,832 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Exit code from container container_1499276494511_0407_01_000005 is : 255 2017-07-18 11:35:54,832 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Exception from container-launch with container ID: container_1499276494511_0407_01_000005 and exit code: 255 ExitCodeException exitCode=255: at org.apache.hadoop.util.Shell.runCommand(Shell.java:538) at org.apache.hadoop.util.Shell.run(Shell.java:455) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715) 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:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

可以看到 2 个提示都不是有价值的信息,目前已经排除了 jvm 的 stack 或者 heap 不足了,因为之前遇到过 heap 不足抛出 OutOfMemory 异常,增加-Xmx 后问题就解决了。

我搜遍了互联网都找不到答案,求 hvie 大神帮忙看看

4387 次点击
所在节点    Java
6 条回复
cye3s
2017-07-18 18:15:24 +08:00
直接 load data 到一张表,再插入另一张表报错么?
tttwww18
2017-07-18 18:21:11 +08:00
信息量有点少。看 hive log 里面能找到啥线索不?
rale
2017-07-18 18:49:34 +08:00
Comdex
2017-07-18 20:26:27 +08:00
把 map 和 reduce 的内存设大点试试
tomatoz
2017-07-19 00:14:57 +08:00
你这是 nodemanager 的日志,应该去 application 日志里去找
yarn logs -applicationId XXX
另外'10M'这个数也有点微妙,因为 hadoop 默认的 job.split.metainfo 最大值恰好是 10M(全称是 mapreduce.job.split.metainfo.maxsize)
但是 metainfo 的长度应该和插入数据量没关系呀。可能我想多了。。
gouchaoer
2017-07-19 10:58:09 +08:00
@tomatoz 现在改变方案了,似乎通用的做法是把数据按格式导入一个 txt 文件,然后在使用 hive 的 load data 命令来导入比较好。。。insert into 每一次都是一次 mapred,消耗太大了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/376214

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX