我试图创建大约589个表并进行随机插入。我开始逐桌处理:所以我创建一个表然后进行所有插入,然后创建另一个表,直到所有数据都被摄取。
此解决方案的架构是:
所以这里的问题是当我尝试摄取所有这些数据时。客户端只能在regionserver关闭之前创建和插入大约300MB(创建大约45个表并插入相应的行,然后服务器在第46个表的数据摄取时崩溃)。我已经用不同的机器特性测试了所有这些,摄取数据的大小因机器而异(如果机器有更多内存,将插入更多数据[已使用不同的VM硬件特性对其进行了测试])。我怀疑它来自Java堆内存的管理,所以我试图做出不同的配置。但它并没有让它变得更好。这是我对HBase的主要配置:
hbase-site.xml
<property>
<name>hbase.rest.port</name>
<value>8070</value>
<description>The port for the HBase REST server.</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://quickstart.cloudera:8020/hbase</value>
</property>
<property>
<name>hbase.regionserver.ipc.address</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hbase.master.ipc.address</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hbase.thrift.info.bindAddress</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value> <!-- 10 GB -->
</property>
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>33554432</value> <!-- 32 MB -->
</property>
<property>
<name>hbase.client.write.buffer</name>
<value>8388608</value>
</property>
<property>
<name>hbase.client.scanner.caching</name>
<value>10000</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>64</value>
</property>
hbase-env.sh
# The maximum amount of heap to use. Default is left to JVM default.
export HBASE_HEAPSIZE=4G
# Uncomment below if you intend to use off heap cache. For example, to allocate 8G of
# offheap, set the value to "8G".
# export HBASE_OFFHEAPSIZE=1G
# Extra Java runtime options.
# Below are what we set by default. May only work with SUN JVM.
# For more on why as well as other possible settings,
# see http://wiki.apache.org/hadoop/PerformanceTuning
export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=4g -XX:MaxPermSize=4g"
以下是我从主服务器的日志中获得的错误:
util.JvmPauseMonitor:检测到JVM或主机(例如GC)中的暂停: 暂停大约1016ms没有检测到GC
并且RegionServer的日志中没有任何内容。
另一方面,当我尝试只创建一个表并插入更多数据时,这是有效的!
对于如何解决这个问题,有什么好主意吗?
提前致谢。
答案 0 :(得分:0)
你的虚拟机内存太低了。尝试将其提升至至少12GB。您忘记了Java进程的堆只是一个内存占用的一部分。通过设置HBASE_HEAPSIZE = 4G,您说要让HBase分配所有VM的内存。除了HBase之外,VM还需要运行Linux守护进程和Cloudera服务。