Java 如何在hadoop中序列化对象(在HDFS中)
我有一个HashMapJava 如何在hadoop中序列化对象(在HDFS中),java,hadoop,serialization,mapreduce,bigdata,Java,Hadoop,Serialization,Mapreduce,Bigdata,我有一个HashMap。我想将HashMap对象(hmap)序列化到HDFS位置,然后在Mapper和reducer上反序列化以使用它 为了在HDFS上序列化HashMap对象,我使用了普通java对象序列化代码,如下所示,但出现错误(权限被拒绝) 我得到了以下例外 java.io.FileNotFoundException: hashmap.ser (Permission denied) at java.io.FileOutputStream.open(Native Method)
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)
java.io.FileNotFoundException:hashmap.ser(权限被拒绝)
在java.io.FileOutputStream.open(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:221)
位于java.io.FileOutputStream。(FileOutputStream.java:110)
在KMerIndex.createIndex(KMerIndex.java:121)
在MyDriverClass.formRefIndex(MyDriverClass.java:717)
在MyDriverClass.main(MyDriverClass.java:768)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.apache.hadoop.util.RunJar.run(RunJar.java:221)
位于org.apache.hadoop.util.RunJar.main(RunJar.java:136)
有人可以建议或分享如何在hdfs上序列化hadoop中的对象的示例代码吗?请尝试使用Apache Commons Lang
下面是一些方法
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时,可以存储从serialize返回的字节[]
。
在获取对象时,您可以为ex:File对象键入cast to对应的对象,然后将其取回
在我的例子中,我在Hbase列中存储了一个hashmap,然后在我的mapper方法中将它恢复为hashmap原样。。并在这方面取得了成功。
当然,你也可以这样做
另一件事是您还可以使用ApacheCommonsIO(org.Apache.Commons.IO.FileUtils
);
但稍后您需要将此文件复制到HDFS。因为您想要HDFS作为数据存储
FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray);
注意:JAR apache commons io和apache commons lang在hadoop集群中始终可用。请尝试使用apache commons lang
下面是一些方法
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时,可以存储从serialize返回的字节[]
。
在获取对象时,您可以为ex:File对象键入cast to对应的对象,然后将其取回
在我的例子中,我在Hbase列中存储了一个hashmap,然后在我的mapper方法中将它恢复为hashmap原样。。并在这方面取得了成功。
当然,你也可以这样做
另一件事是您还可以使用ApacheCommonsIO(org.Apache.Commons.IO.FileUtils
);
但稍后您需要将此文件复制到HDFS。因为您想要HDFS作为数据存储
FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray);
注意:JAR apache commons io和apache commons lang在hadoop集群中始终可用。这似乎是文件权限问题。然而,为了使它简单,请检查我的回答这似乎是文件权限问题。然而,为了使它简单,请检查我的回答谢谢你的答复。您能告诉我如何在HDFS上写入SerializationUtils.serialize(obj)方法返回的字节[],这里我的可序列化对象将是hashmap对象,对吗?是的,您是对的。可以将hashmap序列化为字节数组。如果反序列化,则可以取回相同的hashmap。事实上,我做过,只是不同而已。。您的数据存储是hdfs,数据存储是Hbase列。没错,hashmap实现了可序列化。如果您看到层次结构。你可以得到它。谢谢你的回答,先生。谢谢你的回复。您能告诉我如何在HDFS上写入SerializationUtils.serialize(obj)方法返回的字节[],这里我的可序列化对象将是hashmap对象,对吗?是的,您是对的。可以将hashmap序列化为字节数组。如果反序列化,则可以取回相同的hashmap。事实上,我做过,只是不同而已。。您的数据存储是hdfs,数据存储是Hbase列。没错,hashmap实现了可序列化。如果您看到层次结构。你可以得到它。看这个,非常感谢你的回答,先生。