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