Ich versuche, einige einfache Daten in HBase (0.96.0-hadoop2) mit Spark 1.0 zu schreiben, aber ich bekomme immer Serialisierungsprobleme. Hier ist der relevante Code:
%Vor%Das Ausführen des Codes führt zu:
%Vor%Das Ersetzen der foreach mit Karte stürzt nicht ab, aber ich schreibe auch nicht. Jede Hilfe wird sehr geschätzt.
Die Klasse HBaseConfiguration
stellt einen Pool von Verbindungen zu HBase-Servern dar. Offensichtlich kann es nicht serialisiert und an die Arbeiterknoten gesendet werden. Da HTable
diesen Pool für die Kommunikation mit den HBase-Servern verwendet, kann er nicht serialisiert werden.
Grundsätzlich gibt es drei Möglichkeiten, dieses Problem zu lösen:
Beachten Sie die Verwendung von foreachPartition
Methode:
Beachten Sie, dass jeder der Worker-Knoten Zugriff auf HBase-Server haben muss und dass die erforderlichen Jars vorinstalliert sein müssen oder über ADD_JARS
bereitgestellt werden müssen.
Beachten Sie auch, dass es sinnvoll ist, wenn der Verbindungspool für jede Partition geöffnet wird, die Anzahl der Partitionen grob auf die Anzahl der Worker-Knoten zu reduzieren (mit coalesce
function). Es ist auch möglich, eine einzelne HTable
-Instanz auf jedem der Worker-Knoten zu teilen, aber das ist nicht so trivial.
Es ist möglich, alle Daten von einer RDD mit einem einzigen Computer zu schreiben, auch wenn die Daten nicht in den Speicher passen. Die Details werden in dieser Antwort erklärt: Spark: Best Practice zum Abrufen großer Daten von RDD auf lokalen Computer
Natürlich wäre es langsamer als verteiltes Schreiben, aber es ist einfach, bringt keine schmerzhaften Serialisierungsprobleme und ist möglicherweise der beste Ansatz, wenn die Datengröße vernünftig ist.
Es ist möglich, ein benutzerdefiniertes HadoopOutputFormat für HBase zu erstellen oder ein vorhandenes zu verwenden. Ich bin mir nicht sicher, ob es etwas gibt, das Ihren Bedürfnissen entspricht, aber Google sollte hier helfen.
P.S. Übrigens stürzt der Aufruf map
nicht ab, da er nicht ausgewertet wird: RDDs werden erst ausgewertet, wenn Sie eine Funktion mit Nebeneffekten aufrufen. Zum Beispiel, wenn Sie theData.map(....).persist
aufgerufen haben, würde es auch abstürzen.
Tags und Links scala apache-spark hbase