`
datamachine
  • 浏览: 157305 次
社区版块
存档分类
最新评论

Hadoop-- 海量文件的分布式计算处理方案

阅读更多
csdn的一个关于hadoop的分布式处理方案,存档。
原帖:http://blog.csdn.net/calvinxiu/article/details/1506112。

    Hadoop 是Google MapReduce的一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。就如同java程序员可以不考虑内存泄露一样, MapReduce的run-time系统会解决输入数据的分布细节,跨越机器集群的程序执行调度,处理机器的失效,并且管理机器之间的通讯请求。这样的模式允许程序员可以不需要有什么并发处理或者分布式系统的经验,就可以处理超大的分布式系统得资源。

    一、概论
    作为Hadoop程序员,他要做的事情就是:
    1、定义Mapper,处理输入的Key-Value对,输出中间结果。
    2、定义Reducer,可选,对中间结果进行规约,输出最终结果。
    3、定义InputFormat 和OutputFormat,可选,InputFormat将每行输入文件的内容转换为Java类供Mapper函数使用,不定义时默认为String。
    4、定义main函数,在里面定义一个Job并运行它。
  

    然后的事情就交给系统了。
    1.基本概念:Hadoop的HDFS实现了google的GFS文件系统,NameNode作为文件系统的负责调度运行在master,DataNode运行在每个机器上。同时Hadoop实现了Google的MapReduce,JobTracker作为MapReduce的总调度运行在master,TaskTracker则运行在每个机器上执行Task。

    2.main()函数,创建JobConf,定义Mapper,Reducer,Input/OutputFormat 和输入输出文件目录,最后把Job提交給JobTracker,等待Job结束。

    3.JobTracker,创建一个InputFormat的实例,调用它的getSplits()方法,把输入目录的文件拆分成FileSplist作为Mapper task 的输入,生成Mapper task加入Queue。

    4.TaskTracker 向 JobTracker索求下一个Map/Reduce。
     
     Mapper Task先从InputFormat创建RecordReader,循环读入FileSplits的内容生成Key与Value,传给Mapper函数,处理完后中间结果写成SequenceFile.
     Reducer Task 从运行Mapper的TaskTracker的Jetty上使用http协议获取所需的中间内容(33%),Sort/Merge后(66%),执行Reducer函数,最后按照OutputFormat写入结果目录。

      TaskTracker 每10秒向JobTracker报告一次运行情况,每完成一个Task10秒后,就会向JobTracker索求下一个Task。

      Nutch项目的全部数据处理都构建在Hadoop之上,详见Scalable Computing with Hadoop。


    二、程序员编写的代码
    我们做一个简单的分布式的Grep,简单对输入文件进行逐行的正则匹配,如果符合就将该行打印到输出文件。因为是简单的全部输出,所以我们只要写Mapper函数,不用写Reducer函数,也不用定义Input/Output Format。

package  demo.hadoop

public   class  HadoopGrep {

  public   static   class  RegMapper  extends  MapReduceBase  implements  Mapper {

   private  Pattern pattern;

   public   void  configure(JobConf job) {
   pattern  =  Pattern.compile(job.get( " mapred.mapper.regex " ));
  }

   public   void  map(WritableComparable key, Writable value, OutputCollector output, Reporter reporter)
     throws  IOException {
   String text  =  ((Text) value).toString();
   Matcher matcher  =  pattern.matcher(text);
    if  (matcher.find()) {
    output.collect(key, value);
   }
  }
}

  private  HadoopGrep () {
}  //  singleton

  public   static   void  main(String[] args)  throws  Exception {
 
  JobConf grepJob  =   new  JobConf(HadoopGrep. class );
  grepJob.setJobName( " grep-search " );
  grepJob.set( " mapred.mapper.regex " , args[ 2 ]);

  grepJob.setInputPath( new  Path(args[ 0 ]));
  grepJob.setOutputPath( new  Path(args[ 1 ]));
  grepJob.setMapperClass(RegMapper. class );
  grepJob.setReducerClass(IdentityReducer. class );
     
  JobClient.runJob(grepJob);
}
}
        RegMapper类的configure()函数接受由main函数传入的查找字符串,map() 函数进行正则匹配,key是行数,value是文件行的内容,符合的文件行放入中间结果。
        main()函数定义由命令行参数传入的输入输出目录和匹配字符串,Mapper函数为RegMapper类,Reduce函数是什么都不做,直接把中间结果输出到最终结果的的IdentityReducer类,运行Job。


        整个代码非常简单,丝毫没有分布式编程的任何细节。


       三.运行Hadoop程序
        Hadoop这方面的文档写得不全面,综合参考GettingStartedWithHadoop 与Nutch Hadoop Tutorial 两篇后,再碰了很多钉子才终于完整的跑起来了,记录如下:     

3.1 local运行模式

       完全不进行任何分布式计算,不动用任何namenode,datanode的做法,适合一开始做调试代码。
       解压hadoop,其中conf目录是配置目录,hadoop的配置文件在hadoop-default.xml,如果要修改配置,不是直接修改该文件,而是修改hadoop-site.xml,将该属性在hadoop-site.xml里重新赋值。
       hadoop-default.xml的默认配置已经是local运行,不用任何修改,配置目录里唯一必须修改的是hadoop-env.sh 里JAVA_HOME的位置。


       将编译好的HadoopGrep与RegMapper.class 放入hadoop/build/classes/demo/hadoop/目录 找一个比较大的log文件放入一个目录,然后运行

       hadoop / bin / hadoop demo.hadoop.HadoopGrep log文件所在目录 任意的输出目录 grep的字符串

     查看输出目录的结果,查看hadoop/logs/里的运行日志。 
     在重新运行前,先删掉输出目录。


3.2 单机集群运行模式

       现在来搞一下只有单机的集群.假设以完成3.1中的设置,本机名为hadoopserver
       第1步.    然后修改hadoop-site.xml ,加入如下内容:

< property >
   < name > fs.default.name </ name >
   < value > hadoopserver:9000 </ value >
</ property >
< property >
   < name > mapred.job.tracker </ name >
   < value > hadoopserver:9001 </ value >
</ property >
< property >
   < name > dfs.replication </ name >
   < value > 1 </ value >
</ property >

    从此就将运行从local文件系统转向了hadoop的hdfs系统,mapreduce的jobtracker也从local的进程内操作变成了分布式的任务系统,9000,9001两个端口号是随便选择的两个空余端口号。
 
  另外,如果你的/tmp目录不够大,可能还要修改hadoop.tmp.dir属性。


  第2步. 增加ssh不输入密码即可登陆。

    因为Hadoop需要不用输入密码的ssh来进行调度,在不su的状态下,在自己的home目录运行ssh-keygen -t rsa ,然后一路回车生成密钥,再进入.ssh目录,cp id_rsa.pub authorized_keys
    详细可以man 一下ssh, 此时执行ssh hadoopserver,不需要输入任何密码就能进入了。

  3.格式化namenode,执行
  bin/hadoop namenode -format

  4.启动Hadoop
     执行hadoop/bin/start-all.sh, 在本机启动namenode,datanode,jobtracker,tasktracker
 
  5.现在将待查找的log文件放入hdfs,。
     执行hadoop/bin/hadoop dfs 可以看到它所支持的文件操作指令。
     执行hadoop/bin/hadoop dfs put log文件所在目录 in ,则log文件目录已放入hdfs的/user/user-name/in 目录中

  6.现在来执行Grep操作
      hadoop/bin/hadoop demo.hadoop.HadoopGrep in out
      查看hadoop/logs/里的运行日志,重新执行前。运行hadoop/bin/hadoop dfs rmr out 删除out目录。

  7.运行hadoop/bin/stop-all.sh 结束

  3.3 集群运行模式
  假设已执行完3.2的配置,假设第2台机器名是hadoopserver2
  1.创建与hadoopserver同样的执行用户,将hadoop解压到相同的目录。

  2.同样的修改haoop-env.sh中的JAVA_HOME 及修改与3.2同样的hadoop-site.xml

  3. 将hadoopserver中的/home/username/.ssh/authorized_keys 复制到hadoopserver2,保证hadoopserver可以无需密码登陆hadoopserver2
     scp /home/username/.ssh/authorized_keys  username@hadoopserver2:/home/username/.ssh/authorized_keys

  4.修改hadoop-server的hadoop/conf/slaves文件, 增加集群的节点,将localhost改为
    hadoop-server
    hadoop-server2

  5.在hadoop-server执行hadoop/bin/start-all.sh
   将会在hadoop-server启动namenode,datanode,jobtracker,tasktracker
   在hadoop-server2启动datanode 和tasktracker
 
  6.现在来执行Grep操作
     hadoop/bin/hadoop demo.hadoop.HadoopGrep in out
    重新执行前,运行hadoop/bin/hadoop dfs rmr out 删除out目录

  7.运行hadoop/bin/stop-all.sh 结束。
  

四、效率
    经测试,Hadoop并不是万用灵丹,很取决于文件的大小和数量,处理的复杂度以及群集机器的数量,相连的带宽,当以上四者并不大时,hadoop优势并不明显。
    比如,不用hadoop用java写的简单grep函数处理100M的log文件只要4秒,用了hadoop local的方式运行是14秒,用了hadoop单机集群的方式是30秒,用双机集群10M网口的话更慢,慢到不好意思说出来的地步。

分享到:
评论

相关推荐

    Hadoop-海量文件的分布式计算处理方案.docx

    Hadoop 是Google MapReduce的一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。就如同java程序员可以 不考虑内存泄露一样, MapReduce的run-time系统...

    Hadoop--海量文件的分布式计算处理方案

    Hadoop 是GoogleMapReduce的一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。就如同java程序员可以不考虑内存泄露一样, MapReduce的run-time系统会...

    Hadoop权威指南 中文版

     通过mapreduce对这些数据集运行分布式计算  ·熟悉hadoop的数据和ilo构件,用于压缩、数据集成、序列化和持久处理  ·洞悉编~mapreduce实际应用时的常见陷阱和高级特性  ·设计、构建和管理一个专用的hadoop...

    Hadoop平台搭建 1.搭建 步骤文档 2.搭建时要用到的组件安装包

    搭建步骤: 准备硬件环境:确保服务器具备足够的内存、存储和网络带宽等...分布式计算:Hadoop可以分布式地处理大规模计算任务,提高计算效率和可靠性。 数据备份和容灾:Hadoop可以作为数据备份和容灾的解决方案,

    hadoop知识学习总结

    什么是hadoop: (1)Hadoop是一个开源的框架,可编写和...(2)Hadoop就是一个分布式计算的解决方案.Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

    中文版Hadoop权威指南

     通过mapreduce对这些数据集运行分布式计算  ·熟悉hadoop的数据和ilo构件,用于压缩、数据集成、序列化和持久处理  ·洞悉编~mapreduce实际应用时的常见陷阱和高级特性  ·设计、构建和管理一个专用的hadoop...

    Hadoop: The Definitive Guide

    通过MapReduce对这些数据集运行分布式计算 ·熟悉Hadoop的数据和IlO构件,用于压缩、数据集成、序列化和持久处理 ·洞悉编~MapReduce实际应用时的常见陷阱和高级特性 ·设计、构建和管理一个专用的Hadoop集群或在云...

    Hadoop 权威指南(中文版)

     通过mapreduce对这些数据集运行分布式计算  ·熟悉hadoop的数据和ilo构件,用于压缩、数据集成、序列化和持久处理  ·洞悉编~mapreduce实际应用时的常见陷阱和高级特性  ·设计、构建和管理一个专用的hadoop...

    论文研究-海量多维数据的存储与查询研究.pdf

    基于分布式计算系统Hadoop给出了新的海量多维数据的存储方法和查询方法。设计了HDFS上的列存储文件格式HCFile,基于HCFile给出了海量多维数据存储方案,该方案能够提高聚集计算效率,并有很好的可扩展性。同时,利用...

    java连接sqoop源码-LearningHadoop2:学习Hadoop2

    使用分布式计算模型开发Hadoop Hadoop分布式文件系统(HDFS) Hadoop 文件系统 跨越集群中的所有节点 在多台服务器上以 64M 块的形式存储数据 它是 Hadoop 的基础,提供可扩展且可靠的存储和容错。 数据分区 --&gt; 可...

    云计算大会演示PPT资料.zip

    百度王耀-百度的分布式文件系统之路 京东杨海明-京东云构建行业数据的连通 微软申元庆-构建智能云 精灵云晏东-负载均衡与微服务 AWS代闻-基于AWS的DevOps实践指南 多盟汪巍-移动广告平台的大数据实践 魅族莫涵宇-...

    Hive sql系统学习教程

    Hive SQL是基于Hadoop的数仓解决方案之一,它提供了类似于SQL的数据操作...总体而言,Hive SQL是面向数据仓库的一种数据操作语言,它使用类似于SQL的语法,同时又能够利用Hadoop的分布式计算能力对海量数据进行处理。

    HCIA-Big Data培训视频教程【共17章28集】.rar

    08 Spark基于内存的分布式计算 09 Flink流批一体分布式实时处理引擎 10 Flume海量日志聚合 11 Loader数据转换 12 Kafka分布式消息订阅系统 13 Hadoop基础技术 14 大数据上机实验二 15 分布式全文检索服务Elastic...

    大数据方案介绍.docx

    典型云计算平台架构 开源成熟的hadoop生态体系 ... 大数据分析平台 一、海量数据存储及扩展能力 基于分布式HDFS文件系统存储,HA高可用配置, 数据多副本,异地备份容灾能力,以最经济的硬件成本支持海量数据存储和扩容

    预测算法调研报告.doc

    计算平台 Hadoop, Spark等技术的快速发展为海量数据的存储与处理提供了技术支持Hadoop框架能够对大规 模数据进行分布式计算和存储,用户可以根据数据规模方便的扩展集群规模,扩展计算 能力。但是Hadoop在实际应用...

    大数据与人工智能.pptx

    P2P分布式架构 网格计算 2000s,社交网络的盛行,海量数据和日志 分布式编程模型MapReduce(2004年) 分布式系统,如Hadoop (2006), Spark (2012) , Hive (2013) NoSQL数据库流行,如Cassandra (2008) 2010s,随大数据...

    大数据分析平台.docx

    数据挖掘:支持运行于分布式文件系统和分布式计算平台之上的分布式数据挖掘算法,具体包括:逻辑斯特回归、朴素贝叶斯分类算法及其分布式实现;K均值、谱聚类算法及其分布式实现;潜在狄利克雷分配语义挖掘算法及其...

    数据分析方法与技术.pptx

    的S4) Spark(基于内存的分布式计算) 大数据技术: 数据采集:ETL工具 数据存取:关系数据库;NoSQL;SQL 基础架构支持:云存储;分布式文件系统 计算结果展现:云计算;标签云;关系图 数据分析方法与技术全文共...

    大数据时代银行业的机遇与挑战.docx

    (1)Hadoop Hadoop是效仿谷歌FileSystem和谷歌MapReduce而实现的一套海量数据分布式处理的开源软件框架,被广泛部署运用于雅虎、Facebook等互联网企业。目前,运行于雅虎的Hadoop集群被广泛用于雅虎广告、财经数据...

    大数据分析一体机.pptx

    存储 结构化数据: 海量数据的查询、统计、更新等操作效率低 非结构化数据 图片、视频、word、pdf、ppt等文件存储 不利于检索、查询和存储 半结构化数据 转换为结构化存储 按照非结构化存储 解决方案: Hadoop...

Global site tag (gtag.js) - Google Analytics