4

큰 (100MB에서 500MB) 이미지를 많이 (1000-10000) 처리해야하는 프로젝트가 있습니다. 현재 수행중인 처리는 Imagemagick을 통해 수행 할 수 있지만 Amazon의 Elastic MapReduce 플랫폼 (실제로는 Hadoop을 사용한다고 생각합니다)에서이 처리를 실제로 수행하고 싶습니다.Amazon MapReduce/Hadoop을 사용하여 이미지 처리

모든 예제 중 텍스트 기반 입력 (Word Count Count가 10 억 회라는 것을 알았습니다)을 다룹니다. Hadoop에서는 파일 집합을 시작으로 각 파일에 대해 동일한 작업을 수행 한 다음 새 파일의 출력을 자체 파일로 작성하여 이러한 유형의 작업을 찾을 수 없습니다.

이 플랫폼으로이 작업을 수행 할 수 있으며 Bash를 사용하여 수행 할 수 있어야합니다. 나는 전체 Java 응용 프로그램 또는 뭔가를 만드는 문제로 갈 필요가 있다고 생각하지 않지만 잘못 될 수 있습니다.

나는 나에게 코드를 손에 누군가를 요구 아니지만, 사람이 예제 코드 또는 유사한 문제를 다루는 튜토리얼에 대한 링크가있는 경우, 그것은 훨씬

답변

9

작업에 몇 가지 문제가 있습니다.

Hadoop은 사용자가 본 것처럼 이미지를 기본적으로 처리하지 않습니다. 그러나 모든 파일 이름과 경로를 텍스트 파일로 내보내고 그것에 대한 Map 함수를 호출 할 수 있습니다. 따라서 로컬 디스크의 파일에서 ImageMagick을 호출하면 큰 문제가되지 않습니다.

데이터 지역을 어떻게 다룹니까?

HDFS의 파일에서 ImageMagick을 실행할 수 없습니다 (Java API 및 FUSE 마운트가 안정적이지 않음). 작업 예약을 예측할 수 없습니다. 예를 들어지도 작업은 이미지가없는 호스트로 예약 할 수 있습니다.

물론 하나의 기계와 하나의 작업 만 사용하면됩니다. 그러나 당신은 개선이 없습니다. 그러면 오버 헤드가 생길 것입니다.

또한 Java 작업에서 쉘 아웃 할 때 메모리 문제가 있습니다. 나는 그것에 대해 블로그 게시물을 만들었습니다 [1].

and should be able to be done using Bash 

다음 문제는 최소한지도 작업을 작성해야한다는 것입니다. 특정 경로와 기능으로 ImageMagick을 호출하려면 ProcessBuilder이 필요합니다. 그것은 자신의 파일의로 새 파일의 출력을 작성 후, 각 파일에 를 동일한 작업을 수행하고, 파일 세트로 을 시작 :

나는 하둡과 함께 이런 종류의 일에 대해 아무것도 찾을 수 없습니다.

추측하기? : D 하둡은이 일에 옳지 않습니다.

기본적으로 이미지를 수동으로 EC2의 여러 호스트로 분할하고 그 위에 bash 스크립트를 실행하는 것이 좋습니다. 스트레스가 적고 빠릅니다. 동일한 호스트에서 parallize하려면 각 코어에 대한 여러 폴더에서 파일을 분할하고 그 위에 bash 스크립트를 실행하십시오. 이것은 당신의 기계를 아주 잘 활용해야하고, 하둡보다 더 잘 할 수 있어야합니다.

[1] 오랫동안 하둡에 대규모 원격 감지 이미지를 처리하는 솔루션을 찾고 있었어요 http://codingwiththomas.blogspot.com/2011/07/dealing-with-outofmemoryerror-in-hadoop.html

+0

이미지에 대한 하둡은 주로 ginormous-sized-images가 아니라 ginormous-number-of-images가 아니라고 말하고 있습니까? –

+0

