HBase schlägt fehl und ist nicht verfügbar. Wie kann ich die Daten abrufen?

Inhaltsverzeichnis

Hintergrund

Prinzip

Schritte

Qualitätssicherung

abschließend

Ostereier


Hintergrund

        Im HBase-Cluster in der Produktionsumgebung des Unternehmens kam es zu einem schwerwiegenden Fehler. Dadurch konnten nicht alle HBase-Datenbanktabellen gelesen oder geschrieben werden, sodass vorübergehend ein neuer Cluster aktiviert werden musste. Allerdings auch die historischen Daten des alten Clusters sehr wichtig und musste so weit wie möglich herausgefischt und wiederhergestellt werden. Der Autor wurde angewiesen, im kritischen Moment fortzufahren. Technische Forschung versucht, die Daten wiederherzustellen. Nach der Untersuchung von HBase haben wir erfahren, dass die in HBase geschriebenen Daten letztendlich in Form von HFile-Dateien auf HDFS gespeichert werden. Ist es also möglich, die Datenwiederherstellung direkt auf der Grundlage von HFile-Dateien und nicht über die HBase-API durchzuführen? Die Antwort ist ja. Die von der offiziellen Website von HBase empfohlene Methode zum direkten Laden von HFile-Daten ist das Massenladen. Im Vergleich zur HBase-API verbraucht Bulkload weniger CPU-Zyklen und Netzwerkressourcen und bietet eine höhere Leistung. In diesem Artikel wird der gesamte Prozess der Verwendung von Bulkload zum Wiederherstellen historischer Daten erläutert .

Prinzip

        Lassen Sie uns zunächst den Speichermechanismus von HBase verstehen. Jede HBase-Tabelle besteht aus einer oder mehreren Regionen. Jede Region verfügt über einen oder mehrere Stores. Jeder Store entspricht den Daten einer Spaltenfamilie, bestehend aus einem MemStore und Es besteht aus 0 bis mehrere StoreFiles. Wenn Daten in HBase geschrieben werden, werden sie zuerst in MemStore abgelegt. Wenn MemStore voll ist, werden sie in eine StoreFile geleert und StoreFile wird in HDFS im HFile-Format gespeichert. Im Allgemeinen werden HBase-Daten in gespeichert Festes HDFS-Verzeichnis. Das heißt, konfigurieren Sie den Attributwert von hbase.rootdir in hbase-site.xml. Der Standardwert ist /hbase. Dieses Verzeichnis wird beim Start von hbase automatisch erstellt. Die verschiedenen enthaltenen Dateistrukturen sind wie folgt:

root@xxx:~#hadoop fs -ls /hbase
Found 13 items
drwxr-xr-x   - hbase hadoop          0 2022-01-14 11:41 /hbase/.hbase-snapshot
drwxr-xr-x   - hbase hadoop          0 2021-10-09 17:13 /hbase/.hbck
drwxr-xr-x   - hbase hadoop          0 2021-10-15 17:01 /hbase/.tmp
drwxr-xr-x   - hbase hadoop          0 2022-12-26 19:26 /hbase/MasterProcWALs
drwxr-xr-x   - hbase hadoop          0 2022-12-09 18:46 /hbase/WALs
drwxr-xr-x   - hbase hadoop          0 2021-10-12 16:39 /hbase/archive
drwxr-xr-x   - hbase hadoop          0 2021-10-09 17:13 /hbase/corrupt
drwxr-xr-x   - hbase hadoop          0 2022-12-15 11:43 /hbase/data
-rw-r--r--   3 hbase hadoop         42 2021-10-09 17:13 /hbase/hbase.id
-rw-r--r--   3 hbase hadoop          7 2021-10-09 17:13 /hbase/hbase.version
drwxr-xr-x   - hbase hadoop          0 2021-10-09 17:13 /hbase/mobdir
drwxr-xr-x   - hbase hadoop          0 2022-12-26 20:21 /hbase/oldWALs
drwx--x--x   - hbase hadoop          0 2022-12-16 14:57 /hbase/staging

