Java 如何在hadoop中序列化对象(在HDFS中)

Java 如何在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)

我有一个HashMap>。我想将HashMap对象(hmap)序列化到HDFS位置,然后在Mapper和reducer上反序列化以使用它

为了在HDFS上序列化HashMap对象,我使用了普通java对象序列化代码,如下所示,但出现错误(权限被拒绝)

我得到了以下例外

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实现了可序列化。如果您看到层次结构。你可以得到它。看这个,非常感谢你的回答,先生。