我们可以传递一个整数作为Configuration属性,如下所示:
Configuration conf = new Configuration();
conf.set("size", 4);
有没有办法将整数数组作为属性值发送?
conf.set("list.of.nums", {2, 4, 6, 8}); // one way is to pass them as a String but it doesn't look good
答案 0 :(得分:0)
您可以将数组对象序列化为文件,然后将文件移动到HDFS。然后,您可以使用以下命令将hdfs文件路径添加到分布式缓存。
DistributedCache.addCacheFile(new URI(dfsMetaPath + "#"
+ Constants.OBJSYMLINK0), conf);
DistributedCache.createSymlink(conf);
序列化可以按如下方式进行: -
public static <T> void serializeMetadata(T voObj,
String filePath) throws IOException,NullPointerException {
if(null==voObj){
throw new NullPointerException("NULL object found");
}
ObjectOutputStream oout = null;
FileOutputStream fsout = null;
try {
fsout = new FileOutputStream(filePath);
oout = new ObjectOutputStream(fsout);
oout.writeObject(voObj);
oout.close();
} finally {
if (null != fsout) {
fsout.close();
}
if (null != oout) {
oout.close();
}
}
}
您可以使用作为参数传递给上述方法的文件路径。使用此文件路径可以将文件移动到HDFS文件路径。使用HDFS文件路径创建符号链接。
要在mapper中退出,您可以使用以下内部设置来恢复该对象。
File hdfsfilepath = new File(Constants.OBJSYMLINK0);
Integer[] youarray = MetadataSerDeUtils.deserializeMetadata(youarray ,
hdfsfilepath.getAbsolutePath());
对于反序列化,您可以使用以下代码: -
public static <T> T deserializeMetadata(T voObj,
String filePath) throws IOException,NullPointerException, ClassNotFoundException {
FileInputStream fsin = null;
ObjectInputStream oin = null;
try {
fsin = new FileInputStream(filePath);
oin = new ObjectInputStream(fsin);
voObj = (T) oin.readObject();
return voObj;
} finally {
if (null != fsin) {
fsin.close();
}
if (null != oin) {
oin.close();
}
}
}