Hier ist ein reales Beispiel:

 /hbase/data/default/panTag/3ef7bc9993776a2f868dd387e40d1954/cf/91866a42308b4734985c23c33afcd3d3

        ​​​​​Unter diesen ist /hbase/data das übergeordnete Verzeichnis aller HBase-Tabellendaten. default ist der Standard-Namespace, zu dem die Tabelle gehört, panTag ist der Tabellenname, 3ef7bc9993776a2f868dd387e40d1954 ist eine zufällige MD5-Zeichenfolge, die Teil der Regions-ID ist, cf ist der Spaltenfamilienname, 91866a42308b4734985c23c33afcd3d3 ist ebenfalls eine MD5-Zeichenfolge, die die StoreFile-ID darstellt .

Sie können die statistischen Informationen der HFile-Datei mit dem Befehl hfile -s wie folgt anzeigen:

root@xxx:~#hbase hfile -s /hbase/data/default/panTag/3ef7bc9993776a2f868dd387e40d1954/cf/91866a42308b4734985c23c33afcd3d3
Stats:
   Key length:
               min = 39
               max = 64
              mean = 44.05
            stddev = 10.04
            median = 39.00
              75% <= 39.00
              95% <= 64.00
              98% <= 64.00
              99% <= 64.00
            99.9% <= 64.00
             count = 281816
   Row size (bytes):
               min = 83
               max = 4466
              mean = 707.00
            stddev = 807.39
            median = 409.00
              75% <= 757.00
              95% <= 2502.55
              98% <= 4168.14
              99% <= 4320.23
            99.9% <= 4465.25
             count = 281816
   Row size (columns):
               min = 1
               max = 1
              mean = 1.00
            stddev = 0.00
            median = 1.00
              75% <= 1.00
              95% <= 1.00
              98% <= 1.00
              99% <= 1.00
            99.9% <= 1.00
             count = 281816
   Val length:
               min = 36
               max = 4684
              mean = 667.73
            stddev = 820.86
            median = 353.00
              75% <= 753.50
              95% <= 2418.60
              98% <= 4096.28
              99% <= 4298.55
            99.9% <= 4679.51
             count = 281816


Key of biggest row: 8114442716031216

Wenn die HFile-Datei gefunden wird, verwenden Sie die Bulkload-Methode, um die Daten in die Zieltabelle zu laden. Der Prozess zum Abrufen von HFile von HDFS und zum Laden in den Ziel-HBase-Cluster ist wie folgt:

Schritte

  1. Durchsuchen und filtern Sie alle zugehörigen HFile-Dateien der Quelltabelle basierend auf Namespace und Tabellennamen.

            Basierend auf dem festen Präfixpfad /HBase/data und dann basierend auf dem Namespace und dem Tabellennamen kann das HDFS-Speicherverzeichnis der Quelltabelle gespleißt werden. Tatsächlich kann zusätzlich zur HFile-Datei auch der Pfad /HBase/data verwendet werden Dazu gehören auch das Unterverzeichnis .tabledesc für Tabellenmetadaten. und .regioninfo-Dateien, das Unterverzeichnis „recovered.edits“, das zum Wiederherstellen von WAL-Protokollen usw. verwendet wird. Diese haben nichts mit HFile-Daten zu tun und können direkt ignoriert werden. Darüber hinaus lautet der Name der HFile-Datei Ein 32-Bit-Hexadezimal-MD5-Hashwert, der basierend auf dieser Funktion verwendet werden kann. Durchsuchen und filtern Sie die echten HFile-Dateien heraus.

  2. Verwenden Sie die Bulkload-Methode zum Importieren in die Zieltabelle.

            Im Allgemeinen gibt es zwei Möglichkeiten: Eine besteht darin, das CompleteBulkLoad-Tool zum Implementieren des Imports zu verwenden, und die andere darin, die LoadIncrementalHFiles-Klasse zu verwenden, um ein zu importierendes Programm zu schreiben. Erstellen Sie vorab eine Zieltabelle mit der gleichen Struktur wie die Quelltabelle. Verwenden Sie die beiden oben genannten Lösungen wie folgt:

  •   Verwenden Sie den Befehl CompleteBulkLoad wie folgt:
