如何将序列化对象放入Hadoop DFS并将其恢复到map函数中?

时间:2012-06-07 14:22:09

标签: java hadoop thrift bigdata

我是hadoop的新手,最近我被要求使用Hadoop做一个测试项目。 所以当我正在重读BigData时,碰巧知道了Pail。现在我想要做的就是这样。首先创建一个简单的对象,然后使用Thrift将其序列化,并使用Pail将其放入Hdfs。然后我想在map函数中获取该对象并执行我想要的任务。但我不知道在地图函数中获取tat对象。

有人可以告诉我任何参考文献或解释如何做到这一点吗?

Thanx

1 个答案:

答案 0 :(得分:0)

我可以想到三个选择:

  1. 使用-files选项并在HDFS中命名文件(因为任务跟踪器将为该节点上运行的所有作业下载文件一次,这是优选的)
  2. 使用DistributedCache(与上面类似的逻辑),但您通过一些API调用而不是通过命令行配置文件
  3. 直接从HDFS加载文件(因为每个任务都通过HDFS拉文件效率较低)
  4. 对于某些代码,将加载逻辑放入映射器的setup(...)或configure(..)方法(取决于您使用的是新API还是旧API),如下所示:

    protected void setup(Context context) {
        // the -files option makes the named file available in the local directory
        File file = new File("filename.dat");
        // open file and load contents ...
    
        // load the file directly from HDFS
        FileSystem fs = FileSystem.get(context.getConfiguration());
        InputStream hdfsInputStream = fs.open("/path/to/file/in/hdfs/filename.dat");
        // load file contents from stream...
    }
    

    DistributedCache在Javadocs

    中有一些示例代码