Von HBase auf Google Cloud woanders hin migrieren

Auf dieser Seite werden Überlegungen und Verfahren zur Migration zu Bigtable von einem Apache HBase-Cluster beschrieben, der in einem Google Cloud-Dienst wie Dataproc oder Compute Engine gehostet wird.

Eine Anleitung zur Migration von einer externen Apache HBase-Umgebung zu Bigtable finden Sie unter Daten von HBase zu Bigtable migrieren. Weitere Informationen zur Onlinemigration finden Sie unter Von HBase aus in Bigtable replizieren.

Gründe für die Migration von HBase in Google Cloud zu Bigtable

Folgende Gründe sprechen für diesen Migrationspfad:

  • Sie können Ihre Clientanwendung an der Stelle lassen, an der sie derzeit bereitgestellt ist, und nur die Verbindungskonfiguration ändern.
  • Ihre Daten bleiben im Google Cloud-System.
  • Sie können weiterhin die HBase API verwenden, wenn Sie möchten. Der Cloud Bigtable HBase-Client für Java ist eine vollständig unterstützte Erweiterung der Apache HBase-Bibliothek für Java.
  • Sie möchten die Vorteile eines verwalteten Dienstes zum Speichern Ihrer Daten nutzen.

Hinweise

In diesem Abschnitt werden einige Punkte erläutert, die Sie vor der Migration bedenken sollten.

Bigtable-Schemadesign

In den meisten Fällen können Sie in Bigtable dasselbe Schemadesign wie in HBase verwenden. Wenn Sie Ihr Schema ändern möchten oder wenn sich Ihr Anwendungsfall ändert, lesen Sie die Konzepte unter Schema entwerfen, bevor Sie Ihre Daten migrieren.

Vorbereitung und Tests

Machen Sie sich vor der Migration Ihrer Daten mit den Unterschieden zwischen HBase und Bigtable vertraut. Sie sollten sich mit der Konfiguration der Verbindung vertraut machen, um Ihre Anwendung mit Bigtable zu verbinden. Außerdem sollten Sie vor der Migration System- und Funktionstests durchführen, um die Anwendung oder den Dienst zu validieren.

Migrationsschritte

Erstellen Sie einen HBase-Snapshot und importieren Sie die Daten direkt aus dem HBase-Cluster in Bigtable, um Ihre Daten von HBase zu Bigtable zu migrieren. Diese Schritte beziehen sich auf einen einzelnen HBase-Cluster und werden in den nächsten Abschnitten ausführlich beschrieben.

  1. Senden von Schreibvorgängen an HBase beenden.
  2. Erstellen Sie Zieltabellen in Bigtable.
  3. HBase-Snapshots erstellen und in Bigtable importieren
  4. Importierte Daten validieren
  5. Aktualisieren Sie die Anwendung, damit Lese- und Schreibvorgänge an Bigtable gesendet werden.

Image

