2012-01-12 2 views
0

일부 모듈에서 이미지 (jpg)를 얻는 시스템이 있습니다. 한 번에 10 개의 객체 (단일 객체의 경우 1000 개의 이미지)에 대한 이미지를 얻습니다 (한 번에 총 10000 개의 이미지). Hadoop 클러스터를 사용하여 이러한 이미지를 처리해야합니다.mapreduce의 입력으로 이미지 집합을 전달합니다.

나는 이것에 대해 어떻게해야하는지 궁금합니다. 입력 양식을 어떻게 구성해야합니까? 하나의 매퍼 또는 감속기에서 하나의 객체 (및 그 이미지 = 1000)를 완전히 처리하고 싶습니다. 예 : 첫 번째 매퍼의 첫 번째 개체, 두 번째 매퍼의 두 번째 개체 등

내 마음에 오는 접근 방식 중 일부는 다음과 같습니다. 1. 각 개체에 대해 디렉터리를 만들고 그 모든 이미지를 배치합니다. 그런 다음 tar, 디렉토리를 압축하면 단일 매퍼에 하나의 입력으로 사용됩니다.

  1. 위에서 언급 한 것과 같은 일을하지만 파일을 압축합니다 (압축하지 마십시오). InputFormat 인터페이스를 구현하고 "isSplittable()"을 false로 만듭니다.

  2. 각 개체에 대한 시퀀스 파일을 만듭니다. Sequensfile은 각 객체 이미지에 대한 키 - 값 쌍을 포함합니다. 여기서는 mapfile을 단지 매퍼 하나에 줄 것을 MapReduce에 지시하는 방법을 모르겠습니다. 여기

+0

또 하나의 옵션은 다음과 같습니다 3. 각 개체에 대해 sequencefile를 만듭니다. Sequensfile은 각 객체 이미지에 대한 키 - 값 쌍을 포함합니다. 여기서는 mapfile을 단지 매퍼 하나에 줄 것을 MapReduce에 지시하는 방법을 모르겠습니다. – sunillp

답변

0

나는 sequencefile 한 매핑 프로그램을 제공하는 맵리 듀스에게하는 방법을 잘 모르겠습니다.

FileInputFormat#isSplitable은 모든 파일 입력 형식에 대한 귀하의 친구입니다. SequenceFileInputFormat는 FileInputFormat를 상속합니다. 하둡

+0

내 파일 크기가 10MB라고 작은 경우 (HDFS 블록 크기보다 작음)이 방법은 분할 가능() 작업입니다. 이 경우에도 각 파일을 하나의 매퍼로 처리하고 매퍼가 여러 파일을 처리하지 못하도록하고 싶습니다 (파일 분할 중 하나가 분할 될 가능성이 있기 때문에 예 : SplitSize = HDFS Size = 64MB이면 한 매퍼가 각각 10MB의 파일 6 개와 7 번째 파일의 일부를 얻을 수 있으며, 7 번째 파일의 다른 포트는 다른 매퍼로 갈 수 있습니다. isSplitable() 도움이 여기에 있습니까? – sunillp

+0

파일/hdfs 크기에 관계없이 각 매퍼는 [CombineFileInputFormat] (http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapreduce/)을 제외하고는 단일 파일의 데이터 만 처리합니다. lib/input/CombineFileInputFormat.html)이 사용됩니다. [Hadoop - The Definitive Guide] (http://shop.oreilly.com/product/0636920010388.do) 책을 사기를 제안합니다. –

+0

의심의 여지를 보내 주셔서 감사합니다. 나는 하둡 책을 확실히 살 것이다. 하나 더 작은 질문. 각 5MB를 처리하기 위해 100 개의 파일이있는 디렉토리가 있다고 가정합니다. 사용할 수있는 매퍼 슬롯이 20 개 밖에 없다는 것을 알고 있습니다 (내 프로그램은 단순화 된 매퍼 만 사용한다고 가정). 그런 다음 20 개의 매퍼에서 100 개의 파일을 예약하려면 5 개의 파일이 한 매퍼의 프로세스인지 또는 hadoop MR이이 스케쥴링 파트를 처리하는지 확인하고 100 개의 파일이 모두 20 개의 매퍼를 사용하여 처리되는지 확인해야합니다. . – sunillp

-1

이미지 처리 맵리 듀스를 HIPI 사용 :

Hipi

는 하둡 이미지 처리 인터페이스입니다. 이렇게하면 Hadoops Distributes File System (HDFS) 및 Mapreduce를 사용하여 대량의 이미지를 처리 ​​할 수있는 일련의 도구와 Inputformat이 제공됩니다. 연루

STPES : hipi 전체 공정에서

2 개 부분으로 분류 될 수있다.

1) 모든 이미지를 대량 파일 (HIPI 이미지 번들)로 변환.

