Schreiben in HBase über Spark: Task nicht serialisierbar

7

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.

    
user3930663 11.08.2014, 19:21
quelle

1 Antwort

20

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:

Öffnen Sie auf jedem der Worker-Knoten eine Verbindung.

Beachten Sie die Verwendung von foreachPartition Methode:

%Vor%

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.

Serialisieren Sie alle Daten in einer einzigen Box und schreiben Sie sie in HBase

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.

Verwenden Sie HadoopOutputFormat

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.

    
Wildfire 12.08.2014, 09:04
quelle

Tags und Links