您的位置:首页 > 运维架构

从零开始最短路径学习Hadoop之06----构建Hadoop集群

2013-07-31 15:17 369 查看
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.2 经验表明,硬盘故障是新系统最常见的硬件故障。

    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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: