2017-08-17 3 views
1

J'essaye de créer environ 589 tables et de faire des insertions aléatoires. Je commence le traitement table par table: donc je crée une table puis j'effectue toutes mes insertions, puis j'en crée une autre jusqu'à ce que toutes les données soient ingérées.Les crashs de RegionServer de HBase

L'architecture de cette solution est:

  • client Python situé dans une machine qui ingère HBase avec des données.
  • Serveur Cloudera hébergeant HBase configuré en autonome qui est une machine virtuelle située dans la même machine que le client et identifiée par son adresse IP. Les caractéristiques de ce serveur sont les suivantes: 64 Go de stockage, 4 Go de RAM et 1 CPU.
  • Le client communique avec un serveur HBase Thrift.

Donc, le problème ici est que lorsque j'essaye d'ingérer toute cette quantité de données. Le client est seulement capable de créer et d'insérer environ 300 Mo avant l'arrêt du regionserver (environ 45 tables créées et les lignes correspondantes insérées, puis le serveur plante à l'intégration des données de la 46ème table). J'ai testé tout cela avec des caractéristiques différentes de la machine, la taille des données ingérées varie d'une machine à l'autre (si la machine a plus de mémoire, plus de données seront insérées [Testé avec différentes caractéristiques matérielles VM]). Je soupçonne que cela vient de la gestion de la mémoire Java Heap, j'ai donc essayé de faire différentes configurations. Mais ça n'a pas fait mieux. Voici ma configuration principale de 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" 

Voici l'erreur que je reçois du Maître Journal du serveur:

util.JvmPauseMonitor: pause Détecté dans JVM ou à la machine hôte (par exemple GC): pause d'environ 1016msNo GCS détectée

et rien n'apparaît dans le journal du RegionServer. En revanche, lorsque j'essaie de créer une seule table et d'insérer une plus grande quantité de données, cela fonctionne!

Une idée brillante sur la façon de résoudre ce problème, s'il vous plaît?

Merci d'avance.

Répondre

0

La mémoire de votre machine virtuelle est beaucoup trop faible. Essayez de le cogner jusqu'à au moins 12 Go. Vous oubliez que le tas d'un processus Java n'est que une partie de l'empreinte mémoire. En définissant HBASE_HEAPSIZE = 4G, vous voulez que HBase alloue toute la mémoire de votre VM. La machine virtuelle doit également exécuter des démons Linux et vos services Cloudera en plus de HBase.