gpt4 book ai didi

java - 从 Hadoop 中的 Jar 中获取文件资源

转载 作者:可可西里 更新时间:2023-11-01 15:56:24 25 4
gpt4 key购买 nike

我正在尝试从 jar 运行 Hadoop 应用程序:

hadoop jar myJarFile.jar my.class.path.Here /path/to/input /path/to/output

在 myJarFile.jar 中的一个类中,我试图从类路径中读取资源:

public void init() {
Configuration conf = new Configuration();
conf.addResource("resources/myConf.xml");
log.info("Data element=" + conf.get("data.element"));
....

在 myJarFile.jar 中,resource/myConf 存在:

[prompt] jar myJarFile.jar
my/class/path/Here.class
...
resources/myConf.xml

并且配置文件包含正确(Hadoop 样式)格式的名称/值对。但是,每当我尝试运行它时,它都找不到 myConf.xml 文件,即使它应该在类路径中也是如此。

我错过了什么?

最佳答案

我假设 init 方法属于 mapper 或 reducer 类。执行这些类的 JVM 与驱动程序不是同一个 JVM,并且可能完全位于不同的机器上。所以你不能从这些类中读取本地文件系统。

您有两种选择来读取此文件。

选项 1(首选)像这样使用分布式缓存:

JobConf job = new JobConf();
DistributedCache.addCacheFile(new URI("resources/myConf.xml"),
job);

现在您可以在映射器或缩减器初始化方法中使用此文件,如下所示:

File f = new File("./myConf.xml");

选项 2(非首选):在 HDFS 中上传文件并使用 HDFS java 客户端 api 读取。

 Path pt=new Path("hdfs://<hdfs hostname>:9000/user/john/myConf.xml");
FileSystem fs = FileSystem.get(new Configuration());
BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(pt)));

之所以不推荐此选项,是因为对于您正在映射或减少的每条记录,您都是从 hdfs 读取数据,因此您将遇到重大的性能问题。

关于java - 从 Hadoop 中的 Jar 中获取文件资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43100956/

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