小编典典

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

java

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


阅读 344

收藏
2020-11-30

共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[]从序列化返回的内容。获取对象时,您可以将强制类型转换为对应的对象,例如ex:文件对象,然后可以将其取回。

就我而言,我在Hbase列中存储了一个哈希图,我将其检索回去,并在我的映射器方法中原样作为Hashmap ..并成功实现了该任务。

当然,您也可以用相同的方式来做…

另一件事是,您也可以使用Apache Commons IO
引用thisorg.apache.commons.io.FileUtils);但是稍后您需要将此文件复制到HDFS。因为您想要HDFS作为数据存储。

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

注意:jar apache commons io和apache commons lang在hadoop集群中始终可用。

2020-11-30