Hinweise

  1. Installieren Sie die Google Cloud CLI oder verwenden Sie Cloud Shell.

  2. Erstellen Sie einen Cloud Storage-Bucket zum Speichern der Validierungsausgabedaten. Erstellen Sie den Bucket am selben Speicherort, an dem Sie Ihren Dataproc-Job ausführen möchten.

  3. Ermitteln Sie den Hadoop-Cluster, von dem Sie migrieren. Sie müssen die Jobs für Ihre Migration auf einem Dataproc 1.x-Cluster ausführen, der über Netzwerkkonnektivität mit dem NameNode und DataNodes des HBase-Clusters verfügt. Notieren Sie sich die ZooKeeper-Quorumadresse und den Namenode-URI des HBase-Clusters, die für die Migrationsskripts erforderlich sind.

  4. Erstellen Sie einen Dataproc-Cluster Version 1.x im selben Netzwerk wie den HBase-Quellcluster. Mit diesem Cluster führen Sie die Import- und Validierungsjobs aus.

  5. Erstellen Sie eine Bigtable-Instanz zum Speichern Ihrer neuen Tabellen. Mindestens ein Cluster in der Bigtable-Instanz muss sich außerdem in derselben Region wie der Dataproc-Cluster befinden. Beispiel: us-central1

  6. Rufen Sie das Tool Translation Schema ab:

    wget BIGTABLE_HBASE_TOOLS_URL
    

    Ersetzen Sie BIGTABLE_HBASE_TOOLS_URL durch die URL des neuesten JAR with dependencies, der im Maven-Repository des Tools verfügbar ist. Der Dateiname ähnelt https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-tools/2.6.0/bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar.

    So finden Sie die URL oder laden die JAR-Datei manuell herunter:

    1. Rufen Sie das Repository auf
    2. Klicken Sie auf Durchsuchen, um die Repository-Dateien aufzurufen.
    3. Klicken Sie auf die neueste Versionsnummer.
    4. Identifizieren Sie den JAR with dependencies file (normalerweise oben).
    5. Klicken Sie mit der rechten Maustaste und kopieren Sie die URL oder klicken Sie, um die Datei herunterzuladen.
  7. Holen Sie sich das MapReduce-Tool, das Sie für Import- und Validierungsjobs verwenden:

    wget BIGTABLE_MAPREDUCE_URL
    

    Ersetzen Sie BIGTABLE_MAPREDUCE_URL durch die URL des neuesten shaded-byo JAR, der im Maven-Repository des Tools verfügbar ist. Der Dateiname ähnelt https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-mapreduce/2.6.0/bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar.

    So finden Sie die URL oder laden die JAR-Datei manuell herunter:

    1. Rufen Sie das Repository auf
    2. Klicken Sie auf die neueste Versionsnummer.
    3. Klicken Sie auf Downloads.
    4. Bewegen Sie den Mauszeiger über shaded-byo-hadoop.jar.
    5. Klicken Sie mit der rechten Maustaste und kopieren Sie die URL oder klicken Sie, um die Datei herunterzuladen.
  8. Legen Sie die folgenden Umgebungsvariablen fest:

    #Google Cloud
    
    export PROJECT_ID=PROJECT_ID
    export REGION=REGION
    
    ##Cloud Bigtable
    
    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    
    ##Dataproc
    
    export DATAPROC_CLUSTER_ID=DATAPROC_CLUSTER_NAME
    
    #Cloud Storage
    
    export BUCKET_NAME="gs://BUCKET_NAME"
    export STORAGE_DIRECTORY="$BUCKET_NAME/hbase-migration"
    
    #HBase
    
    export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM
    export ZOOKEEPER_PORT=2181
    export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT"
    export MIGRATION_SOURCE_NAMENODE_URI=MIGRATION_SOURCE_NAMENODE_URI
    export MIGRATION_SOURCE_TMP_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/tmp
    export MIGRATION_SOURCE_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/hbase
    
    #JAR files
    
    export TRANSLATE_JAR=TRANSLATE_JAR
    export MAPREDUCE_JAR=MAPREDUCE_JAR
    
    

    Ersetzen Sie die Platzhalter durch die Werte für Ihre Migration.

    Google Cloud:

    • PROJECT_ID: das Google Cloud-Projekt, in dem sich Ihre Bigtable-Instanz befindet.
    • REGION: die Region, die den Dataproc-Cluster enthält, der die Import- und Validierungsjobs ausführt.

    Bigtable:

    • BIGTABLE_INSTANCE_ID: die ID der Bigtable-Instanz, in die Sie Ihre Daten importieren.

    Dataproc:

    • DATAPROC_CLUSTER_ID: die ID des Dataproc-Clusters, in dem die Import- und Validierungsjobs ausgeführt werden

    Cloud Storage:

    • BUCKET_NAME: der Name des Cloud Storage-Buckets, in dem Sie die Snapshots speichern.

    HBase:

    • ZOOKEEPER_QUORUM: der Zookeeper-Host, zu dem das Tool eine Verbindung herstellt, im Format host1.myownpersonaldomain.com.
    • MIGRATION_SOURCE_NAMENODE_URI: der URI für den NameNode des HBase-Clusters im Format hdfs://host1.myownpersonaldomain.com:8020

    JAR-Dateien

    • TRANSLATE_JAR: der Name und die Versionsnummer der JAR-Datei bigtable hbase tools, die Sie von Maven heruntergeladen haben. Der Wert sollte in etwa so aussehen: bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar.
    • MAPREDUCE_JAR: der Name und die Versionsnummer der JAR-Datei bigtable hbase mapreduce, die Sie von Maven heruntergeladen haben. Der Wert sollte in etwa so aussehen: bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar.
  9. (Optional) Führen Sie den Befehl printenv aus, um zu prüfen, ob die Variablen richtig festgelegt wurden. Damit können Sie alle Umgebungsvariablen aufrufen.

