Hadoop 笔记(map/reduce&hdfs)

hadoop 基础:

hadoop的核心是应该算是map/reduce和hdfs,相当于我们要处理一个大数据的任务(并且前提是我们只采用普通的PC服务器),那么完成这个任务我们至少做两件事情,一件是有一个环境能够存储这个大数据(即hdfs),另外一件就是有一个并发的环境处理这些大数据(即map/reduce)。

  • map/reduce计算模型:map/reduce理解为一个分布式计算框架,它由JobTracker和TaskTracker两类任务组成,其中JobTracker是整个hadoop集群唯一。map/reduce的计算分为三步:hdfs 存储:hdfs是一个
    • map:输入<key,value>,输出<key,value>
    • Hadoop框架将map输出的<key,value>,按照相同的key,整合成<key,(list of value)>
    • reduce:输入<key,(list of value)>,输出<key,value>
  • hdfs是一个分布式的文件系统,在hdfs中具备三个概念:
    • 块(block):抽象的逻辑存储单元,默认是64M,与通常操作系统的文件系统一致;
    • NameNode:一个存放文件元数据的节点,并管理实际的数据存储单元DataNode;该关键节点会采用两种方式提升可靠性,一个是备份NameNode节点上的元数据至其他存储介质,另外一种是增加Secondary NameNode,同步NameNode的镜像。
    • DataNode:实际存放数据块的节点;

        hdfs的数据读写流程如下:

    • 读数据:
      1. 调用客户端FileSystem的open()操作;
      2. FileSystem通过RPC协议向NameNode获取块数据信息,并返回一个InputStream的输入流对象;
      3. 调用InputStream的read()方法,连接相应的DataNode获取数据;
      4. 当完成读取时,调用InputStream的close()关闭连接;
    • 写数据:
      1. 调用客户端FileSystem的create()操作;
      2. FileSystem通过RPC协议在NameNode的命名空间里创建一个新文件;(无数据)
      3. FileSystem判断验证创建文件成功后,返回FSDataOutputStream给客户端;
      4. 当向文件中写入数据时,FSDataOutputStream将文件分包并放入内部队列;该文件数据会被写入多个DataNode;
      5. 写入完成返回成功后,关闭通道;

hadoop 安装:

记录hadoop windows下单机环境搭建的注意点,参考的博客是:http://blog.csdn.net/ruby97/article/details/7423088,真心觉得不错!

  • ssh免密码登陆:输入 ssh-keygen -t rsa
  • start-all.sh后datanode自己起不来,我自己用的是手动启动:hadoop-deamon.sh start datanode

备注:当dataNode没有起来时,文件依然是可以创建的,但没有内容(这也从另外一面印证了NameNode和DataNode的关系)。读写时可能出现错误:“could only be replicated to 0 nodes, instead of 1“。当然在分布式配置下,有可能由于端口等问题未能连接至dataNode。

  • eclipse下开发环境配置,就是将hadoop下的plugin拷贝到eclipse下即可。在map/reduce的视图中可以增加一个New Hadoop Location,相当于是一个eclipse中的hadoop客户端,根据hadoop中的端口配置成功后,可以在eclipse的project explore里看见DFS location,里面有hdfs上的文件。
  • map/reduce的java应用开发,主要就是完成map/reduce这两类接口,以wordCount为例:

 

public class WordCount {

  public static class TokenizerMapper 
       extends Mapper<Object, Text, Text, IntWritable>{
    
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
      
    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }
  
  public static class IntSumReducer 
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, 
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

 

 

 

posted @ 2013-04-30 18:15  Fredric_2013  阅读(274)  评论(0编辑  收藏  举报