文章列表
 
2011-06-16 19:56

mapred.child.java.opts

在Ubuntu10.04里又开了两个同样VirtualBox,三个结点的集群。想减小虚拟机的内存,便将mapred.child.java.opts减小:

<property>
  <name>mapred.child.java.opts</name>
  <value>
    -Xmx50M
  </value>
</property>

没想到出现以下问题:

11/06/16 16:46:23 INFO mapred.JobClient: Task Id : attempt_201106161627_0002_m_000016_0, Status : FAILED
java.io.IOException: Task

 
2011-06-10 13:29

搞清楚 hadoop jar xxxx.jar 执行的流程: jar文件是如何分发的

JobClient(不一定是hadoop集群的节点)利用bin/hadoop脚本运行jar包,以hadoop-0.20.2-examples.jar为例子:
 
2011-06-07 20:11

hdfs的数据是以block为单位存储的,所以了解block的结构对理解hdfs的工作机制非常重要。

先来看一下Block类,它含有三个成员:blockId,numBytes和generationStamp。numBytes即block的大小,而另外两个分别是什么呢?blockId是block的标识符,可以从block文件名中看到,例如${hadoop.tmp.dir}/dfs/data/current/blk_826540629399449945,这一串数字就是blockId。同目录下另一个meta文件,如blk_826540629399449945_1017.meta,1017即是generationStamp。从Block类本身可以看到,generationStamp在compare、equals等操作上

 
2011-06-07 15:54

上文分析了客户端提交写数据的請求过程,本文研究DataNode对此請求的处理。先看一下DataNode启动的过程,见startDataNode方法:

1. 它与NameNode通信,注册自己的信息,基于RPC通信机制和DatanodeProtocol协议。

2. 创建DataXceiverServer,通过建立ServerSocket,与Client和其它DataNode进行读写数据。

3. 创建一个http server,用来提供网页浏览状态。

4. 创建一个IPC server,用来接受Client(基于ClientDatanodeProtocol)和其它DataNode(基于InterDatanodeProtocol)的請求。注意InterDatanod

 
2011-05-28 22:42
上篇分析完创建文件的过程,并没有涉及到DataNode的操作,結果是客户端得到了一个FSDataOutputStream,可以继而通过它进行写数据。因此本文顺着这个线索继续分析hdfs的写操作。

FSDataOutputStream在DataOutputStream的基础上增加了记录当前位置和同步的功能,相当于对它进行了包装。而DataOutputStream是java.io的类,它本质上也是一个包装类,提供了对基本数据类型的写操作(注意这里要理解Java对IO的Decorator设计模式[1],使用包装来提供额外功能)。从这两个类我们都只能看到“额外功能”,看不出最基本的write是怎么工作的
 
2011-05-25 21:36

了解了底层的通信机制,接下来就看看服务端是如何处理这些請求,即NameNode与DataNode是如何协同工作的。一个文件系统的功能大致分为“增删查改”,那我们就从功能入手,把两种结点联系起来分析。本文就从“增”开始,即创建文件。万事开头难,第一道分析遇到的困难最多,慢慢来吧。

上一篇讲到DFSClient与NameNode通信,传递create請求。跳过通信的过程,假设现在开始调用NameNode的create方法:

  public void create(String src, FsPermission masked, String clientName,
    

 
2011-05-21 21:11

本文从Server类的角度来观察HDFS的通信细节。同Client类一样,Server类也是一个抽象意义的类,具体的功能由具体的类来提供,比如NameNode,DataNode等。HDFS中存在两个Server类,即Server与RPC.Server,后者在前者的基础上增加了与RPC有关的方法,如call方法将收到的請求转化为本地的调用。以下除特殊说明,均指前者Server抽象类。

一般创建一个Server后,通过调用其start方法来启动(参见NameNode的initialize方法)。这个start方法如下:
  public synchronized void start() throws IOException {
 

 
2011-05-21 14:05


上篇分析到,客户端的請求,通过代理传递给了Client类的call方法,它将与服务器端进行通信,并取得請求的結果。本文将继续深入下去,探究底层的通信细节。

首先看一下这个call方法:

  public Writable call(Writable param, InetSocketAddress addr,
             

 
2011-05-20 21:04

前言
这几天在读HDFS代码,从自认为最难的通信部分开始读起,即各存储结点是如何协调工作的。遇到了不少困难,可之前既然放出了豪言,只能硬着头皮读下去了。这也是写博客的好处,因为感觉存在着外界的监督。


总的来说,HDFS的分布式是基于RPC(远程过程调用)通信的,同时用到了多线程。在读代码的时候,不得不学习了一下Java相关的内容,如Socket,Thread等。

 
2011-05-18 16:44

       第一次接触hadoop是在大三上学期,acm结束的时候,参加了一个数据库实验室的项目。当时只是跑了跑简单的HelloWorld,连集群都没试搭过。没想到以后的研究方向又牵扯到hadoop,便趁闲暇之余先学习源码,为以后铺好路。


       其实整个hadoop的框架并不高深,无非是MapReduce+HDFS,如下图所示。但是其中涉及了大量的复杂细节,以保证一个庞大系统的可用、高

 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

回复fzu_wzc1989:呵呵 谢谢~
 

赞!
 

回复紫彤萧悠:呵呵
 

我居然没注意到他QQ ID 就叫 "寒水远山.".. 我土了 -_-!
 

水寒剑...
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu