繁体   English   中英

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

[英]How to Serialize object in hadoop (in HDFS)

我有一个HashMap <String,ArrayList <Integer>>。 我想将我的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:文件对象,然后可以将其取回。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM