Java MapReduce编程

Java MapReduce编程,java,mapreduce,photo,Java,Mapreduce,Photo,我已经在java上完成了这段代码,它收集关于照片的各种信息,并将结果提取到文本文件中。 我想把这个程序转换成MapReduce模型的函数。 我是MapReduce编程的新手。任何帮助都将不胜感激!! 多谢各位 import java.io.*; import java.util.*; import java.net.*; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException

我已经在java上完成了这段代码,它收集关于照片的各种信息,并将结果提取到文本文件中。 我想把这个程序转换成MapReduce模型的函数。 我是MapReduce编程的新手。任何帮助都将不胜感激!! 多谢各位

import java.io.*;
import java.util.*;
import java.net.*;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.aetrion.flickr.people.User;
import com.aetrion.flickr.photos.Photo;
import com.aetrion.flickr.photos.PhotoList;
import com.aetrion.flickr.photos.PhotosInterface;
import com.aetrion.flickr.photos.SearchParameters;
import com.aetrion.flickr.photosets.PhotosetsInterface;
import com.aetrion.flickr.test.TestInterface;
import com.aetrion.flickr.people.PeopleInterface;
import com.aetrion.flickr.groups.*;
import com.aetrion.flickr.groups.pools.*;


import com.aetrion.flickr.*;

