HBase的RegionServer崩溃

时间:2017-08-17 13:42:47

标签: hadoop jvm hbase hdfs heap-memory

我试图创建大约589个表并进行随机插入。我开始逐桌处理:所以我创建一个表然后进行所有插入,然后创建另一个表,直到所有数据都被摄取。

此解决方案的架构是:

  • 位于一台机器中的Python客户端,它使用数据提取HBase。
  • Cloudera服务器托管HBase独立配置,这是一个与客户端位于同一台机器中并由其IP地址识别的VM。该服务器的特性如下:64GB存储空间,4GB RAM和1个CPU。
  • 客户端与HBase Thrift服务器通信。

所以这里的问题是当我尝试摄取所有这些数据时。客户端只能在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的日志中没有任何内容。

另一方面,当我尝试只创建一个表并插入更多数据时,这是有效的!

对于如何解决这个问题,有什么好主意吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

你的虚拟机内存太低了。尝试将其提升至至少12GB。您忘记了Java进程的堆只是一个内存占用的一部分。通过设置HBASE_HEAPSIZE = 4G,您说要让HBase分配所有VM的内存。除了HBase之外,VM还需要运行Linux守护进程和Cloudera服务。