我有一个HashMap >。我想将我的HashMap对象(hmap)序列化为HDFS位置,然后在Mapper和Reducers上反序列化以使用它。
为了在HDFS上序列化我的HashMap对象,我使用了如下的普通Java对象序列化代码,但是出现了错误(权限被拒绝)
try { FileOutputStream fileOut =new FileOutputStream("hashmap.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(hm); out.close(); } catch(Exception e) { e.printStackTrace(); }
我有以下异常
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)
有人可以建议或分享在hdfs上的hadoop中如何序列化对象的示例代码吗?
请尝试使用来自Apache Commons Lang的SerializationUtils。
以下是方法
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.
在存储到HDFS中时,您可以存储byte[]从序列化返回的内容。获取对象时,您可以将强制类型转换为对应的对象,例如ex:文件对象,然后可以将其取回。
byte[]
就我而言,我在Hbase列中存储了一个哈希图,我将其检索回去,并在我的映射器方法中原样作为Hashmap ..并成功实现了该任务。
当然,您也可以用相同的方式来做…
另一件事是,您也可以使用Apache Commons IO 引用this(org.apache.commons.io.FileUtils);但是稍后您需要将此文件复制到HDFS。因为您想要HDFS作为数据存储。
org.apache.commons.io.FileUtils
FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray);
注意:jar apache commons io和apache commons lang在hadoop集群中始终可用。