当前位置: 首页 > 面试题库 >

运行Hadoop MapReduce作业时,如何获取文件名/文件内容作为MAP的键/值输入?

伯晨
2023-03-14
问题内容

我正在创建一个程序来分析PDF,DOC和DOCX文件。这些文件存储在HDFS中。

当我开始MapReduce作业时,我希望map函数将Filename作为键,将Binary
Contents作为值。然后,我想创建一个流阅读器,可以将其传递给PDF解析器库。如何实现映射阶段的键/值对是文件名/文件内容?

我正在使用Hadoop 0.20.2

这是开始工作的旧代码

public static void main(String[] args) throws Exception {
 JobConf conf = new JobConf(PdfReader.class);
 conf.setJobName("pdfreader");

 conf.setOutputKeyClass(Text.class);
 conf.setOutputValueClass(IntWritable.class);

 conf.setMapperClass(Map.class);
 conf.setReducerClass(Reduce.class);

 conf.setInputFormat(TextInputFormat.class);
 conf.setOutputFormat(TextOutputFormat.class);

 FileInputFormat.setInputPaths(conf, new Path(args[0]));
 FileOutputFormat.setOutputPath(conf, new Path(args[1]));

 JobClient.runJob(conf);
}

我知道还有其他inputformat类型。但是,有没有一种正是我想要的?我发现文档含糊不清。如果有一个可用的,那么Map函数输入类型应该如何显示?

提前致谢!


问题答案:

解决方案是创建自己的FileInputFormat类来执行此操作。您可以从此FileInputFormat接收的FileSplit(getPath)访问输入文件的名称。确保否决FileInputformat的isSplitable以始终返回false。

您还将需要一个自定义的RecordReader,它以单个“ Record”值返回整个文件。

处理太大的文件时要小心。您将有效地将整个文件加载到RAM中,并且任务跟踪器的默认设置是仅具有200MB RAM。



 类似资料:
  • 当试图安排作业时,我们需要来自Azkaban的作业名称。有什么内置属性吗?我们从获取流名称。 我的工作文件是:

  • 问题内容: 我下载了文件作为ajax的响应。如何从内容处置中获取文件名和文件类型并显示其缩略图。我有许多搜索结果,但找不到正确的方法。 控制台输出: 问题答案: 这是我有时使用它的方式。我假设您将附件作为服务器响应提供。 我从REST服务中这样设置响应头 编辑:编辑答案以适合您的问题-使用单词代替

  • 问题内容: 我在AWS Athena中创建了用于查询S3数据的外部表,但是位置路径中有1000多个文件。因此,我需要将记录的相应文件名显示为表中的一列。 简而言之,我需要了解AWS Athena Presto中等效的INPUT__FILE__NAME(hive)或任何其他实现此目的的方法。 问题答案: 您可以使用$ path伪列执行此操作。

  • 问题内容: 我只是想到了一种不那么直截了当的方法: 我可以以某种方式将JAR资源列表转换为内部JAR URL列表,然后可以使用openConnection()打开它。 问题答案: 您使用JarFile打开一个Jar文件。有了它,您可以使用’getEntry(String name)’或’entires’来获取ZipEntry或JarEntry(它们可以看作同一东西)。收到条目后,可以通过调用’ J

  • 当我使用相对路径时,我可以从Eclipse运行Java程序。但是,当我将其作为JAR文件运行时,该路径不再有效。在我的src/components/SettingsWindow中。我有:

  • 问题内容: 我必须阅读一个包含字符串列表的文件。我试图遵循建议这个职位。两种解决方案都需要使用,但使用而不是a 作为参数。 我需要一个。 这篇文章 将 是我的问题,除非OP被劝说不要完全使用文件。如果要使用Apache方法,则需要一个文件,这是我最初遇到的问题的首选解决方案。 我的文件很小(大约一百行),每个程序实例一个文件,因此我不必担心在内存中有另一个文件副本。因此,我可以使用更基本的方法来读