2016-05-31 18 views
0

Ich habe eine HashMap < String, ArrayList < Integer>>. Ich möchte mein HashMap-Objekt (hmap) zum HDFS-Speicherort serialisieren und es später bei Mapper and Reducers für die Verwendung deserialisieren.How to Serialize Objekt in Hadoop (in HDFS)

Zu meinem HashMap Objekt auf HDFS Ich benutzte normale Java-Objekt Serialisierungscode Serialisierung wie folgt aber erhielt Fehler (Berechtigung verweigert)

try 
     { 
      FileOutputStream fileOut =new FileOutputStream("hashmap.ser"); 
      ObjectOutputStream out = new ObjectOutputStream(fileOut); 
      out.writeObject(hm); 
      out.close(); 

     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

ich die folgende Ausnahme

bekam
java.io.FileNotFoundException: hashmap.ser (Permission denied) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:110) 
    at KMerIndex.createIndex(KMerIndex.java:121) 
    at MyDriverClass.formRefIndex(MyDriverClass.java:717) 
    at MyDriverClass.main(MyDriverClass.java:768) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 

Kann jemand bitte vorschlagen oder teilen Sie den Beispielcode, wie Objekt in Hadoop auf hdfs serialisieren?

+0

dies scheint wie Dateierlaubnis Problem. Aber um es einfach zu machen, bitte überprüfen Sie meine Antwort –

Antwort

2

Bitte versuchen Sie mit SerializationUtils von Apache Commons Lang.

Im Folgenden sind Methoden

static Object clone(Serializable object) //Deep clone an Object using serialization. 
static Object deserialize(byte[] objectData) //Deserializes a single Object from an array of bytes. 
static Object deserialize(InputStream inputStream) //Deserializes an Object from the specified stream. 
static byte[] serialize(Serializable obj) //Serializes an Object to a byte array for storage/serialization. 
static void serialize(Serializable obj, OutputStream outputStream) //Serializes an Object to the specified stream. 

Während bei HDFS Speichern können Sie byte[] speichern, die von serialize zurückgegeben wurde. Beim Abrufen des Objekts können Sie die Umwandlung in das entsprechende Objekt für ex: File Objekt eingeben und es zurückholen.

In meinem Fall speicherte ich eine HASHAMP in Hbase-Spalte, ich holte es zurück, in meiner Mapper-Methode als Hashmap, wie es ist .. und war darin erfolgreich.

Sicher, können Sie auch tun, dass in der gleichen Art und Weise ...

andere Sache ist, haben Sie auch Apache Commons IO refer this (org.apache.commons.io.FileUtils) verwenden können; , aber später müssen Sie diese Datei in HDFS kopieren. da du HDFS als Datenspeicher haben wolltest.

FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray); 

Hinweis: Die beiden Gläser Apache Commons io und Apache commons lang immer in Hadoop-Cluster zur Verfügung stehen.

+0

Danke für die Antwort. Können Sie mir bitte sagen, wie schreibe ich byte [] von SerializationUtils.serialize (obj) -Methode auf HDFS und hier mein serialisierbares Objekt hashmap Objekt, nicht wahr? – Sumit

+0

Ja, Sie haben Recht. Sie können hashmap zu Byte-Array serialisieren. Wenn Sie deserialize, können Sie die gleiche hashmap zurücknehmen. Ich habe das inFact getan, nur diff. Ist Ihr Datenspeicher hdfs nach Datenspeicher ist Hbase Spalte. das ist alles –

+0

ja hashmap implementiert serialisierbar. wenn Sie die Hierarchie sehen. Du kannst es bekommen. Sehen Sie diese https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html –