gpt4 book ai didi

hadoop - 在主节点维护一个数据结构

转载 作者:可可西里 更新时间:2023-11-01 15:29:39 27 4
gpt4 key购买 nike

我在一些数据上编写了一个 MR 算法来创建一个数据结构。创建后我需要回答一些问题。为了更快地回答这些查询,我根据结果创建了一个元数据(大约几 MB)。

现在我的问题是:

是否可以在主节点的内存中创建此元数据以避免文件 I/O,从而更快地回答查询?

最佳答案

假设,根据 OP 对其他答案的响应,另一个 MR 作业将需要元数据。在这种情况下使用分布式缓存相当容易:

在驱动类中:

public class DriverClass extends Configured{

public static void main(String[] args) throws Exception {

/* ...some init code... */


/*
* Instantiate a Job object for your job's configuration.
*/
Configuration job_conf = new Configuration();
DistributedCache.addCacheFile(new Path("path/to/your/data.txt").toUri(),job_conf);
Job job = new Job(job_conf);

/* ... configure and start the job... */

}
}

在映射器类中,您可以在设置阶段读取数据并将其提供给 map 类:

public class YourMapper extends Mapper<LongWritable, Text, Text, Text>{

private List<String> lines = new ArrayList<String>();

@Override
protected void setup(Context context) throws IOException,
InterruptedException {

/* Get the cached archives/files */
Path[] cached_file = new Path[0];
try {
cached_file = DistributedCache.getLocalCacheFiles(context.getConfiguration());
} catch (IOException e1) {
// TODO add error code
e1.printStackTrace();
}
File f = new File (cached_file[0].toString());
try {
/* Read the data some thing like: */
lines = Files.readLines(f,charset);
} catch (IOException e) {

e.printStackTrace();
}
}


@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {

/*
* In the mapper - use the data as needed
*/

}
}

请注意,分布式缓存可以容纳更多的纯文本文件。您可以使用存档(zip、tar..)甚至完整的 java 类(jar 文件)。

另请注意,在较新的 Hadoop 实现中,分布式缓存 API 位于作业类本身中。引用this APIthis answer .

关于hadoop - 在主节点维护一个数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36565747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com