2013年8月1日星期四

Using MarsEdit in mac for blogger

   It is fine to use MarsEdit in mac to write blog. I hingly recommend it.

2013年6月18日星期二

Hadoop 2.0 Datanode

Hadoop 2.0 Datanode 更加细分,将结构分为两个大部分。
DataNode相当于一个包装转发器,将请求发送给相应的处理单元。
DataNode 分为以下两部分:
1、与NameNode汇报的逻辑,block report,heartbeat
2、底层与文件系统交互的datanode 存储逻辑

其中第一部分的调用如下:
DataNode --->  BlockProolManager  --->  BPOfferService  --->   BPServiceActor
第二部分的调用如下:
DataNode  --->  FSDataSetImpl     --->     FSVolumeList(FSVolume)     --->     BLockPoolSlice

DataNode启动流程:
1、Main
2、StartDatanode
3、初始化BlockPoolManager
4、doRefreshNamenodes
     从配置里面读出相应的namespace id,namenode id(HA)
     初始化BPOfferService,每个namespace对应一个BPOfferService。
     初始化BPActor,每个namenode对应一个BPActor,即Active NameNode和StandbyNameNode各对应一个BPActor。
5、启动所有的BPActor。
     BPActor启动过程如下:
     (1)与NameNode进行handshake,首先建立BPActor对NameNode的RPC连接
     (2)获得namespace info,比较一下与现有的version,目前不会由于svn version不一致直接报错了
     (3)verifyAndSetNamespaceInfo,BPOfferService搞定后,调用DataNode的initBlockPool
     首先向BlockPoolManager注册该BPOfferService。在这个阶段,初始化FSDataSet,初始化存储层,初始化FSVolume,初始化FSVolumeList和ReplicaMap。启动DataBlockScanner和DirectoryScanner。向底层的文件交互FSVolume注册该BlockPool
     (4)handshake第二部,向NameNode注册,NameNode向其内部的DataNode注册该DataNode

     (5)设置BlockReport的细节

2013年5月22日星期三

ViewFS in hadoop

  ViewFS对于federation这种多namespace具有很好的操作性,省却了用户设置scheme这种繁琐的行为,十分方便。
     相关的类:
     INodeTree<T>     抽象类,实际的实现类需要实现getTargetFileSystem方法,泛型中的T是FileSystem类。
     内部实现有:
     root,根节点,挂载的根节点
  abstract static class INode<T> {
    final String fullPath; // the full path to the root
    public INode(String pathToNode, UserGroupInformation aUgi) {
      fullPath = pathToNode;
    }
  };
  类似于FSNameSystem中的INode。INode两个子类,一个是INodeDir,一个是INodeLink。
  static class MountPoint<T> {
    String src;
    INodeLink<T> target;
    MountPoint(String srcPath, INodeLink<T> mountLink) {
      src = srcPath;
      target = mountLink;
    }

  }
MountPoint实际上就是一个映射,mount name --->  filesystem+scheme。
     ViewFS继承自AbstractFileSystem,同RawLocalFileSystem和DistributedFileSystem一样。ViewFS中有一个INodeTree实例。其实INodeTree所有的挂载行为都是通过conf传递的,我们遇到的一个test case没有通过的问题,即TestFSMainOperationsLocalFileSystem无法跑过就是因为挂载点通过conf传递不正确,导致后续无法进行test。
     ViewFS用到的conf有:
     fs.viewfs.mounttable.default.link.$LINK     $PATH
     fs.viewfs.mounttable.homedir.$HOME     $HOME

     前者是挂载的位置,后者是挂载的home,出问题时候大多去检查一下conf,尤其是抛出ViewFS resolve无法找到文件的异常。

2013年5月21日星期二

使用NFS服务提高hadoop 可靠性


  众所周知 hadoop是一个单点系统,即所谓的spof,所以元数据的保护就是重中之重。目前元数据写两份,分别是本地的磁盘,远程的磁盘。还有一个secondary namenode做冷备。写到远程的磁盘就需要的是NFS服务了。
     NFS(Network File System, 网络文件系统)可以通过网络将分享不同主机(不同的OS)的目录——可以通过NFS挂载远程主机的目录, 访问该目录就像访问本地目录一样。
    首先下载NFS,网址是http://sourceforge.net/projects/nfs/files/ 选择合适的版本下载。到server和client机器安装。
    编辑server主机的文件/etc/exports /etc/hosts.allow /etc/hosts.deny三个文件。
    对/etc/exports  加入例如:/data0 10.39.2.121(rw,no_root_squash)
    其中/data0为对外开放的目录  后面是机器加权限,详细说明见 http://nfs.sourceforge.net/nfs-howto/ar01s03.html
    启动nfs server的服务:
/etc/init.d/portmap start  

/etc/init.d/nfslock start  

/etc/init.d/nfs start   
    在client端同样启动相同的服务。
    同时在client端挂在远程目录   sudo mount master:/data0/ /data1
   /data1是client端本地目录。

CDH4源码 eclipse导入问题

    CDH4向eclipse导入会出现一些问题,导致大面积的错误,看上去十分不爽,解决该问题的方法如下。
    错误一、An internal error occurred during: "Updating Maven Project". Unsupported IClasspathEntry kind=4
maven出现这个问题,
解决方法
     1.Open you terminal, go to your project folder and do “mvm clean eclipse:eclipse”
     2.Right-click on your project, select Maven -> Remove Maven Nature
    错误二、出现access的错误
eclipse     --->     preference     --->     Error/Warnnings     --->     Forbidden reference     设置为warnning
    如上图所示。


安装CDH4遇到的问题

安装CDH4.2.0遇到的一些问题,记录下来:

1、LZO的问题
由于CDH4中JobContext由class变为一个interface,所以直接使用原先的lzo的jar包会出现问题,替换为cloudera提供的一个rpm包中的lzo
2、codec配置
配置core-site.xml
 <property>
    <name>io.compression.codecs</name>    <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,com.hadoop.compression.lzo.LzopCodec</value>
  </property>
注意codec不要有空格
3、切换hadoop用户报错
报错为cannot set user id: Resource temporarily unavailable错误,说明资源不足,经检查是打开文件超出限制
解决方法:在32内核中除了设置/etc/security/limit.conf外,还需要设置/etc/security/limits.d/90-nproc.conf

hadoop 2.0 namenode启动流程1


HDFS层面
一、NameNode
包 包含有org.apache.hadoop.hdfs.server.namenode,org.apache.hadoop.hdfs.server.namenode.ha
NameNode多出的两个功能1、HA     2、Federation
HA:重要的HA
两个角色     AciveNameNode
                   StandbyNameNode
原先NameNode大部分功能都是由NameNodeRpcServer承担
但是只是细分了,管理功能还在NameNode类
NameNode启动流程:

NameNode启动后,都处于standby状态,需要手动去设置某个namenode为active状态。


启动后过程:
1、如果是standby节点,那么他的作用是两个,一个是tail qjm的editlog,一个是做checkpoint,替代seconday namenode的作用
这两个线程是standby最重要的作用,能够做到热备,当然热备还是有一定时间的差距。其他的rpc也都开启,所有的block report,heartbeat会发到两台机器上。
2、如果通过命令,手动调整某台机器变为Active Namenode,将editlog开启写模式,这个又是另一篇博客要写的