Senden von Schreibvorgängen an HBase beenden

Bevor Sie Snapshots Ihrer HBase-Tabellen erstellen, beenden Sie das Senden von Schreibvorgängen an Ihren HBase-Cluster.

Zieltabellen in Bigtable erstellen

Der nächste Schritt besteht darin, für jede HBase-Tabelle, die Sie migrieren, eine Zieltabelle in der Bigtable-Instanz zu erstellen. Verwenden Sie ein Konto mit der Berechtigung bigtable.tables.create für die Instanz.

In dieser Anleitung wird das Bigtable-Tool zur Schemaübersetzung verwendet, das die Tabelle automatisch für Sie erstellt. Wenn Sie jedoch nicht möchten, dass Ihr Bigtable-Schema genau mit dem HBase-Schema übereinstimmt, können Sie mithilfe der cbt-Befehlszeile oder der Google Cloud Console eine Tabelle erstellen.

Das Bigtable-Schemaübersetzungstool erfasst das Schema der HBase-Tabelle, einschließlich des Tabellennamens, der Spaltenfamilien, der Richtlinien für die automatische Speicherbereinigung und der Aufteilungen. Anschließend wird eine ähnliche Tabelle in Bigtable erstellt.

Führen Sie für jede zu importierende Tabelle den folgenden Befehl aus, um das Schema von HBase in Bigtable zu kopieren.

java \
 -Dgoogle.bigtable.project.id=$PROJECT_ID \
 -Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \
 -Dgoogle.bigtable.table.filter=TABLE_NAME \
 -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM \
 -Dhbase.zookeeper.property.clientPort=$ZOOKEEPER_PORT \
 -jar $TRANSLATE_JAR

Ersetzen Sie TABLE_NAME durch den Namen der HBase-Tabelle, die Sie importieren. Das Schema Translation-Tool verwendet diesen Namen für die neue Bigtable-Tabelle.

Optional können Sie TABLE_NAME auch durch einen regulären Ausdruck wie „.*“ ersetzen, der alle zu erstellenden Tabellen erfasst, und dann den Befehl nur einmal ausführen.

HBase-Tabellen-Snapshots erstellen und in Bigtable importieren

Führen Sie folgende Schritte für jede Tabelle aus, die Sie zu Bigtable migrieren möchten.

  1. Führen Sie dazu diesen Befehl aus:

    echo "snapshot 'HBASE_TABLE_NAME', 'HBASE_SNAPSHOT_NAME'" | hbase shell -n
    

    Ersetzen Sie Folgendes:

    • HBASE_TABLE_NAME: der Name der HBase-Tabelle, die Sie zu Bigtable migrieren.
    • HBASE_SNAPSHOT_NAME ist der Name des neuen Snapshots.
  2. Importieren Sie den Snapshot durch Ausführen des folgenden Befehls:

    gcloud dataproc jobs submit hadoop \
        --cluster $DATAPROC_CLUSTER_ID \
        --region $REGION \
        --project $PROJECT_ID \
        --jar $MAPREDUCE_JAR \
        -- \
        import-snapshot \
        -Dgoogle.bigtable.project.id=$PROJECT_ID \
        -Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \
        HBASE_SNAPSHOT_NAME \
        $MIGRATION_SOURCE_DIRECTORY \
        BIGTABLE_TABLE_NAME \
        $MIGRATION_SOURCE_TMP_DIRECTORY
    

    Ersetzen Sie Folgendes:

    • HBASE_SNAPSHOT_NAME ist der Name, den Sie dem Snapshot der zu importierenden Tabelle zugewiesen haben
    • BIGTABLE_TABLE_NAME ist der Name der Bigtable-Tabelle, in die Sie Daten importieren.

    Nachdem Sie den Befehl ausgeführt haben, stellt das Tool den HBase-Snapshot im Quellcluster wieder her und importiert ihn dann. Es kann einige Minuten dauern, bis der Snapshot wiederhergestellt ist, je nach Größe des Snapshots.

