1. 集群规范


    Hadoop运行在商业硬件上。一般Hadoop使用多核CPU和多磁盘,以充分利用硬件的性能。


    Hadoop的部分代码需要在Unix环境下执行,故它不适宜在非Unix平台上供生产用



2. 在初期,可以构建一个大约10个节点的小集群,并持续扩充。


    对几十个节点的小集群来说,在一台master机器上运行namenode和jobtracker。当HDFS集群和文件数不断增长时,namenode和jobtracker要放在不同的机器中。SecondaryNameNode最好运行在单独的机器。


    运行NameNode的机器一般是64位硬件,以避免32位架构下Java堆的3GB内存限制。



3. 网络拓扑


    3.1 Hadoop集群架构包含两级网络拓扑。各机架装配30~40个服务器,共享一个1GB的交换机。各机架的交换机又通过上行链路与一个核心交换机或路由器互联。此架构的特点:同一机架内部节点间的总宽带要远高于不同机架间节点的带宽。


    3.2 让Hadoop系统知道网络拓扑状态,可以提高Hadoop的最佳性能。如果集群只包含一个机架,就不需要进行配置。


           对于多机架的集群来说,如果Hadoop知道节点和机架之间的映射关系,那么,Hadoop将MapReduce任务分配到各个节点,会倾向于执行机架内的数据传输,而非跨机架数据传输,HDFS会更智能地放置副本replica,以取得性能和灵活性的平衡。


    3.3 节点和机架的网络位置location以树的形式表示。


           NameNode用网络位置确定在哪里放置块的复本。


           JobTracker用网络位置查找最近的复本,作为map任务的输入,并调度到TaskTracker上运行。


    3.4 Hadoop用Java接口DNSToSwitchMapping记录节点地址和网络位置之间的映射关系。


    3.5 对大多数安装来说,只需要使用默认的ScriptBasedMapping实现即可。


           它运行用户定义的脚本来描述映射关系。脚本的存放路径由属性topology.script.file.name控制。


          参考Hadoop wiki的例子: http://wiki.apache.org/hadoop/topology_rack_awareness_scripts



4. 集群的构建和安装


    4.1 安装方式:Apache Hadoop分发包;RPM和Debian包的CDH。


          自动安装:Red Hat Linux的Kickstart或Debian的Fully Automatic Installation。


    4.2 配置管理:Hadoop集群的每个节点各自保存一系列文件,管理员做这些配置文件的同步。


                              Hadoop用rsync,dsh,pdsh等工具进行同步。


    4.3 机器类:为不同机器类分别维护一套配置文件。需要用外部工具,如Chef, Puppet,cfengine和bcfg2等。


    4.4 同步配置是很大的问题,必须用控制管理工具管理集群。



5. 控制脚本


    5.1 内置脚本:运行指令,启动和终止守护进程,在bin目录。


    5.2 conf目录下有masters和slavers两个文件。


           masters记录要运行SecondaryNameNode的所有机器。


           slaves记录运行DataNode和TaskTracker所有机器。


           这两个文件之在NameNode和JobTracker上的控制脚本使用这些文件,不需要分发到整个集群。


    5.3 用户不不需要指定masters文件中哪台机器正在运行NameNode和JobTracker,该操作由运行脚本的机器决定。


           在masters文件中指定这些机器会导致在这些机器上运行一个SecondaryNameNode。


    5.4 start-dfs.sh脚本启动集群中所有的HDFS守护进程,该脚本运行时会在同一个机器上运行NameNode,步骤如下:


           在本地机器上启动一个NameNode;


           在slaves文件中记录的各机器上启动一个DataNode;


           在masters文件中的各机器上启动一个SecondaryNameNode;


    5.5 start-dfs.sh,启动集群中所有MapReduce守护进程:


           在本地机器上启动一个JobTracker;


           在slaves文件中每台机器上启动TaskTracker;


     5.6 stop-dfs.sh和stop-mapred.sh能终止相关启动脚本启动的守护进程,它们调用hadoop-daemon.sh脚本启动和终止Hadoop守护进程。