2) HIPI의 이미지 입력 ​​형식을 사용하여 생성 된 대량 이미지 이미지를 처리합니다. 컬부 (culler 클래스) HIPI 낮은 명확성 화상 또는 결함

문제를 걸러 사용이다

내 대량의 화상 처리 시나리오를 시뮬레이션하기 위해, I는 동일한 화상의 복수의 사본을 작성하는 Java 프로그램을 사용 하나의 디렉토리에 다른 이름으로. HIPI 유틸리티를 사용하여 모든 이미지를 대량 파일 (HIPI의 HIP 파일)로 변환했습니다.

모든 이미지가 대량 파일에 있는지 확인하려면 역 프로세스 (변환 된 HIP 파일을 여러 이미지로 변환)를 수행했습니다. 또한 동일한 작업을 수행하는 또 다른 유틸리티가 있습니다. 그러나 나는 모든 이미지를 다시 얻지 못했고, HIPI를 사용하면 일부 이미지가 손실된다는 것을 알게되었습니다.

HIPI를 사용하여 POC를 진행할 수 없었으며 mapreduce를 사용하여 대량 이미지를 처리 ​​할 새 프레임 워크를 만들려고했습니다.

NEW 이미지 프로세싱 프레임 워크 : 여러 맵을 산란을 방지하기 위해

가 (파일 당 각) 우리가 HIPI가하는 등해야, 즉 하나의 번들 파일에 모든 이미지를 변환 할 수있다.

이 번들 파일은 map-reduce의 입력으로 제공됩니다. 이미지 입력 ​​형식은 번들 파일을 구문 분석하고 각 이미지에 해당하는 Buffered Image Object를 작성합니다.

이미지 입력 ​​형식-중요 CLASSES :

이미지 컴 :

은 하나의 번들 파일에 여러 이미지를 병합합니다.

ImageInputFormat :

반환 ImageRecordRreader 및 관리 분할

ImageRecordReader

: 각 분할을 읽고 관리 할 수 ​​있습니다. 각 분할 시작 부분에 대한 파일 포인터의 초기 탐색을 수행하십시오. nextKeyValue() 메서드는 분할에서 각 Image를 읽고 BufferedImage로 변환합니다. BufferedImageWritable :

지도 축소의 키 값 클래스는 쓰기 가능한 직렬화 가능 유형이어야하므로 BufferedImage를지도 메소드의 값으로 직접 저장할 수 없습니다. 이것은, BufferedImage를 보관 유지하는 래퍼 클래스입니다.

BufferedImageWritable { BufferedImage img;

  @Override 
      public void readFields(DataInput arg0) throws IOException { 
      } 

     @Override 
      public void write(DataOutput arg0) throws IOException { 
      } 

      @Override 
      public int compareTo(byte[] o) { 
       return 0; 
      } 

} readFiled (구현되지

), 쓰기() 나는 그나마 내 시나리오 이후은 compareTo() 메소드는 다시 HDFS에 마법사를 저장할.

HDFS (지도 또는 축소)의 이미지를 다시 작성하려면 이러한 모든 방법을 구현해야 할 수 있습니다. write()에서 대량 파일을 생성하는 동안 이미지를 작성하는 것처럼 이미지를 저장하는 논리를 작성해야 할 수도 있습니다. readFiled()는 write()의 반대 논리를 포함해야합니다. compareTo()는 map-reduce에서이 이미지를 키로 사용하지 않기 때문에 구현할 필요가 없다. (compareTo()는 map-reduce의 정렬면에서 호출된다.)

이미지를 BufferedImages (이미지 처리를위한 일반적인 Java 클래스)로 가져 오는 중이므로 대부분의 작업을 쉽게 수행 할 수 있습니다. 그러나 HIPI의 경우 이미지는 Hipi의 FloatImage 클래스와 같이지도의 값에서 사용할 수 있으며 그 위에 조작을 수행하는 데 어려움을 느낄 수 있습니다.

이 사용자 지정 입력 형식과 OpenCV를 사용하여 facedetection 프로그램을 성공적으로 구현했습니다.

내가 같은를 개발하는 데 사용되는 코드는 GitHub의

곧 공유됩니다

http://worldofbigdata-inaction.blogspot.in/2017/02/processing-images-in-hadoop-using.html

관련 문제