Hadoop集群的配置(二)
2.8 节点之间的免密码通信
1.什么是SSH
SSH是Secure Shell的缩写,由IETF的网络工作小组(Network Working Group)所制定;SSH为建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
从客户端来看,SSH提供两种级别的安全验证。
第一种级别 基于口令的安全验证
只要知道自己的帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
第二种级别 基于密匙的安全验证
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。
第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。
2.虚拟机拷贝节点
关闭当前CentOS,然后右击CentOS,选择“管理”-->“克隆”。
分别完成CentOS1、CentOS2、CentOS3的克隆工作,然后分别启动,重复2.2修改网络,用pietty登录,重复2.5的操作步骤更改相应主机名。
思考:node节点上的hosts和其他节点上的hosts一样吗?其中hosts文件还不算大,手工改也不会耗费太多时间,如果搭建的是几百个节点的集群呢?
我们可以登录node节点,把node节点上的hosts远程拷贝到其他节点。
使用scp命令: scp fromAdd toAdd 如图
注意其中出现了和我们第一次连接出现的提示,The authenticity of host 'node1 (192.168.10.101)' can't be established.我们确认连接方安全输入“yes”回车,输入node1密码连接成功,打开known_hosts我们可以看到生成的密钥:
以后再与node1不会再出现提示,因为在known_hosts已经加入了node1。但仍然需要输入密码,下面我们解决免密码登录的问题,读者先完成其他节点的hosts拷贝。
3.SSH免密码登录
在各节点上生成各自SSH秘钥对(命令中的rsa可以改成dsa,安全性更高),以node1为例。
在本机上生成authorized_keys,并验证能否对本机进行SSH无密码登陆。
所有节点都生成自己的authorized_keys之后,通过ssh-copy-id命令拷贝各自的公钥到node2节点(可以随机指定某个存在的节点),下面以node1节点为例,node1节点的公钥复制到node2节点中并加入到授权的key中,并验证是否配置成功。
以下是node2节点完成公钥复制后的文件。
由此可见所有节点都已经加入了[微软用户1] ,只要通过远程拷贝那么节点之间就可以实现免密码登录了。
只要在node2节点上执行:
scp /root/.ssh/authorized_keys node:/root/.ssh/;scp /root/.ssh/authorized_keys node1:/root/.ssh/;scp /root/.ssh/authorized_keys node3:/root/.ssh/
这样,就可以测试节点之间的登录了。
2.9 Hadoop启动和测试
1.格式化文件系统
在node节点上首先格式化namenode,执行命令hdfs namenode -format
在出现提示信息的最后第二行出现“Exiting with status 0”表示格式化成功,在UNIX中0表示成功,1表示失败,因此读者如果返回“Exiting with status 1”应该好好分析下前面的错误提示信息,一般来说是因为前面配置文件和hosts文件问题,修改后一定要同步到其他节点上,保持相同环境。
注意:有些读者以前用hadoop1.2或者更靠前的版本,会习惯用hadoop namenode -format格式化,这个时候会弹出一条WARNING信息,警告脚本已过时,但不会影响结果,因为Hadoop2.2版本对之前的Hadoop命令几乎都兼容。
注意:格式化前可以先自定义集群名字,如果未定义,系统将自动生成[微软用户2] 。
hadoop namenode -format -clusterid clustername
2.启动HDFS
使用start-dfs.sh开启hadoop dfs服务。
通过上面可以看到,我们启动了HDFS,node节点作为namenode,node1、node2、node3作为datanode,而node1也作为secondnamenode。
可以通过jps命令验证。Jps也是Windows上面的命令,表示开启的Java进程。当出现如下结果,表示验证成功。
同样,也可以通过网络验证HDFSs情况,在Lunix环境下,在Web浏览器中输入:http://node:50070,当然也可以在Windows环境中通过该URL访问,只需修改如下文件:
C:\Windows\System32\drivers\etc\hosts 添加192.168.10.100 node即可。
3.启动YARN集群
在主节点node[微软用户4] 上,执行命令:start-yarn.sh
通过输出可以看到namenode已经作为了resourcemanager,而其他三个节点分别作为nodemanager。通过命令tail -f /home/hadoop/hadoop2.2/logs/yarn-root-resourcemanager-node.out
可以查看启动日志。
或者查看启动对应进程情况: jps
其他节点可以通过类似命令验证,当然最方便的是输入地址:http://node:8088/。
NodeManager运行在从节点上,可以通过Web控制台查看对应节点的资源状态,如节点s1:http://node1:8042/
4.管理JobHistory Server
启动可以[微软用户5] JobHistory Server,能够通过Web控制台查看集群计算的任务的信息,执行如下命令: mr-jobhistory-daemon.sh start historyserver
通过访问http:// node:19888/查看任务执行历史信息。
终止JobHistory Server,执行如下命令:mr-jobhistory-daemon.sh stop historyserver
5.集群验证
可以使用Hadoop自带的WordCount例子进行验证。先在HDFS创建几个数据目录:
hadoop fs -mkdir -p /data/wordcount
hadoop fs -mkdir -p /output/
目录/data/wordcount用来存放Hadoop自带的WordCount例子的数据文件,运行这个MapReduce任务的结果输出到/output/wordcount目录中。
将本地文件上传到HDFS中:
hadoop fs -put /home/hadoop/hadoop2.2/etc/hadoop/*.xml /data/wordcount/
可以查看上传后的文件情况,执行如下命令:
hadoop fs -ls /data/wordcount
可以看到上传到HDFS中的文件。
下面,运行WordCount例子,执行如下命令:
hadoop jar /home/hadoop/hadoop2.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /data/wordcount /output/wordcount
通过http://node:8088/可以看到节点的运行情况。
运行结束后可以通过如下命令查看结果:
hadoop fs -cat /output/wordcount/part-r-00000 | head
以后我们掌握了相关api后可以自己编写切词统计程序。
6.需要了解的默认配置
在Hadoop 2.2.0中,YARN框架有很多默认的参数值,如果是在机器资源比较不足的情况下,需要修改这些默认值,来满足一些任务需要。
NodeManager和ResourceManager都是在yarn-site.xml文件中配置的,而运行MapReduce任务时,是在mapred-site.xml中进行配置的。
下面看一下相关的参数及其默认值情况:
3.动态管理节点(了解)
3.1动态增加和删除datanode
总的来说,正确的做法是优先通过配置文件,再在具体机器上进行相应进程的启动/停止操作。
1. 配置文件
- 在namenode下修改配置文件
- 在hadoop 0.x中上述配置存放在文件conf/hadoop-site.xml中;
- 在hadoop 2.x中变化很大,文件为conf/hdfs-site.xml中,参数名为:dfs.namenode.hosts和fs.namenode.hosts.exclude。
参数作用:
dfs.hosts:[微软用户6]
|
Names a file that contains a list of hosts that are permitted to connect to the namenode. The full pathname of the file must be specified. If the value is empty, all hosts are permitted. |
dfs.hosts.exclude:
|
Names a file that contains a list of hosts that are not permitted to connect to the namenode. The full pathname of the file must be specified. If the value is empty, no hosts are excluded |
用法说明:
修改hdfs-site.xml,添加:
<property>
<name>dfs.hosts</name>
<value>/home/hadoop/hadoop2.2/conf/datanode-allow.list</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/home/hadoop/hadoop2.2/conf/datanode-deny.list</value>
</property>
|
- 如果不需要允许列表,就不要创建对应项了。然后创建value所指定的文件,一行写一个主机名。
- 在新slave上进行相关配置。
- 在master上的slave列表加入该slave(非必须,方便以后重启cluster用)
- (若有)在datanode-allow.list中加入该slave
- 在slave上启动datanode进程:
- 运行:hadoop-daemon.sh start datanode
2. 添加
3. 删除
极端不建议直接在slave上通过:hadoop-daemon.sh stop datanode 命令关掉datanode,这会导致HDFS中出现missing block,具体步骤如下:
- 在master上修改datanode-deny.list,添加相应机器
- 在master上刷新节点配置情况:hadoop dfsadmin -refreshNodes
此时在Web UI上就可以看到该节点变为Decommissioning状态,过一会就变为Dead了。也可以通过:hadoop dfsadmin -report命令查看。 namenode.stale.datanode.interval
- 在slave上关闭datanode进程(非必须):
运行: hadoop-daemon.sh stop datanode
4. 重新加入各个删除的节点
- 在master的datanode-deny.list删除相应机器
- 在master上刷新节点配置情况:hadoop dfsadmin -refreshNodes
- 在slave上重启datanode进程:hadoop-daemon.sh start datanode
注意:如果之前没有关闭该slave上的datanode进程,需要先关闭再重新启动。
3.2. 动态修改TaskTracker
1. 配置文件
对于hadoop 2.x下[微软用户7] 在namenode下修改配置文件conf/mapred-site.xml。关键参数mapred.hosts和mapred.hosts.exclude。
参数作用:和datanode的对应项一样。
修改mapred-site.xml,添加参数:
<property>
<name>mapreduce.jobtracker.hosts.filename</name>
<value>/home/hadoop/hadoop2.2/conf/datanode-allow.list</value>
</property>
<property>
<name>mapreduce.jobtracker.hosts.exclude.filename</name>
<value>/home/hadoop/hadoop2.2/conf/datanode-deny.list</value>
</property>
|
然后创建value所指定的文件。一行写一个主机名。
2. 添加
- 在新slave上进行相关配置。
- 在master上的slave列表加入该slave(非必须,方便以后重启cluster用)
- 若有)[微软用户8] 在tasktracker-allow.list中加入该slave
- 在slave上启动tasktracker进程:
- 运行:hadoop-daemon.sh start tasktracker
注意:可以用jps命令查看机器上的java进程的pid和进程名。
3. 删除
不建议直接在slave上通过:hadoop-daemon.sh stop tasktracker命令关掉tasktracker,这会导致namenode认为这些机器暂时失联,在一个超时时间内(默认10min+30s)依然假设它们是正常的还会将任务发送给它们。
- 在master上修改tasktracker-deny.list,添加相应机器
- 在master上刷新节点配置情况:hadoop mradmin -refreshNodes
此时在Web UI上立即就可以看到Nodes的数量减少了,而Exclude Nodes的数量增加了。可以点进去具体查看。
- 在slave上关闭tasktracker进程(非必须):运行:hadoop-daemon.sh stop tasktracker
4. 重新加入各个删除的节点
- 在master的tasktracker-deny.list删除相应机器
- 在master上刷新节点配置情况:hadoop mradmin -refreshNodes
- 在slave上重启tasktracker进程:hadoop-daemon.sh start tasktracker
注意:如果之前没有关闭该slave上的tasktracker进程,需要先关闭再重新启动。
hadoop配置完