如何在MapReduce的Configuration对象中传递一个整数数组作为属性值?

时间:2013-11-25 12:16:38

标签: mapreduce

我们可以传递一个整数作为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

1 个答案:

答案 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();
        }
    }
}