HADOOP_CLASSPATH=`/usr/bin/hbase classpath`:$(find /usr/lib/hbase/lib -name '*.jar' | xargs echo | tr ' ' ':') hadoop jar /usr/lib/hbase/lib/hbase-mapreduce-2.1.0-cdh6.3.2.jar completebulkload  <生成的HFile文件路径> <目标表名称> 
  • Verwenden Sie die von HBase offiziell bereitgestellte LoadIncrementalHFiles-Klasse, um automatisierte Tools zu schreiben. Der Kerncode lautet wie folgt:

String table = "<target_table>";
Configuration conf = HBaseConfiguration.create();
Connection hConnection = ConnectionFactory.createConnection(conf);
Admin admin = hConnection.getAdmin();
Table hTable = hConnection.getTable(TableName.valueOf(table));
RegionLocator regionLocator = hConnection.getRegionLocator(TableName.valueOf(table));
LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
loader.doBulkLoad(new Path(loadPath), admin, hTable, regionLocator);

Qualitätssicherung

  • Nach der Ausführung des Bulkload-Befehls oder -Programms können keine Daten in der Zieltabelle gefunden werden und es wird keine spezifische Fehlermeldung gemeldet.

       Überprüfen Sie, ob der Benutzer, der den HBase-Befehl oder das HBase-Programm ausführt, über Schreibberechtigungen für die Zieltabelle verfügt. Wenn die Berechtigungen nicht ausreichen, führen Sie den Autorisierungsbefehl aus: grant '<user>' , 'RW' , '<table>'.

  • Snappy-Komprimierungsfehler, z. B. Verursacht durch: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z

       Die Quelltabelle sollte das Snappy-Komprimierungsformat verwenden, da die Snappy-Dekomprimierung die Verwendung lokaler Snappy-Bibliotheksdateien wie libsnappy.so erfordert. Im Allgemeinen wird diese Bibliotheksdatei bei der Installation von Hadoop automatisch lokal installiert, daher müssen Sie Abhängigkeiten zu dieser Bibliotheksdatei hinzufügen während der Ausführung. Es sollte jedoch beachtet werden, dass das Hinzufügen lokaler Bibliotheksabhängigkeiten über -cp ungültig ist. Sie müssen -Djava.library.path=<snappy Local Library Path> angeben oder export LD_LIBRARY_PATH=<snappy Local Library Path hinzufügen Umgebungsvariable. > wird wirksam.

abschließend

        Nach der Überprüfung können historische HBase-Daten über HFile-Dateien wiederhergestellt werden, wodurch dem Unternehmen Verluste erspart bleiben. Das verwendete Bulkload ist eine relativ einfache und effiziente Methode zum Schreiben von HBase-Daten in großen Stapeln. Eines ist jedoch zu beachten: Weil es sich um Daten handelt direkt generiert, indem parallele HFile-Dateien generiert und auf den RegionServer hochgeladen werden, sodass WAL-Protokolle nicht wie die HBase-API aufgezeichnet werden.

Ostereier

Im Anhang finden Sie das Betriebs- und Wartungstool, das ich geschrieben habe, um HFile-Daten als Referenz wiederherzustellen. Github-Adresse:

HBase HFile-Tool zur Datenwiederherstellunghttps://github.com/bigcatpan/hbase-tool

Supongo que te gusta

Origin blog.csdn.net/BlogPan/article/details/128461632
Recomendado
Clasificación