花了一个周末完成了hadoop cluster in k8s应用,经过测试能正常跑通wordcount例子。在构建过程中虽然攻克了一个问题又遇一个问题,但是整个过程还是很享受,特别是最后跑通测试用例。
hadoop cluster 启动过程
hadoop 集群是怎么启动的呢,通过实验我发现:hadoop集群的启动是由master根据slaves文件里配置的node hostname通过ssh启动node上的NodeManager和DataNode服务来向master进行注册的。
通过jps命令可以查看
hadoop传统启动:
1. 启动前需要将所有node hostname写master的slaves文件
2. 启动前需要将所有node的hostname和ip 写入master的hosts,以便能够解析hostname
问题:
1.由于node是被动启动,slaves在master启动前需要确定,故集群不能动态扩展。
2.由于node的ip是无法获取到的,所以需要为每个node创建一个server,这样是不妥的。
思考:
创建node容器时如果能主动启动NodeManager和DataNode服务来向master进行注册,并向master的hosts文件中注册hostname和ip,这样就可以解决上面两个问题了。
解决思路:
1.在node容器写一个脚本,用来启动NodeManager和DataNode服务主动向master注册。
2.在master和node容器里各写一个监听服务,用来注册hostname和ip到hosts文件中,这样就不用为node创建server。
build hadoop Docker image
hadoop 配置文件
构建hadoop镜像需要配置4个核心配置文件和一个环境脚本:- hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///root/hdfs/namenode</value>
<description>NameNode directory for namespace and transaction logs storage.</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///root/hdfs/datanode</value>
<description>DataNode directory</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
#关闭hostname验证,不然可能无法注册到master,因为node的hostname可能还没有注册到master的hosts文件中
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
</