Ich führe einen Bereichsscan durch, der mir 500k Datensätze gibt.
Wenn ich scan.setCaching(100000)
eingestellt habe, dauerte es weniger als eine Sekunde, aber wenn scan.setCaching(100000)
nicht gesetzt ist, dauerte es fast 38 Sekunden.
Wenn ich scan.setBlockCache(false)
und scan.setCaching(100000)
einstelle, was wird passieren? Werden die Zeilen zwischengespeichert oder nicht?
Ich lasse den OS-Cache nach dem ersten Scanvorgang fallen, aber die Zeit zum Scannen der Datensätze ändert sich nicht. Warum?
Wie kann ich dann die Leseleistung überprüfen?
Scan.setCaching
ist eine falsche Bezeichnung. Es sollte wirklich so etwas wie Scan.setPrefetch
heißen. setCaching
gibt an, wie viele Zeilen pro RPC an den Regionserver übertragen werden. Wenn Sie setCaching(1)
verwenden, bezahlen Sie jedes Mal, wenn Sie next()
aufrufen, die Kosten für einen Hin- und Rückflug zum regionserver. Der Nachteil einer höheren Anzahl ist, dass Sie für zusätzlichen Speicher im Client bezahlen und möglicherweise Zeilen abrufen, die Sie nicht verwenden, z. B. wenn Sie nach Erreichen einer bestimmten Anzahl von Zeilen oder nach dem Scannen aufhören nachdem Sie einen bestimmten Wert gefunden haben.
Scan.setBlockCache
bedeutet etwas völlig anderes, wie Chandra es ausdrückte. Es weist den Regionserver grundsätzlich an, keine Daten aus diesem Scan in den HBase BlockCache zu ziehen, der ein separater Speicherpool aus dem MemStore ist. Beachten Sie, dass MemStores zum Schreiben verwendet werden und BlockCache zum Lesen verwendet wird und diese beiden Speicherbereiche vollständig voneinander getrennt sind. HBase verwendet den BlockCache derzeit nicht als Write-Back-Cache. Sie können die Größe des Blockcaches mit der Einstellung hfile.block.cache.size
config in hbase-site.xml
steuern. Ebenso können Sie die Gesamtpoolgröße des MemStore über die Einstellung hbase.regionserver.global.memstore.size
steuern.
Sie können setBlockCache(false)
verwenden, wenn Sie einen vollständigen Tabellenscan durchführen und den aktuellen Arbeitssatz nicht im Blockcache löschen möchten. Andernfalls, wenn Sie Daten scannen, die häufig verwendet werden, wäre es wahrscheinlich besser, setBlockCache
in Ruhe zu lassen.
Hbase hat zwei Arten von Cache-Strukturen - memory store
und block cache
. Der Speicher ist als MemStore implementiert und der Cache, den Sie zum Lesen verwenden, ist Block-Cache Ein Datenblock wird aus HDFS gelesen, er wird im BlockCache zwischengespeichert. Nachfolgende Lesevorgänge benachbarter Daten werden einfach aus dem BlockCache bedient. Wenn Sie also scan.set Block Cache (false) manuell setzen, stoppt das Zwischenspeichern der Zeilen, die es von hdfs liest.
scan.set-caching (100000) ist eine clientseitige Optimierung an Scanner. So funktioniert es immer noch nicht beeinflusst
Tags und Links hadoop caching hbase database-scan