@aaaaaaa 전혀 아닙니다. Hadoop을 이미지 처리에 사용할 수는 있지만 그의 요구 사항은 Hadoop에 적합하지 않다고 생각합니다. 하지만 네가 옳다. 작은 크기의 큰 이미지가 큰 이미지의 작은 이미지보다 낫다.하지만 'CombineInputFormat'에서 많은 문제를 무시할 수는 있지만 여전히 상당한 오버 헤드가있다. –

0

당신은 CombineFileInputFormat 좀 걸릴 수 있습니다 ... 감사하겠습니다 Hadoop에서는 여러 파일을 암시 적으로 결합하여 파일을 기반으로 분할 할 수 있습니다.

하지만 100M-500M 이미지를 처리하는 방법에 대해서는 잘 모르겠지만 실제로는 크기가 작고 하둡 크기보다 큽니다. 어쩌면 하나의 이미지를 여러 부분으로 나눌 때 다른 접근법을 시도해 볼 수 있습니다.

어쨌든, 행운을 비네.

0

. 그리고 지금까지 아무것도 없어!

다음은 대규모 이미지를 Hadoop의 samller 이미지로 분할하는 오픈 소스 프로젝트입니다. 코드를주의 깊게 읽고 테스트했습니다. 그러나 나는 공연이 기대만큼 좋지 않다는 것을 발견했다. 어쨌든 도움이 될 수 있으며 문제에 대해 밝힐 수 있습니다.

프로젝트 츠 : http://www.cloudbook.net/directories/research-clouds/research-project.php?id=100057

행운을 빕니다!

+0

이것은 사실 링크 전용 답변입니다. 그러한 대답은 권장되지 않습니다. – dmckee

4

"Hadoop : The Definitive Guide"제 3 판에서 예제를 볼 수 있다고 생각합니다. 부록 C는 bash에서 (hdfs에서) 파일을 얻고, 압축을 풀고, 폴더를 만들고, 압축 해제 된 폴더에있는 파일에서 새 파일을 만든 다음, 그 파일을 다른 hdfs 위치에 저장하는 방법에 대해 설명합니다.

필자는이 스크립트를 직접 사용자 정의하여 초기 hadoop get이 필요한 입력 파일을 호스팅하는 웹 서버에 대한 말풍선임을 알았습니다. 모든 파일을 hdfs에 넣고 싶지 않았습니다. 파일이 이미 hdfs에 있으면 주석 처리 된 행을 대신 사용할 수 있습니다. hdfs get 또는 curl을 사용하면 파일을 로컬로 작업에 사용할 수 있습니다. 이것에는 많은 네트워크 오버 헤드가 있습니다.

축소 작업이 필요하지 않습니다.

입력 파일은 변환/다운로드 할 파일의 URL 목록입니다.

#!/usr/bin/env bash 

# NLineInputFormat gives a single line: key is offset, value is Isotropic Url 
read offset isofile 

# Retrieve file from Isotropic server to local disk 
echo "reporter:status:Retrieving $isofile" >&2 
target=`echo $isofile | awk '{split($0,a,"/");print a[5] a[6]}'` 
filename=$target.tar.bz2 
#$HADOOP_INSTALL/bin/hadoop fs -get $isofile ./$filename 
curl $isofile -o $filename 

# Un-bzip and un-tar the local file 
mkdir -p $target 
echo "reporter:status:Un-tarring $filename to $target" >&2 
tar jxf $filename -C $target 

# Take the file and do what you want with it. 
echo "reporter:status:Converting $target" >&2 
imagemagick convert .... $target/$filename $target.all 

# Put gzipped version into HDFS 
echo "reporter:status:Gzipping $target and putting in HDFS" >&2 
gzip -c $target.all | #$HADOOP_INSTALL/bin/hadoop fs -put - gz/$target.gz 

뉴욕 타임스는 4TB의 원시 이미지 데이터를 Hadoop을 사용하여 24 시간 동안 pdfs로 처리했습니다. 비슷한 접근 방식을 취한 것 같습니다 : http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/?scp=1&sq=self%20service%20prorated&st=cse. 그들은 자바 API를 사용했지만 나머지는 파일을 로컬에서 가져 와서 처리 한 다음 hdfs/sc3에 다시 집어 넣습니다.