De huidige (4.2) release van CDH - Cloudera's 100% open-source distributie van Apache Hadoop en gerelateerde projecten (inclusief Apache HBase) - introduceerde een nieuwe HBase-functie, die onlangs in trunk is geland, waarmee een beheerder een momentopname kan maken van een gespecificeerd tafel.
Vóór CDH 4.2 was de enige manier om een back-up van een tabel te maken of een tabel te klonen het gebruik van Copy/Export Table, of na het uitschakelen van de tabel, kopieer alle hfiles in HDFS. Tabel kopiëren/exporteren is een set hulpprogramma's die MapReduce gebruikt om de tabel te scannen en kopiëren, maar met een directe impact op de prestaties van de Region Server. Het uitschakelen van de tabel stopt alle lees- en schrijfbewerkingen, wat bijna altijd onaanvaardbaar zal zijn.
Met HBase-snapshots daarentegen kan een beheerder een tabel klonen zonder gegevenskopieën en met minimale impact op regioservers. Het exporteren van de momentopname naar een ander cluster heeft geen directe invloed op de regioservers; exporteren is slechts een distcp met een extra beetje logica.
Hier zijn enkele gebruiksscenario's voor HBase-snapshots:
- Herstel van gebruikers-/toepassingsfouten
- Herstellen/Herstellen vanuit een bekende veilige staat.
- Bekijk eerdere snapshots en voeg selectief het verschil samen in productie.
- Bewaar een momentopname vlak voor een grote applicatie-upgrade of wijziging.
- Auditing en/of rapportage over weergaven van gegevens op een bepaald tijdstip
- Maandelijkse gegevens vastleggen voor nalevingsdoeleinden.
- Dag-/maand-/kwartaalrapporten uitvoeren.
- Toepassing testen
- Test schema- of applicatiewijzigingen op gegevens die vergelijkbaar zijn met die in productie vanaf een momentopname en gooi deze vervolgens weg. Bijvoorbeeld:maak een momentopname, maak een nieuwe tabel van de momentopname-inhoud (schema plus gegevens) en manipuleer de nieuwe tabel door het schema te wijzigen, rijen toe te voegen en te verwijderen, enzovoort. (De originele tabel, de snapshot en de nieuwe tabel blijven onderling onafhankelijk.)
- Loslaten van werk
- Maak een momentopname, exporteer deze naar een ander cluster en voer uw MapReduce-taken uit. Aangezien de export-snapshot op HDFS-niveau werkt, vertraagt u uw hoofd-HBase-cluster niet zo veel als CopyTable.
Wat is een momentopname?
Een momentopname is een set metagegevensinformatie waarmee een beheerder terug kan gaan naar een eerdere staat van de tabel. Een snapshot is geen kopie van de tabel; het is slechts een lijst met bestandsnamen en kopieert de gegevens niet. Een volledige snapshot-herstel betekent dat u teruggaat naar het vorige "tabelschema" en dat u uw eerdere gegevens terugkrijgt waarbij alle wijzigingen die zijn aangebracht sinds de snapshot is gemaakt, verloren gaan.
Bewerkingen
- Een momentopname maken:met deze bewerking wordt geprobeerd een momentopname te maken van een opgegeven tabel. De bewerking kan mislukken als regio's bewegen tijdens het balanceren, splitsen of samenvoegen.
- Een momentopname klonen:met deze bewerking wordt een nieuwe tabel gemaakt met hetzelfde schema en met dezelfde gegevens in de opgegeven momentopname. Het resultaat van deze bewerking is een nieuwe, volledig functionele tabel die kan worden gewijzigd zonder dat dit gevolgen heeft voor de oorspronkelijke tabel of de momentopname.
- Een momentopname herstellen:deze bewerking brengt het tabelschema en de gegevens terug naar de momentopnamestatus. (Opmerking:deze bewerking negeert alle wijzigingen die zijn aangebracht sinds de momentopname werd gemaakt.)
- Een momentopname verwijderen:deze bewerking verwijdert een momentopname van het systeem, waardoor niet-gedeelde schijfruimte wordt vrijgemaakt, zonder dat dit gevolgen heeft voor klonen of andere momentopnamen.
- Een momentopname exporteren:deze bewerking kopieert de momentopnamegegevens en metadata naar een ander cluster. De operatie heeft alleen betrekking op HDFS, dus er is geen communicatie met de Master of de Region Servers, en dus kan het HBase-cluster down zijn.
Snapshot kopiëren, herstellen, klonen
Het belangrijkste verschil tussen een snapshot en een CopyTable/ExportTable is dat de snapshotbewerkingen alleen metadata schrijven. Er zijn geen enorme gegevenskopieën bij betrokken.
Een van de belangrijkste ontwerpprincipes van HBase is dat een eenmaal geschreven bestand nooit meer zal worden gewijzigd. Het hebben van onveranderlijke bestanden betekent dat een snapshot alleen de bestanden bijhoudt die zijn gebruikt op het moment van de snapshot-bewerking, en tijdens een verdichting is het de verantwoordelijkheid van de snapshot om het systeem te informeren dat het bestand niet moet worden verwijderd, maar in plaats daarvan moet worden gearchiveerd.
Hetzelfde principe is van toepassing op een Clone- of Restore-bewerking. Aangezien de bestanden onveranderlijk zijn, wordt er een nieuwe tabel gemaakt met alleen "links" naar de bestanden waarnaar door de snapshot wordt verwezen.
Momentopname exporteren is de enige bewerking waarvoor een kopie van de gegevens nodig is, aangezien het andere cluster de gegevensbestanden niet heeft.
Momentopname exporteren versus tabel kopiëren/exporteren
Afgezien van de betere consistentiegaranties die een momentopname kan bieden in vergelijking met een kopieer-/exporttaak, is het belangrijkste verschil tussen het exporteren van een momentopname en het kopiëren/exporteren van een tabel dat ExportSnapshot op HDFS-niveau werkt. Dit betekent dat Master- en Regioservers niet betrokken zijn bij deze operaties. Bijgevolg worden er geen onnodige caches voor gegevens gemaakt en worden er geen extra GC-pauzes geactiveerd vanwege het aantal objecten dat tijdens het scanproces is gemaakt. De prestatie-impact op het HBase-cluster komt voort uit de extra netwerk- en schijfbelasting die de DataNodes ervaren.
HBase Shell:Snapshot-bewerkingen
Controleer of de ondersteuning voor snapshots is ingeschakeld door te controleren of de hbase.snapshot.enabled
eigenschap in hbase-site.xml is ingesteld op true. Gebruik de snapshot
. om een momentopname te maken van een gespecificeerde tabel opdracht. (Er worden geen bestandskopieën uitgevoerd)
hbase> snapshot ‘tableName’, ‘snapshotName’
Gebruik de list_snapshot
. om alle snapshots weer te geven opdracht. het zal de naam van de momentopname, de brontabel en de aanmaakdatum en -tijd weergeven.
hbase> list_snapshots SNAPSHOT TABLE + CREATION TIME TestSnapshot TestTable (Mon Feb 25 21:13:49 +0000 2013)
Gebruik de delete_snapshot
. om een snapshot te verwijderen opdracht. Het verwijderen van een momentopname heeft geen invloed op gekloonde tabellen of andere daaropvolgende gemaakte momentopnamen.
hbase> delete_snapshot 'snapshotName'
Om een nieuwe tabel te maken van een gespecificeerde momentopname (kloon), gebruikt u de clone_snapshot
opdracht. Er worden geen gegevenskopieën gemaakt, dus u gebruikt niet twee keer zoveel ruimte voor dezelfde gegevens.
hbase> clone_snapshot 'snapshotName', 'newTableName'
Gebruik de restore_snapshot
om het huidige tabelschema/de huidige gegevens te vervangen door een gespecificeerde momentopname-inhoud. commando.
hbase> restore_snapshot 'snapshotName'
Om een bestaande momentopname naar een ander cluster te exporteren, gebruikt u de ExportSnapshot
hulpmiddel. De export heeft geen invloed op de RegionServers-werklast, het werkt op HDFS-niveau en u moet een HDFS-locatie specificeren (de hbase.rootdir van het andere cluster).
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot SnapshotName -copy-to hdfs:///srv2:8082/hbase
Huidige beperkingen
Snapshots zijn gebaseerd op enkele aannames en momenteel zijn er een aantal tools die niet volledig zijn geïntegreerd met de nieuwe functie:
- Het samenvoegen van regio's waarnaar wordt verwezen door snapshots veroorzaakt gegevensverlies op de snapshot en op gekloonde tabellen.
- Het herstellen van een tabel met replicatie ingeschakeld voor de herstelde tabel leidt ertoe dat de twee clusters niet synchroon lopen. De tabel is niet hersteld op de replica.
Conclusie
Momenteel bevat de snapshot-functie alle vereiste basisfunctionaliteit, maar er is nog veel werk te doen, inclusief statistieken, web-UI-integratie, schijfgebruikoptimalisaties en meer.
Raadpleeg de documentatie voor meer informatie over het configureren van HBase en het gebruik van snapshots.
Matteo Bertozzi is een Software Engineer in het Platform-team en een HBase-committer.