【问题标题】:How to Serialize object in hadoop (in HDFS)如何在 hadoop 中序列化对象(在 HDFS 中)
【发布时间】:2016-09-29 11:02:58
【问题描述】:

我有一个 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 中序列化对象的示例代码吗?

【问题讨论】:

  • 这似乎是文件权限问题。但是为了简单起见,请检查我的答案

标签: java hadoop serialization mapreduce bigdata


【解决方案1】:

请尝试使用来自 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[]。 在获取对象时,您可以将类型转换为相应的对象,例如:文件对象并可以将其取回。

在我的例子中,我在 Hbase 列中存储了一个哈希图,我在我的映射器方法中将它检索回来,就像它是 Hashmap 一样......并且成功了。强>

当然,你也可以用同样的方法...

另一件事是你也可以使用 Apache Commons IO refer this (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) 方法返回的 byte[] ,这里我的可序列化对象将是 hashmap 对象,对吧?
  • 是的,你是对的。您可以将 hashmap 序列化为字节数组。如果您反序列化,您可以取回相同的哈希图。事实上,我已经做到了,只有 diff.. 是您的数据存储是 hdfs,数据存储是 Hbase 列。就这些
  • 是的 hashmap 实现了可序列化。如果你看到层次结构。你可以得到它。看到这个docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
  • 非常感谢您的回答先生。
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 2021-12-26
  • 2010-10-06
  • 1970-01-01
  • 2023-03-03
  • 2011-05-21
  • 2022-01-13
相关资源
最近更新 更多