在每个datanode中将数据写入本地磁盘

Write data to local disk in each datanode

我想将map任务中的一些值存储到每个数据节点的本地磁盘中。例如,

public void map (...) {
   //Process
   List<Object> cache = new ArrayList<Object>();
   //Add value to cache
   //Serialize cache to local file in this data node
}

如何将这个缓存对象存储到每个数据节点的本地磁盘,因为如果我像上面那样将这个缓存存储在 map 函数中,那么性能会很糟糕,因为 I/O 任务?

我的意思是有没有办法在这个数据节点运行完全等待map任务,然后我们将这个缓存存储到本地磁盘?或者Hadoop有解决这个问题的功能吗?

请看下面的示例,创建的文件将位于 NodeManager 用于容器的目录下的某个位置。这是yarn-site.xml中的配置属性yarn.nodemanager.local-dirs,或者默认继承自yarn-default.xml,在/tmp

请参阅@Chris Nauroth 的回答, 这表示它仅用于调试目的,不建议将其作为永久性生产配置。说清楚了为什么不推荐。

public void map(Object key, Text value, Context context)
        throws IOException, InterruptedException {
    // do some hadoop stuff, like counting words
    String path = "newFile.txt";
    try {
        File f = new File(path);
        f.createNewFile();
    } catch (IOException e) {
        System.out.println("Message easy to look up in the logs.");
        System.err.println("Error easy to look up in the logs.");
        e.printStackTrace();
        throw e;
    }
}