Phoenix CSV批量加载大数据集失败问题求助
首先咱们拆解下你遇到的核心问题:
18/02/23 06:09:10 INFO mapreduce.Job: Task Id : attempt_1519326441231_0004_m_000067_0, Status : FAILEDError: Java heap spaceContainer killed by the ApplicationMaster.Container killed on request. Exit code is 143Container exited with a non-zero exit code 143
这个错误本质是MapReduce任务的JVM堆内存不足,导致容器被YARN强制终止(exit code 143通常对应内存超限被kill)。你调整了yarn.nodemanager.resource.memory-*但没解决,是因为这个配置控制的是节点层面的总可用内存,而单个Map/Reduce任务的内存配额和堆内存需要单独精准配置。下面给你具体的解决方案:
1. 调整MapReduce任务的内存与堆参数
你需要给Map任务分配足够的容器内存,同时设置合理的JVM堆大小(一般为容器内存的70%-75%,留一部分给非堆内存使用):
- 修改
mapreduce.map.memory.mb:设置单个Map任务的容器内存,比如8192(8GB) - 修改
mapreduce.map.java.opts:设置Map任务的JVM堆内存,比如-Xmx6144m(6GB) - 如果加载过程涉及Reduce阶段,同步调整
mapreduce.reduce.memory.mb和mapreduce.reduce.java.opts,比如分别设为16384和-Xmx12288m
你可以在提交Phoenix批量加载命令时,通过-D参数临时指定这些配置,示例:
psql.py -Dmapreduce.map.memory.mb=8192 -Dmapreduce.map.java.opts="-Xmx6144m" <你的集群地址> <目标表名> <CSV输入路径>
2. 优化Phoenix批量加载的专属内存配置
Phoenix本身有几个控制加载内存的关键参数,建议针对性调整:
phoenix.memory.loadmapfactor:默认值0.7,降低到0.5可以减少加载时的内存占用,避免OOMphoenix.coprocessor.maxserverthreads:减少HBase RegionServer上的Phoenix协处理器线程数,避免线程过多消耗内存,比如设为32
同样可以在提交命令时添加这些参数:
psql.py -Dphoenix.memory.loadmapfactor=0.5 -Dphoenix.coprocessor.maxserverthreads=32 <你的集群地址> <目标表名> <CSV输入路径>
3. 拆分超大数据集
280GB单批次数据量太大,建议拆分成多个小文件(比如每个文件1GB-2GB),或者分成多个批次加载。这样每个Map任务处理的数据量减少,内存压力会大幅降低。
4. 检查目标HBase表的预分区
如果你的目标Phoenix表没有预分区,批量加载时所有数据会写入同一个Region,既会造成热点问题,也会让RegionServer内存压力剧增。建议提前给表设置预分区,比如根据主键范围或者哈希值拆分Region。
5. 确认YARN的全局内存上限
检查yarn.scheduler.maximum-allocation-mb配置,确保你给Map任务设置的mapreduce.map.memory.mb不超过这个值。如果YARN的最大分配内存小于任务请求的内存,任务会被限制在更小的容器里,依然会出现内存不足的问题。
按照上面的步骤调整后,再尝试批量加载,应该能解决内存不足的问题。
内容的提问来源于stack exchange,提问作者IronMan

