[HADOOP] map-reduce에서 hdfs의 입력으로 여러 이미지 파일을 읽는 방법?
HADOOPmap-reduce에서 hdfs의 입력으로 여러 이미지 파일을 읽는 방법?
private static String[] testFiles = new String[] {"img01.JPG","img02.JPG","img03.JPG","img04.JPG","img06.JPG","img07.JPG","img05.JPG"};
// private static String testFilespath = "/home/student/Desktop/images";
private static String testFilespath ="hdfs://localhost:54310/user/root/images";
//private static String indexpath = "/home/student/Desktop/indexDemo";
private static String testExtensive="/home/student/Desktop/images";
public static class MapClass extends MapReduceBase
implements Mapper<Text, Text, Text, Text> {
private Text input_image = new Text();
private Text input_vector = new Text();
@Override
public void map(Text key, Text value,OutputCollector<Text, Text> output,Reporter reporter) throws IOException {
System.out.println("CorrelogramIndex Method:");
String featureString;
int MAXIMUM_DISTANCE = 16;
AutoColorCorrelogram.Mode mode = AutoColorCorrelogram.Mode.FullNeighbourhood;
for (String identifier : testFiles) {
try (FileInputStream fis = new FileInputStream(testFilespath + "/" + identifier)) {
//Document doc = builder.createDocument(fis, identifier);
//FileInputStream imageStream = new FileInputStream(testFilespath + "/" + identifier);
BufferedImage bimg = ImageIO.read(fis);
AutoColorCorrelogram vd = new AutoColorCorrelogram(MAXIMUM_DISTANCE, mode);
vd.extract(bimg);
featureString = vd.getStringRepresentation();
double[] bytearray=vd.getDoubleHistogram();
System.out.println("image: "+ identifier + " " + featureString );
}
System.out.println(" ------------- ");
input_image.set(identifier);
input_vector.set(featureString);
output.collect(input_image, input_vector);
}
}
}
public static class Reduce extends MapReduceBase
implements Reducer<Text, Text, Text, Text> {
@Override
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
String out_vector="";
while (values.hasNext()) {
out_vector.concat(values.next().toString());
}
output.collect(key, new Text(out_vector));
}
}
static int printUsage() {
System.out.println("image_mapreduce [-m <maps>] [-r <reduces>] <input> <output>");
ToolRunner.printGenericCommandUsage(System.out);
return -1;
}
@Override
public int run(String[] args) throws Exception {
JobConf conf = new JobConf(getConf(), image_mapreduce.class);
conf.setJobName("image_mapreduce");
// the keys are words (strings)
conf.setOutputKeyClass(Text.class);
// the values are counts (ints)
conf.setOutputValueClass(Text.class);
conf.setMapperClass(MapClass.class);
// conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
List<String> other_args = new ArrayList<String>();
for(int i=0; i < args.length; ++i) {
try {
if ("-m".equals(args[i])) {
conf.setNumMapTasks(Integer.parseInt(args[++i]));
} else if ("-r".equals(args[i])) {
conf.setNumReduceTasks(Integer.parseInt(args[++i]));
} else {
other_args.add(args[i]);
}
} catch (NumberFormatException except) {
System.out.println("ERROR: Integer expected instead of " + args[i]);
return printUsage();
} catch (ArrayIndexOutOfBoundsException except) {
System.out.println("ERROR: Required parameter missing from " +
args[i-1]);
return printUsage();
}
}
FileInputFormat.setInputPaths(conf, other_args.get(0));
//FileInputFormat.setInputPaths(conf,new Path("hdfs://localhost:54310/user/root/images"));
FileOutputFormat.setOutputPath(conf, new Path(other_args.get(1)));
JobClient.runJob(conf);
return 0;
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new image_mapreduce(), args);
System.exit(res);
}
}
`나는 여러 이미지 파일을 입력으로 받아서 hdfs에 저장하고 맵 기능에서 그 기능을 추출하는 프로그램을 작성 중이다. 어떻게 FileInputStream (일부 매개 변수)에서 이미지를 읽을 경로를 지정할 수 있습니까? 아니면 여러 이미지 파일을 읽을 수있는 방법이 있습니까?
내가하고 싶은 것은 : - 입력으로 여러 이미지 파일을 hdfs에서 가져옵니다. -지도 기능에서 피쳐를 추출합니다. - 반복적으로 감소시킵니다. 코드 또는 더 나은 방법으로 도와주세요.
해결법
-
==============================
1.HIPI 라이브러리를 사용하십시오. 이미지 모음을 ImageBundle에 저장합니다 (개별 이미지 파일을 HDFS에 저장하는 것이 더 효율적입니다). 그들은 몇 가지 예도 있습니다.
HIPI 라이브러리를 사용하십시오. 이미지 모음을 ImageBundle에 저장합니다 (개별 이미지 파일을 HDFS에 저장하는 것이 더 효율적입니다). 그들은 몇 가지 예도 있습니다.
코드에 관해서는 사용할 입력 및 출력 형식을 지정해야합니다. 현재 파일을 넘기는 현재 입력 형식은 없지만 FileInputFormat을 확장하고
쌍을 내보내는 RecordReader를 만들 수 있습니다. 여기서 키는 파일 이름이고 값은 이미지 파일의 바이트입니다. 사실 Hadoop - The Definitive Guide에는 정확한 입력 형식의 예가 있습니다.
-
==============================
2.MR 작업에 모든 이미지를 입력으로 보내려면 conf.setFileInputPath ()를 입력 디렉토리로 설정하면됩니다. 특정 폴더에 선택적 이미지를 보내려는 경우 conf.setFileInputPath ();를 설정할 때 여러 경로를 추가 할 수 있습니다.
MR 작업에 모든 이미지를 입력으로 보내려면 conf.setFileInputPath ()를 입력 디렉토리로 설정하면됩니다. 특정 폴더에 선택적 이미지를 보내려는 경우 conf.setFileInputPath ();를 설정할 때 여러 경로를 추가 할 수 있습니다.
한 가지 방법은 각 이미지에 대해 [1] 경로를 만드는 것입니다. 또는 모든 경로와 함께 쉼표로 구분 된 문자열로 설정하십시오. 다음 문서를 살펴보십시오.
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/FileInputFormat.html
그리고 Map 입력 형식을 Text, ByteArray로 설정해야합니다. 새 fileinputstream을 만드는 대신 ByteArray 입력에서 이미지 기능을 가져옵니다.
from https://stackoverflow.com/questions/10814534/how-to-read-multiple-image-files-as-input-from-hdfs-in-map-reduce by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] sc.textFile ()을 사용하여 스파크 할 로컬 파일로드 (0) | 2019.06.19 |
---|---|
[HADOOP] hbase를 선택하기 전에 무엇을 고려해야합니까? (0) | 2019.06.19 |
[HADOOP] Hadoop 2.x의 2 차 NameNode 사용 및 고 가용성 (0) | 2019.06.19 |
[HADOOP] 빈 문자열은 하이브에서 null로 처리되지 않습니다. (0) | 2019.06.19 |
[HADOOP] Hadoop 분산 캐시에서 파일 재사용 (0) | 2019.06.19 |