[英]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.