上篇为体验hadoop采用了伪分布模式配置,本篇为继续深究hadoop来大体把握具体实用中的分布式模式。本文实用VMware建了3个虚拟机运行ubuntu。分别为
namenode whuqin1 192.168.64.143
datanode whuqin2 192.168.64.144
datanode whuqin3 192.168.64.145
1.SSH(Secure Shell)
Hadoop启动后,Namenode是通过SSH来启动和停止各节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
1.a 每台机器都安装SSH
sudo apt-get install ssh
1.b namenode产生密钥对
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
在/home/whuqin1/.ssh/下生成id_dsa(私钥)、id_dsa.pub(公钥)。
补:RSA是一种公钥加密算法,RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。DSA也是一种公钥加密算法,安全性和RSA相似。ssh-keygen t dsa或ssh-keygen -t rsa都是可以的。
将公钥复制到authorized_keys,准备分发
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
1.c 给datanode分发公钥
scp ~/.ssh/authorized_keys whuqin@192.168.64.144:/home/whuqin/.ssh/ scp ~/.ssh/authorized_keys whuqin@192.168.64.145:/home/whuqin/.ssh/
补:SCP(secure Copy),linux文件传送命令,是ssh种的命令,用于在两台机子间传送或获取文件。如上,@后为目的机子ip及目的路径,@前为目的机子上的用户名。
补:hadoop集群上的每台机子要有一个相同的用户名,用于运行hadoop,为以后hadoop的配置及运行提供方便。至于是不是必须的,本人还不确定。请指教。本人在学习中由于没有使用同一用户名,等最后启动hadoop时出现下情况。要输入whuqin用户在两台机子的密码...
在datanode上更改authorized_keys权限(保证该文件只对所有者有读写权限)
chmod 644 ~/.ssh/authorized_keys
1.d 修改sshd服务,去除密码认证(更改/etc/ssh/sshd_config)
PasswordAuthentication no AuthorizedKeysFile .ssh/authorized_keys
2.配置hadoop
2.a 安装JDK,解压hadoop,配置环境变量(/etc/profile)。
// /etc/profile配置 JAVA_HOME=/home/whuqin/Downloads/jdk1.6.0_26 export JRE_HOME=/home/whuqin/Downloads/jdk1.6.0_26/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export HADOOP_INSTALL=/home/whuqin/Downloads/hadoop-0.20.2 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HADOOP_INSTALL/bin //hadoop-env.sh添加java配置 export JAVA_HOME=/home/whuqin/Downloads/jdk1.6.0_26
2.b 修改hadoop的master/slaves
master指定namenode,slaves指定datanodes
//master 192.168.64.143 //slaves 192.168.64.144 192.168.64.145
2.c 修改core-site,hdfs-site.xml,mapred-site.xml,给出典型配置如下:
<!-- core-site.xml --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://192.168.64.143</value> <final>true</final> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/whuqin/hadoopdir</value> </property> </configuration> <!-- hdfs-site.xml --> <configuration> <!-- 由于使用了hadoop.tmp.dir,一些属性使用了默认值 --> </configuration> <!-- mapred-site.xml --> <configuration> <property> <name>mapred.job.tracker</name> <!-- jobtracker机子的ip和端口 --> <value>jobtracker:8021</value> <final>true</final> </property> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>3</value> <final>true</final> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>3</value> <final>true</final> </property> <property> <name>mapred.child.java.opts</name> <value>-Xmx400m</value> <final>true</final> </property> </configuration>
补充:
core-site.xml部分属性解析:
fs.default.name, NameNode的URI, hdfs://主机ip:port, 决定了名称节点的RPC服务器地址和端口,默认端口为8020
hadoop.tmp.dir 用于辅助hdfs-site和mapred-site.xml中一些dir属性的默认设置
hdfs-site.xml部分属性解析:
dfs.name.dir,NameNode持久存储名字空间及事务日志的本地文件系统路径。当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。默认值是${hadoop.tmp.dir}/dfs/name
dfs.data.dir,DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。默认${hadoop.tmp.dir}/dfs/name
fs.checkpoint.dir,第二名称节点用来存储检查点的路径,逗号分隔。默认${hadoop.tmp.dir}/dfs/namesecondary
mapred-site.xml部分属性解析:
mapred.job.tracker,JobTracker的主机(或者IP)和端口
mapred.system.dir,Map/Reduce框架存储系统文件的HDFS路径,须从服务器和客户端上均可访问。默认${hadoop.tmp.dir}/mapred/system,但不是本地的!
mapred.local.dir,本地文件系统下逗号分割的路径列表,Map/Reduce临时数据存放的地方。多路径有助于利用磁盘i/o。默认${hadoop.tmp.dir}/mapred/local
mapred.tasktracker.{map|reduce}.tasks.maximum
某一TaskTracker上可运行的最大Map/Reduce任务数,这些任务将同时各自运行。 默认为2(2个map和2个reduce),可依据硬件情况更改。
在利用haoop.tmp.dir,一些属性的默认值代表的路径如下:
3.部署hadoop
在保证datanode的jdk安装路径一致、有一个相同用户名的情况下,可以将namenode上的hadoop直接传送到datanode上!
scp -r /home/whuqin/hadoop-0.20.2 whuqin@192.168.64.144:/home/whuqin/ scp -r /home/whuqin/hadoop-0.20.2 whuqin@192.168.64.145:/home/whuqin/
4.启动hadoop
hadoop的启动都是在namenode上操作的。
//格式化 hadoop namenode -format //启动namenode/datanode/jobtracker/tasktracker/secondarynode start-all.sh
当然也可以根据需要只启动部分进程
start-mapred.sh/stop-mapred.sh、start-dfs.sh/stop-dfs.sh等。它们都会参考slaves文件,对slave上的datanode,tasktracker进程进行操作。
补:namenode/datanode是从hdfs角度说的,jobtracker/tasktracker是从map/reduce角度说的。namenode和jobtracker可以不是同一台机子。
5.测试
hadoop fs -ls等命令使用下。
其他相关参考:http://blog.csdn.net/whuqin/article/details/6623534,http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html,《hadoop权威指南》
望指正!