6. 主节点场景


    6.1 主节点守护进程包括NameNode,SecondaryNameNode,JobTracker。


           如果集群是有几十个节点的小型集群,可以将三个守护进程放到单独的一台机器上。


           如果是大型集群,这些守护进程要分别运行在不同的机器上。


    6.2 NameNode在内存中保存整个命令空间的所有文件和块元数据,内存需求很大。


           SecondaryNameNode在大多数时间空闲,但在创建检查时的内存需求与主NameNode差不多。


           故,如果文件系统包含大量文件,单台机器的物理内存无法同时运行NameNode和SecondaryNameNode。


    6.3 在NameNode机器上运行HDFS控制脚本。masters文件包含SecondaryNameNode的地址。


           在JobTracker机器上运行MapReduce控制脚本。


           当NameNode和JobTracker运行在不同节点上,集群中每个节点将运行一个DataNode和一个TaskTracker,以使slaves文件同步。



7. 环境设置


    环境变量在hadoop-env.sh文件中设置。


    HADOOP_HEAPSIZE参数控制每个守护进程的内存分配,默认是1GB内存。


    TaskTracker启动独立的子JVM来运行Map和Reduce任务。


    mapred.tasktracker.map.tasks.maximum属性控制一个TaskTracker能同时运行最多多少个map任务,默认值是2个任务。


    mapred.tasktracker.reduce.tasks.maximum属性控制一个TaskTracer能同时运行最多多少个reduce任务,默认值是2个任务。


    mapred.child.java.opts属性决定每个子JVM的内存量,默认值是-Xmx200m,每个任务分配200M内存。


    Ganglia可以监控集群的内存使用情况。



8. 系统日志文件


    8.1 Hadoop的系统日志文件在$HADOOP_INSTALL/logs目录。


          hadoop-env.sh中的HADOOP_LOG_DIR可以修改这个环境变量。


    8.2 .log是log4j记录。.out记录表准输出和标准错误日志。



9. SSH设置


    Hadoop控制脚本能够将配置文件分发到集群中的所有节点,用rsync工具。



10. Hadoop守护进程属性


    


11. 创建用户帐号


    " hadoop fs -mkdir /user/username"


    " hadoop fs -chown username:username /user/username"



12. hadoop的安全性



13. 用基准测试程序测试Hadoop集群


    13.1 运行基准测试程序,测试Hadoop集群是否正常,并衡量性能。


硬盘故障是新系统最常见的硬件故障。


    13.3 Hadoop基准测试程序:    


             " hadoop jar $HADOOP_INSTALL/hadoop-1.1.2-test.jar"


             如果不指定参数,大多数基准测试程序都会显示具体用法,示例如下


             " hadoop jar $HADOOP_INSTALL/hadoop-1.1.2.jar TestDFSIO"


    13.4 测试HDFS的I/O性能


       写10个文件,每个文件大小是1000M,


       " brian@brian-laptop:~/usr/hadoop/hadoop-1.1.2$ ./bin/hadoop jar hadoop-test-1.1.2.jar TestDFSIO -write -nrFile 10 -fileSize 1000"


       测试结果在log里,


       "cat TestDFSIO_results.log


       文件被写到io_data目录下的/benchmarks/TestDFSIO子目录。


       测试读操作,要读的文件必须已经存在:



       "brian@brian-laptop:~/usr/hadoop/hadoop-1.1.2$ ./bin/hadoop jar hadoop-test-1.1.2.jar TestDFSIO -read -nrFile 10 -fileSize 1000 "


        测试结束,删除临时文件:


        "brian@brian-laptop:~/usr/hadoop/hadoop-1.1.2$ ./bin/hadoop jar hadoop-test-1.1.2.jar TestDFSIO -clean"


    13.5 用Sort测试MapReduce


        产生随机数据:"brian@brian-laptop:~/usr/hadoop/hadoop-1.1.2$ ./bin/hadoop jar hadoop-examples-1.1.2.jar randomwriter random-data"


        sort排序:"brian@brian-laptop:~/usr/hadoop/hadoop-1.1.2$ ./bin/hadoop jar hadoop-examples-1.1.2.jar sort random-data sorted-data"


        验证:"brian@brian-laptop:~/usr/hadoop/hadoop-1.1.2$ ./bin/hadoop jar hadoop-examples-1.1.2.jar testmapredsort -sortInput random-data -sortOutput sorted-data"


        这个测试很慢,运行要谨慎,读写硬盘很多,损硬盘。




14. 在amazon的云端可以安装Hadoop