这份爱 davichi:基于Hadoop的Map reduce编程(一) - 在水一方 - CSDN博客

来源:百度文库 编辑:九乡新闻网 时间:2024/04/17 02:50:37
翻译的一篇国外的关于hadoop mapreduce的文章,文章比较长,先翻译第一部分吧 翻译者:pconlin900
博客:http://pconline900.javaeye.com  Hadoop是apache的一个开源的map-reduce框架,MapReduce是一个并行计算模型,用来处理海量数据。模型思想来源于google的Jeffrey Dean 和 Sanjay Ghemawat,包括map() reduce()两个主要的功能。 这是一个很简单的类似于Hadoop的MapReduce应用例子,应用了mapreduce的基本思想,可以帮助理解hadoop的处理思想和技术,但注意,它没有使用hadoop框架。
例子的功能是创建一些字符串,然后统计这些字符串里面每个字符出现的次数,最后汇总得到总的字符出现次数。  Listing 1. 主程序
public class Main
{     public static void main(String[] args)
    {         MyMapReduce my = new MyMapReduce();
        my.init();     }
}  
Listing 2. MyMapReduce.java import java.util.*; public class MyMapReduce
{
List buckets = new ArrayList();
List intermediateresults = new ArrayList();
List values = new ArrayList(); public void init()
{
for(int i = 1; i<=30; i++)
{
values.add("http://pconline900.javaeye.com" + new Integer(i).toString());
}  System.out.println("**STEP 1 START**-> Running Conversion into Buckets**");
System.out.println();
List b = step1ConvertIntoBuckets(values,5);
        System.out.println("************STEP 1 COMPLETE*************");
        System.out.println();
        System.out.println();    System.out.println("**STEP 2 START**->Running **Map Function** concurrently for all        Buckets");
System.out.println();
List res = step2RunMapFunctionForAllBuckets(b);
System.out.println("************STEP 2 COMPLETE*************");         System.out.println();
        System.out.println();
System.out.println("**STEP 3 START**->Running **Reduce Function** for collating Intermediate Results and Printing Results");
System.out.println();
step3RunReduceFunctionForAllBuckets(res);
System.out.println("************STEP 3 COMPLETE*************");
                  System.out.println("************pconline900 翻译*************");
                  System.out.println("***********博客:http://pconline900.javaeye.com*************");
}
public List step1ConvertIntoBuckets(List list,int numberofbuckets)
{
int n = list.size();
int m = n / numberofbuckets;
int rem = n% numberofbuckets; int count = 0;
System.out.println("BUCKETS");
for(int j =1; j<= numberofbuckets; j++)
{
List temp = new ArrayList();
for(int i=1; i<= m; i++)
{ temp.add((String)values.get(count));
count++;
}
buckets.add(temp);
temp = new ArrayList();
}
if(rem != 0)
{
List temp = new ArrayList();
for(int i =1; i<=rem;i++)
{ temp.add((String)values.get(count));
count++;
}
buckets.add(temp);
}
        System.out.println();
System.out.println(buckets);
System.out.println();
return buckets; } public List step2RunMapFunctionForAllBuckets(List list)
{
for(int i=0; i< list.size(); i++)
{
List elementList = (ArrayList)list.get(i);
new StartThread(elementList).start();
}         try
        {
Thread.currentThread().sleep(1000);
}catch(Exception e)
{
}
return intermediateresults;
} public void step3RunReduceFunctionForAllBuckets(List list)
{
int sum =0;
for(int i=0; i< list.size(); i++)
{
//you can do some processing here, like finding max of all results etc
int t = Integer.parseInt((String)list.get(i));
sum += t;
}
System.out.println();
System.out.println("Total Count is "+ sum);
System.out.println(); } class StartThread extends Thread
{
private List tempList = new ArrayList();
public StartThread(List list)
{
tempList = list;
}
public void run()
{ for(int i=0; i< tempList.size();i++)
{
String str = (String)tempList.get(i); synchronized(this)
                     {
intermediateresults.add(new Integer(str.length()).toString());
}
}
} } }
init()方法创建了一些测试数据,作为测试数据。实际应用中会是海量数据处理。 step1ConvertIntoBuckets()方法将测试数据拆分到5个 bucket中,每个bucket是一个ArrayList(包含6个String数据)。bucket可以保存在内存,磁盘,或者集群中的其他节点; step2RunMapFunctionForAllBuckets()方法创建了5个线程(每个bucket一个),每个线程StartThread处理每个bucket并把处理结果放在intermediateresults这个arraylist中。 如果bucket分配给不同的节点处理,必须有一个master主控节点监控各个节点的计算,汇总各个节点的处理结果,若有节点失败,master必须能够分配计算任务给其他节点计算。\ step3RunReduceFunctionForAllBuckets()方法加载intermediateresults中间处理结果,并进行汇总处理,最后得到最终的计算结果。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/joliny/archive/2008/11/24/3360731.aspx
基于Hadoop的Map reduce编程(一) - 在水一方 - CSDN博客 USB有关的编程 - sanshao27的专栏 - CSDN博客 网页编程常用技巧 - happycyp的专栏 - CSDN博客 基于工作流技术的构件模型研究 - 基于整合的业务流程管理CI-BPM - CSDN博客 WINCE基于hive注册表的实现 - LoongEmbedded的专栏 - CSDN博客 基于统一IMS实现固定移动融合 - 疯牙@PG的专栏 - CSDN博客 简评游戏人工智能相关的中文书(上) - 赖勇浩的编程私伙局 - CSDN博客 简评游戏人工智能相关的中文书(下) - 赖勇浩的编程私伙局 - CSDN博客 使用记号的cvCopy - 一个爱编程的人专栏 - CSDN博客 Linux C 编程 实现彩色文字输出 - wesleyluo的专栏 - CSDN博客 [Python]循环语句中的 else 子句 - 赖勇浩的编程私伙局 - CSDN博客 Sql Server删除主键和重建主键 - 编程 - CSDN博客 小白学Linux之内核模块编程 - tiger-john - CSDN博客 游戏程序员成长 - 痞子龙3D编程 - CSDN博客 风雨20年:我所积累的20条编程经验 - Java 是用来喝的 - CSDN博客 如何在项目中研发 - cyberhong的专栏 - CSDN博客 【引用】佳人 .在水一方{组图} - 兰陵笑笑生的日志 - 网易博客 在水一方-- 散文朗诵FLASH - 山间溪流的日志 - 网易博客 纳税自查与企业所得税汇算清缴 - 在水一方的日志 - 网易博客 引用 古诗美人图…【唯美图文】 - 在水一方的日志 - 网易博客 基于 OAuth 安全协议的 Java 应用编程 -- 基于Socket的UDP和TCP编程介绍 基于VC++的OpenGL编程讲座之坐标变换 在水一方