Die folgenden zusätzlichen Optionen sind beim Importieren der Daten verfügbar:

  • Legen Sie clientbasierte Zeitüberschreitungen für gepufferte Mutator-Anfragen fest (Standard: 600000 ms). Sehen Sie sich folgendes Beispiel an:

    -Dgoogle.bigtable.rpc.use.timeouts=true
    -Dgoogle.bigtable.mutate.rpc.timeout.ms=600000
    
  • Ziehen Sie eine latenzbasierte Drosselung in Betracht, die die Auswirkungen reduzieren kann, die der Import-Batchjob auf andere Arbeitslasten haben kann. Die Drosselung sollte für Ihren Migrationsanwendungsfall getestet werden. Sehen Sie sich folgendes Beispiel an:

    -Dgoogle.bigtable.buffered.mutator.throttling.enable=true
    -Dgoogle.bigtable.buffered.mutator.throttling.threshold.ms=100
    
  • Ändern Sie die Anzahl der Zuordnungsaufgaben, die eine einzelne HBase-Region lesen. Standard sind 2 Zuordnungsaufgaben pro Region. Sehen Sie sich folgendes Beispiel an:

    -Dgoogle.bigtable.import.snapshot.splits.per.region=3
    
  • Legen Sie zusätzliche MapReduce-Konfigurationen als Eigenschaften fest. Sehen Sie sich folgendes Beispiel an:

    -Dmapreduce.map.maxattempts=4
    -Dmapreduce.map.speculative=false
    -Dhbase.snapshot.thread.pool.max=20
    

Beachten Sie beim Importieren die folgenden Tipps:

  • Achten Sie darauf, dass genügend Dataproc-Cluster-Worker vorhanden sind, um Map-Importaufgaben parallel auszuführen, damit die Leistung beim Datenupload verbessert wird. Standardmäßig führt ein Dataproc-Worker vom Typ n1-standard-8 acht Importaufgaben aus. Mit genügend Workern wird sichergestellt, dass der Importjob über genügend Compute-Leistung verfügt, um den Vorgang in einer akzeptablen Zeit abzuschließen, aber nicht so viel Leistung, dass die Bigtable-Instanz überlastet wird.
    • Wenn Sie die Bigtable-Instanz nicht auch für eine andere Arbeitslast verwenden, multiplizieren Sie die Anzahl der Knoten in Ihrer Bigtable-Instanz mit 3 und teilen Sie sie dann durch 8 (mit dem Worker n1-standard-8 Dataproc). Verwenden Sie das Ergebnis als Anzahl der Dataproc-Worker.
    • Wenn Sie die Instanz gleichzeitig mit dem Import Ihrer HBase-Daten für eine andere Arbeitslast verwenden, reduzieren Sie den Wert von Dataproc-Workern oder erhöhen Sie die Anzahl der Bigtable-Knoten, um die Anforderungen der Arbeitslasten zu erfüllen.
  • Achten Sie während des Imports auf die CPU-Auslastung der Bigtable-Instanz. Wenn die CPU-Auslastung in der Bigtable-Instanz zu hoch ist, müssen Sie ggf. weitere Knoten hinzufügen. Durch das Hinzufügen von Knoten wird die CPU-Auslastung sofort verbessert. Es kann jedoch bis zu 20 Minuten nach dem Hinzufügen der Knoten dauern, bis die optimale Leistung erzielt wird.

Weitere Informationen zum Überwachen der Bigtable-Instanz finden Sie unter Bigtable-Instanzen überwachen.

