Java MapReduce编程
我已经在java上完成了这段代码,它收集关于照片的各种信息,并将结果提取到文本文件中。 我想把这个程序转换成MapReduce模型的函数。 我是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
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);