Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在mapreduce中从HDFS读取大图像_Java_Image Processing_Hadoop - Fatal编程技术网

Java 在mapreduce中从HDFS读取大图像

Java 在mapreduce中从HDFS读取大图像,java,image-processing,hadoop,Java,Image Processing,Hadoop,在HDFS(块大小64MB)中有一个非常大的图像(~200MB)。我想知道以下几点: 如何在mapReduce作业中读取图像 许多主题建议使用完整的输入格式。还有其他选择吗?怎么做 当使用WholeInputFormat时,是否会对块进行并行处理?我想没有 如果块大小为64 MB,HDFS很可能会将图像文件分割成块并在集群中复制,具体取决于集群配置 假设您希望将图像文件处理为一条记录,而不是一行一行地处理多个块,我可以考虑以下几个选项来处理整个图像文件 您可以实现自定义输入格式和记录读取器。输入

在HDFS(块大小64MB)中有一个非常大的图像(~200MB)。我想知道以下几点:

  • 如何在mapReduce作业中读取图像

  • 许多主题建议使用完整的输入格式。还有其他选择吗?怎么做

  • 当使用WholeInputFormat时,是否会对块进行并行处理?我想没有


  • 如果块大小为64 MB,HDFS很可能会将图像文件分割成块并在集群中复制,具体取决于集群配置

    假设您希望将图像文件处理为一条记录,而不是一行一行地处理多个块,我可以考虑以下几个选项来处理整个图像文件

  • 您可以实现自定义输入格式和记录读取器。输入格式中的isSplitable()方法应返回false。RecordReader.next(LongWritable pos,RecType val)方法应该读取整个文件并将val设置为文件内容。这将确保 整个文件作为一条记录转到一个映射任务

  • 您可以对输入格式进行子类化,并重写isSplitable()方法,使其返回false。示例显示如何创建子类
    SequenceFileInputFormat,以实现不可分割的SequenceFileInputFormat


  • 尽管您可以使用WholeFileInputFormat或SequenceFileInputFormat或其他自定义方法来读取图像文件,但实际问题(在我看来)是从读取的文件中提取一些内容。好的。你已经阅读了文件,现在怎么办?你将如何处理你的图像来检测你的映射器中的任何物体。我并不是说这是不可能的,但这需要做很多工作

    我知道,你最好用这样的东西。HIPI提供了一个API,用于在MapReduce框架上执行图像处理任务

    编辑:

    如果您真的想按自己的方式来做,那么您需要编写一个自定义InputFormat。因为图像不像文本文件,所以不能使用像
    \n
    这样的分隔符来创建拆分。一种可能的解决方法是根据给定的字节数创建拆分。例如,如果图像文件的大小为200MB,则可以编写一个InputFormat,它将创建100MB的拆分(或在作业配置中作为参数提供的任何内容)。很久以前,我在处理一些二进制文件时遇到过这种情况,这对我帮助很大


    HTH

    我想这取决于您希望执行的处理类型。如果您正在尝试执行一些可以执行的操作,首先将大的输入分割成较小的图像文件,然后独立处理块,最后将输出部分缝合回大的最终输出,那么这是可能的。我不是图像专家,但假设你想把彩色图像变成灰度,那么你可能会把大图像切成小图像。然后使用MR并行地转换它们。一旦映射完成,然后将它们缝合回一个大的灰度图像


    如果您了解图像的格式,那么您可以编写自己的recordreader,以帮助框架了解记录边界,从而在将记录边界输入到映射器时防止损坏。

    它是如何存储在HDFS中的,以及阅读后您打算做些什么?请参阅以下问题:感谢快速回复。我已经讨论了上述主题,但似乎与我的问题不同(除了第一个)。使用copyFromLocal将映像转储到HDFS。我不知道它是怎么储存的。我的主要目的是目标检测。如果我理解正确,HIPI会将小图像打包成大图像,以便执行作业。所以它没有解决我的问题。嗯,这只是一个建议。你说得对。但这只是给你一些想法,这很有帮助。在图像中,将有一些与相关联的元数据。如何将其与原始图像数据区分开来?在InputFormat中,跳过开头的“n”字节(元数据)。更具体地说,在你的RrecordReader中。很明显,图像被分为几个块。我的目标是并行处理块(现在似乎不可能)。我将尝试一个简单的java程序,而不是实现一个customInputFormat来执行MapReduce而无需并行性。如果图像被分割成几个块,映射任务将自动并行运行(通常每个块一个映射任务)。是的,您是对的。但是,各个块是否会包含有关要处理的图像的一些有意义的信息?我不这么认为,因为子图像无法加载到映射器中(我不确定)。是的,确实如此,这是最可能的解决方案。然而,这样的记录阅读器并不容易实现。与文本文件不同,图像的顺序意义不大。为了将图像分割成更小的部分,必须对原始图像进行多次传递(=部分数量)。您不能使用javax.imageio(java的图像处理API)来分割和连接图像吗?有一个叫做Graphics2D的类值得研究。