public class example2{

public example2() {



}

/**
* @param args
* @throws FlickrException
* @throws SAXException
* @throws IOException
* @throws ParserConfigurationException
*/

@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, SAXException, FlickrException, ParserConfigurationException { // TODO Auto-generated method stub

FileWriter out = new FileWriter("photos.txt");

//Set api key
String key="apikey";
String svr="www.flickr.com";
REST rest=new REST();
rest.setHost(svr);

//initialize Flickr object with key and rest
Flickr flickr=new Flickr(key,rest);
Flickr.debugStream=false;

//initialize SearchParameter object, this object stores the search keyword
SearchParameters searchParams=new SearchParameters();
searchParams.setSort(SearchParameters.INTERESTINGNESS_DESC);
searchParams.setGroupId("group_id");

//Initialize PhotosInterface object
PhotosInterface photosInterface=flickr.getPhotosInterface();
//Execute search with entered tags
PhotoList photoList=photosInterface.search(searchParams,500,1);

if(photoList!=null){
//Get search result and check the size of photo result
for(int i=0;i<photoList.size();i++){
//get photo object
Photo photo=(Photo)photoList.get(i);

System.out.print(photo.getId()+"\t");
out.write(photo.getId()+"\t");

System.out.print(photo.getOwner().getId()+"\t");
out.write(photo.getOwner().getId()+"\t");

Photo photo1=photosInterface.getPhoto(photo.getId());


if(photo1.getGeoData() != null ){
System.out.print("latitute="+photo1.getGeoData().getLatitude()+"\t");
out.write(photo1.getGeoData().getLatitude()+"\t");

System.out.print("longitude="+photo1.getGeoData().getLongitude()+"\t");
out.write(photo1.getGeoData().getLongitude()+"\t");
}
else {System.out.print(photo1.getGeoData()+"\t");
out.write(photo1.getGeoData()+"\t\t"+photo1.getGeoData());}
System.out.println("");
out.write("\n");



}
out.close();
}
}}
import java.io.*;
导入java.util.*;
导入java.net。*;
导入javax.xml.parsers.parserConfiguration异常;
导入org.xml.sax.SAXException;
导入com.aetrion.flickr.people.User;
导入com.aetrion.flickr.photos.Photo;
导入com.aetrion.flickr.photos.PhotoList;
导入com.aetrion.flickr.photos.photoInterface;
导入com.aetrion.flickr.photos.SearchParameters;
导入com.aetrion.flickr.photosets.PhotosetsInterface;
导入com.aetrion.flickr.test.TestInterface;
导入com.aetrion.flickr.people.PeopleInterface;
导入com.aetrion.flickr.groups.*;
导入com.aetrion.flickr.groups.pools.*;
导入com.aetrion.flickr.*;
公共课示例2{
公共示例2(){
}
/**
*@param args
*@flickrepception
*@SAXException
*@抛出异常
*@throws-ParserConfigurationException
*/
@抑制警告(“弃用”)
publicstaticvoidmain(String[]args)抛出IOException、SAXException、FlickrException、ParserConfigurationException{//TODO自动生成的方法存根
FileWriter out=新的FileWriter(“photos.txt”);
//设置api密钥
String key=“apikey”;
String svr=“www.flickr.com”;
REST=新REST();
rest.setHost(svr);
//使用键和rest初始化Flickr对象
Flickr Flickr=新Flickr(键,其余);
Flickr.debugStream=false;
//初始化SearchParameter对象,此对象存储搜索关键字
SearchParameters searchParams=新的SearchParameters();
searchParams.setSort(SearchParameters.INTERESTINGNESS_DESC);
searchParams.setGroupId(“组id”);
//初始化接口对象
photoInterface photoInterface=flickr.getphotoInterface();
//使用输入的标记执行搜索
PhotoList PhotoList=photoInterface.search(searchParams,500,1);
如果(照片列表!=null){
//获取搜索结果并检查照片结果的大小

for(int i=0;i我不确定这是否是Hadoop的一个好用例,除非您有大量的搜索结果要处理,并且处理占整个程序的很大一部分。搜索本身不能并行执行:只有for循环中的处理

如果您想在Hadoop中并行处理一个搜索,首先必须在Hadoop**之外执行搜索,并将结果输出到文本文件——例如ID列表。然后,编写一个映射器,获取ID,获取照片,并执行当前在for循环中执行的处理,使用获取的属性发送字符串tes(您当前正在打印到
System.out
)。Hadoop将针对结果列表中的每个ID分别运行此映射程序

我认为这是不值得的,除非您计划进行其他处理。请考虑以下替代方案:

  • 使用map reduce并行执行许多不同的搜索。您的程序基本上是不变的——它只在map函数中运行,而不是在main()中运行或者,您的搜索可以在映射器中进行,并发出结果,您的处理可以在reducer中进行。您的输入将是搜索词列表

  • 忘记map reduce,只需使用线程池并行运行处理。查看
    java.util.concurrent
    中的各种
    执行器


**另一种让整个过程在Hadoop“内部”运行的方法是在map函数中运行搜索,一个接一个地发送结果。使用一个包含一行文本的输入文件——一个伪值——这样你的映射器只运行一次。然后用一个减速机而不是映射器来获取图像


更新

如果要搜索一组不同的组ID,那么可以使用第一种“替代”方法

如您所建议的,使用组ID和API键作为输入。在每行上放置一个,由选项卡或其他易于解析的内容分隔。如果希望它们在不同的映射程序中运行,您还必须将它们拆分为不同的文件。如果您只有与节点一样多的组ID,您可能只希望在每个文件中放置一行.Hadoop作业使用
TextInputFormat
。带有组ID和API键的行将是值--使用
value.toString().split(“\t”)
将其分为两部分

然后,在映射器中运行整个搜索。对于每个结果,使用
上下文。write(key,value)
(或
输出。collect(key,value)
,具体取决于您的版本)将照片ID作为键,将属性作为值的字符串写入。这两个结果都必须转换为Hadoop的
文本
对象

我不打算给出这方面的完整代码——只需修改Hadoop应该很容易。唯一真正的区别是:

  • 使用
    job.setOutputValueClass(Text)
    ,并更改其在 映射器类签名:

    public static class Map
        extends Mapper<LongWritable, Text, Text, Text> {
    
    为此:

    job.setMapperClass(Map.class);
    job.setNumReduceTasks(0);
    

如果您对如何使其发挥作用有任何具体问题,请随时提问。不过,请先进行一些研究。

我不同意Tim Yates的回答。您的搜索可以很好地进行平行化。 我的做法如下:

  • 实现一个映射器,它将把搜索查询的一块作为输入(你必须自己将它们分块,因为这些东西不是SequenceFile),然后执行查询操作并将结果写入文件系统。键是ID,值是附加信息
  • 实现一个reduce,它可以对数据进行任何处理(第一步的输出)
  • 我已经用YouTube API实现了这一点,所以它的并行性很好。但是你必须注意配额限制。你可以
    job.setMapperClass(Map.class);
    job.setNumReduceTasks(0);