gpt4 book ai didi

java - MapReduce编程

转载 作者:行者123 更新时间:2023-11-30 11:53:52 24 4
gpt4 key购买 nike

我在 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();
}
}}

最佳答案

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

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

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

  • 使用 map-reduce 并行执行大量不同的搜索。您的程序基本上没有变化——它只是在 map 函数内运行,而不是在 main() 循环内运行。或者您的搜索可能发生在映射器中,发出结果,而您的处理可能发生在缩减器中。您的输入将是搜索词列表。

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


** 另一种让整个事情在 Hadoop“内部”运行的 hackish 方法是在 map 函数内部运行搜索,一个一个地发出结果。使用具有一行文本的输入文件——一个虚拟值——这样你的映射器只运行一次。然后在 reducer 而不是 mapper 中获取图像。


更新:

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

按照您的建议,使用组 ID 和 API key 作为输入。每行放一个,用制表符或您可以轻松解析的内容分隔。如果您希望它们在不同的映射器中运行,您还必须将它们分成不同的文件。如果您只有与节点一样多的组 ID,您可能只想在每个文件中放一行。将 TextInputFormat 用于您的 Hadoop 作业。带有组 ID 和 API key 的行将是 ——使用 value.toString().split("\t") 将其分成两部分.

然后,在映射器中运行整个搜索。对于每个结果,使用 context.write(key, value)(或 output.collect(key, value),取决于你的版本)写一个照片 ID 作为键和以您的属性作为值的字符串。这两个都必须转换为 Hadoop 的 Text 对象。

我不会为此提供批发代码——只需调整 Hadoop 应该很容易 MapReduce tutorial .唯一真正的区别:

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

    public static class Map
    extends Mapper<LongWritable, Text, Text, Text> {
  • 只需禁用 reducer 。取出 reducer 类,然后更改:

    job.setMapperClass(Map.class);
    job.setCombinerClass(Reduce.class);
    job.setReducerClass(Reduce.class);

    进入这个:

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

如果您对如何让它发挥作用有任何具体问题,请随时提出。不过,请务必先投入一些研究工作。

关于java - MapReduce编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6034203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com