2015-02-25 7 views
7

Ich möchte in der Lage sein, Bilder auf einem hdfs-Dateisystem zu lesen/schreiben und nutzen Sie die hdfs-Lokalität.mit pyspark, lesen/schreiben 2D-Bilder auf Hadoop-Dateisystem

Ich habe eine Sammlung von Bildern, wobei jedes Bild von

  • 2D-Arrays von uint16
  • Grunde zusätzlicher Informationen gespeichert als XML-Datei zusammengesetzt ist.

Ich möchte ein Archiv über hdfs Dateisystem erstellen und Funke für die Analyse des Archivs verwenden. Im Moment kämpfe ich um den besten Weg, die Daten über das hdfs-Dateisystem zu speichern, um die spark + hdfs-Struktur voll ausnutzen zu können.

Von dem, was ich verstehe, wäre der beste Weg, eine Sequenzdatei Wrapper zu erstellen. Ich habe zwei Fragen:

  • Ist das Erstellen einer Sequenzdatei Wrapper der beste Weg?
  • Hat jemand einen Zeiger auf Beispiele, mit denen ich anfangen könnte? Ich muss nicht der erste sein, der etwas anderes als Textdatei auf hdfs durch Funken lesen muss!

Antwort

7

Ich habe eine Lösung gefunden, die funktioniert: die Verwendung der pyspark 1.2.0 Binaryfile macht den Job. Es ist als experimentell markiert, aber ich konnte tiff Bilder mit einer richtigen Kombination von openCV lesen.

import cv2 
import numpy as np 

# build rdd and take one element for testing purpose 
L = sc.binaryFiles('hdfs://localhost:9000/*.tif').take(1) 

# convert to bytearray and then to np array 
file_bytes = np.asarray(bytearray(L[0][1]), dtype=np.uint8) 

# use opencv to decode the np bytes array 
R = cv2.imdecode(file_bytes,1) 

Beachten Sie die Hilfe von pyspark:

binaryFiles(path, minPartitions=None) 

    :: Experimental 

    Read a directory of binary files from HDFS, a local file system (available on all nodes), or any Hadoop-supported file system URI as a byte array. Each file is read as a single record and returned in a key-value pair, where the key is the path of each file, the value is the content of each file. 

    Note: Small files are preferred, large file is also allowable, but may cause bad performance. 
+0

Dank - das ist interessant. Neugierig zu wissen, ob Sie auch Funken für die Tiff-Analyse verwendet haben? Ich arbeite mit großen (~ 800MB) TIFF-Dateien und möchte eine pyspark RDD aus dem numpy Array erstellen, aber nicht sicher, wie es geht. – user3591836

+0

Von meinen Experimenten ist es viel einfacher, wenn ich die Daten richtig vorbereite: Ich wandle Bilddateien in "avro" -Dateien um, die überlappende Bildkacheln enthalten. Ich muss mit sehr großen Bildern (400 MPixel) umgehen und es ist die beste Lösung für mich. – MathiasOrtner

+0

toll, danke für den Tipp! – user3591836