Importierte Daten in Bigtable validieren

Als Nächstes validieren Sie die Datenmigration. Führen Sie dazu einen Hash-Vergleich zwischen der Quell- und der Zieltabelle durch, um bezüglich der Integrität der migrierten Daten größeres Vertrauen zu gewinnen. Führen Sie zuerst den Job hash-table aus, um Hashes von Zeilenbereichen in der Quelltabelle zu generieren. Schließen Sie dann die Validierung ab. Führen Sie dazu den Job sync-table aus, um Hashes aus Bigtable zu berechnen und mit der Quelle abzugleichen.

  1. Führen Sie den folgenden Befehl für jede zu migrierende Tabelle aus, um Hashes für die Validierung zu erstellen:

    gcloud dataproc jobs submit hadoop \
      --project $PROJECT_ID \
      --cluster $DATAPROC_CLUSTER_ID \
      --region $REGION \
      --jar $MAPREDUCE_JAR \
      -- \
      hash-table \
      -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT \
      HBASE_TABLE_NAME \
      $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/
    

    Ersetzen Sie HBASE_TABLE_NAME durch den Namen der HBase-Tabelle, für die Sie den Snapshot erstellt haben.

  2. Führen Sie in der Befehlszeile folgenden Befehl aus:

    gcloud dataproc jobs submit hadoop \
      --project $PROJECT_ID \
      --cluster $DATAPROC_CLUSTER_ID \
      --region $REGION \
     --jar $MAPREDUCE_JAR \
     -- \
     sync-table \
     --sourcezkcluster=$ZOOKEEPER_QUORUM_AND_PORT:/hbase \
     --targetbigtableproject=$PROJECT_ID \
     --targetbigtableinstance=$BIGTABLE_INSTANCE_ID \
     $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/ \
     HBASE_TABLE_NAME \
     BIGTABLE_TABLE_NAME
    

    Ersetzen Sie Folgendes:

    • HBASE_TABLE_NAME: der Name der HBase-Tabelle, aus der Sie importieren
    • BIGTABLE_TABLE_NAME: der Name der Bigtable-Tabelle, in die Sie importieren

Optional können Sie dem Befehl --dryrun=false hinzufügen, wenn Sie die Synchronisierung zwischen Quelle und Ziel für abweichende Hashbereiche möchten.

Wenn der sync-table-Job abgeschlossen ist, werden die Zähler für den Job in der Google Cloud Console angezeigt, in der der Job ausgeführt wurde. Wenn der Importjob alle Daten erfolgreich importiert, hat der Wert für HASHES_MATCHED einen Wert und der Wert für HASHES_NOT_MATCHED ist 0.

Wenn HASHES_NOT_MATCHED einen Wert anzeigt, können Sie sync-table im Debug-Modus noch einmal ausführen, um die abweichenden Bereiche und Details auf Zellenebene wie Source missing cell, Target missing cell oder Different values auszugeben. Konfigurieren Sie --properties mapreduce.map.log.level=DEBUG, um den Debug-Modus zu aktivieren. Nachdem der Job ausgeführt wurde, verwenden Sie Cloud Logging und suchen Sie nach dem Ausdruck jsonPayload.class="org.apache.hadoop.hbase.mapreduce.SyncTable", um abweichende Zellen zu prüfen.

Sie können den Importjob noch einmal ausführen oder SyncTable verwenden, um die Quell- und Zieltabelle zu synchronisieren, indem Sie dryrun=false festlegen. Überprüfen Sie HBase SyncTable und zusätzliche Konfigurationsoptionen, bevor Sie fortfahren.

SyncTable-Ergebnisse in Cloud Logging

Anwendung zum Senden von Lese- und Schreibvorgängen an Bigtable aktualisieren

Nachdem Sie die Daten für jede Tabelle im Cluster validiert haben, können Sie Ihre Anwendungen so konfigurieren, dass der gesamte Traffic an Bigtable weitergeleitet wird. Danach wird der HBase-Cluster verworfen.

Sobald die Migration abgeschlossen ist, können Sie die Snapshots löschen.

Nächste Schritte