Hadoop The Definitive Guide 2nd读书笔记 – 第九章

1、Hadoop集群的机器最好是多核、多通道硬盘,但不要使用RAID。选用中档机器。例如8核、16GB内存、4×1TB硬盘。

2、集群可随着规模而不断扩充,当小集群时(10的数量级),namenode和jobtracker可以放在同一台机器上(同时保证有一份NFS远端的namenode备份)即可。再大就最好分别放在两台机器上。

3、Windows这么不靠谱的东西就不要用于生产环境了,生产环境最好用Linux,或者Unix。

4、Hadoop的网络拓扑结构分为:机架内Rack(在同一Switch内)、临机架(两层Switch)、同机房、不同机房等。Hadoop中,网络拓扑结构是很有用的信息,许多Hadoop的优化依赖于拓扑结构。

5、拓扑结构是用类似树的方式表示的,如/switch1/rack1和/switch1/rack2。
Hadoop会调用一个类似DNS的解析接口:

具体设置方法是配置一个文件,见:
http://wiki.apache.org/hadoop/topology_rack_awareness_scripts

6、安装有多种方式:直接从hadoop.apche.org下载包解压缩、用cloudera的deb或者rpm包。

7、安装流程
(1)安装Java虚拟机,最好用Oracle的吧,现在出Java7了,不知道是不是性能更好?
(2)创建单独的hadoop用户,设置好ssh免密码登录
(3)在hadoop用户下解压缩hadoop的tar.gz/tar.bz2。
(4)测试Hadoop集群,看看能不能跑起来。
(5)其他配置文件

8、配置文件
hadoop-env.sh 定义Hadoop运行的环境变量,如JVM内存,HADOOP_HOME位置等
core-site.xml 最核心的设置,如使用什么文件系统,JobTracker的IP和端口等。
hdfs-site.xml HDFS设置,namenode、sec-namenode、datanode等
mapred-site.xml Map/Reduce的设置
masters 纯文本文件,写master/namenode的hostname
slaves 运行datanode和tasktracker的结点
hadoop-metrics.properties 不懂,真的……
log4j.properties 配置Log4j的设置

9、Hadoop不会自动同步配置,因此,需要手工rsync,Hadoop也提供了相应的shell脚本。注意有时候,会出现不同批次的机器,他们由于配置相同而不能使用相同的配置(比如slots个数就不能一样)。这时,需要制定不同class的配置。

10、管理脚本
要使用管理脚本,必须指定正确的master/slaves文件。
start-dfs.sh 在所有机器上启动HDFS相关进程如namenode和datanode
start-mapred.sh 在master上启动Jobtracker,其他机器启动TaskTracker
上述两个脚本都间接调用了hadoop-daemon.sh,这也是一个很有用的工具

11、配置hadoop-env.sh中的环境变量。
(1)HADOOP_HEAPSIZE设置JVM的堆栈,默认是1000MB
这个1000,就是单独Java进程给的内存,比如namenode,再比如jobtracker
看一下所有内存需求。
mapred.tasktracker.map.tasks.maximum 一个node上最多运行map任务的个数,默认2
mapred.tasktracker.reduce.tasks.maximum 一个node上最多运行reduce任务的个数,默认2
每个任务给的内存由mapred.child.java.opts控制,默认是-Xmx200m
因此,默认配置下(namenode+datanode+2*map_task+2*reduce_task)=1000+1000+2*200+2*200=2800MB内存。
如果是8核的CPU,一般要给7个map任务和7个reduce任务,一共7600MB。

(2)Namenode等默认内存除了上面默认1000外,可以自己在opts里加-XmxabcdMB
HADOOP_NAMENODE_OPTS、HADOOP_SECONDARYNAMENODE_OPTS、HADOOP_DATANODE_OPTS等。

(3)Java的配置,就是JAVA_HOME的环境变量

(4)Hadoop的日志目录位置:HADOOP_LOG_DIR,默认是$HADOOP_INSTALL/logs。可以改成/var/log/hadoop
.log结尾的:默认的日志、rotated,且不会删除旧的,需要自己定期情理。
.out结尾:程序的stdout和stderr输出,一般很少。只有5个会被保留,重启程序时rotated。

(5)可以将StrictHostKeyChecking传给HADOOP_SSH_OPTS,用于不用输入yes那个。。

(6)可以开启自动rsync,不过不太靠谱。。毕竟不断的rsync是会消耗很大的。

12、HDFS的一些可能需要修改的配置:

fs.default.name 例如hdfs://hostname_namenode:port/
dfs.name.dir namenode的数据存在Local的哪里,可以指定多个目录。默认是/tmp/dfs/name。我喜欢{HADOOP_HOME}/var/dfs/name
dfs.data.dir datanode的数据存在哪里,可以指定多个目录,但不太推荐。默认是/tmp/dfs/name。我喜欢{HADOOP_HOME}/var/dfs/data

13、Map/Reduce中一些可能需要修改的配置:

mapred.job.tracker 指定JobTracker的IP和Port。
mapred.local.dir 指定map/reduce临时数据在本机的存放位置,和上面dfs.name.dir一样,默认也是在/tmp/mapred/local下的。建议{HADOOP_HOME}/var/mapred/local
mapred.system.dir 和上面的类似,建议{HADOOP_HOME}/var/mapred/system
mapred.tasktracker.map.tasks.maximum 最大map任务数量,建议(核-1)*2。
mapred.tasktracker.reduce.tasks.maximum 最大reduce任务数量,建议核-1。
mapred.child.java.opts 给每个task额外内存,默认-Xmx200m。

14、RPC的配置很多,建议除了fs.default.name,一般就不要改了。。

15、单独指定那些机器运行dfs,哪些mapreduce,而不是用slaves/master搞定。
dfs.hosts
mapred.hosts
dfs.hosts.exclude
mapred.hosts.exclude

16、Buffer大小:I/O的缓存默认是4KB,可以扩大,在core-site.xml中,改io.file.buffer.size到64KB(65,536)或者128KB。

17、HDFS block size:在hdfs-site.xml的dfs.block.size中,可以改成128MB

18、dfs.datanode.du.reserved:保留空间,可以设置。

19、回收站功能:再core-site.xml中设置fs.trash.interval。则超过这个时间后才删除。

20、Hadoop账户:主要是在HDFS上的账户。
其实默认第一次上传,指定./的时候,就创建好自己的家目录什么的了 。

21、Hadoop依赖Kerberos提供相关的安全、认证机制。

22、Hadoop内置了Benchmarks,用于测试I/O等性能,当然,这些BM也是map/reduce任务。

此外,还可以测试sort等。

23、Hadoop可以很方便的运行在云计算平台,比如Amazon EC2上。
Apache Whirr提供了可以方便将Hadoop运行在云计算平台上的工具。
http://incubator.apache.org/whirr/
目前支持Amazon S3和Rackspace!!

Leave a Reply

Your email address will not be published.