一、基本结构要求
hadoop有三种安装方式,本机、伪集群和集群方式,考虑到还是想在本机进行集群方式的程序运行,那么最佳方式只能是通过docker来模拟几台独立主机了。
三台主机,通过运行三个docker实例, 主机名和ip分别规划如下:
master : 172.18.0.3
slave1 : 172.18.0.4
slave2 : 172.18.0.5
其中master作为hadoop集群的主节点,同时有两个工作节点运行DataNode和NodeManager。在两个节点上存储hdfs数据和进行mapreduce运算。
另外,就是注意,主机名不能带下划线和中划线等特殊字符,否则会出现莫名其妙的错误。
二、软件相关需求:
在官网上hadoop已经有3.0,但考虑到2.x版本的相关学习资料较多,现存的项目多以2.x为主,可以通过先学习2.x 再升级学习3.x的方式,相关docker的安装和镜像中ubuntu系统安装的步骤就不再详细讲述,网路上相关的文章比较多了。
三、配置hadoop 2.10.0
1、运行容器实例:
主节点:
docker run -ti -h master --name master --network=mynetwork --ip=172.18.0.3 ubuntu:18.04 /bin/bash
slave1:
docker run -ti -h slave1 --name slave1 --network=mynetwork --ip=172.18.0.4 ubuntu:18.04 /bin/bash
slave2:
docker run -ti -h slave2 --name slave2--network=mynetwork --ip=172.18.0.5 ubuntu:18.04 /bin/bash
其中mynetwork工作组需要提前创建。
2、安装一些工具软件:
hadoop进程控制相关: ssh、rsync
配置文件编辑:vim
测试网路联通等工具包:net-tools、inetutils-ping
可以在主机内部通过apt install 依次来安装;
3、配置java环境和环境变量
jdk的配置就比较通俗了,不再陈述, 环境变量JAVA_HOME、CLASS_PATH和PATH等更新,可写入~/.bashrc中进行export,配置完成后source ~/.bashrc进行生效,可运行java命令进行验证。
在bashrc编辑的同时,可将开机启动sshd服务的配置同时写入,这样可保障ssh服务开机既可登录。免得每次手动启动,具体操作为:在.bashrc尾部加入 service ssh start
4、将hadoop文件拷贝至镜像内:
docker cp ~/下载/hadoop-2.10.0 master:/usr/local/
在.bashrc中继续增加:export HADOOP_HOME=/usr/local/hadoop-2.10.0
同时在PATH中增加$HADOOP_HOME/bin和$HADOOP_HOME/sbin(sbin中存放操作常用操作脚本)
5、修改hosts文件
修改几台主机的hosts文件,目的就是让几台主机能够通过主机名来互相知道具体的ip地址,当然也包括自己,这样上述我们在hadoop配置文件中写入的主机名才能真正得到正确执行。在master主机修改完毕后,将hosts文件拷贝至其他slave1、slave2。增加内容如下:
master 172.18.0.3
slave1 172.18.0.4
slave2 172.18.0.5
6、配置hadoop具体参数
整个 hadoop的配置文件都放置hadoop 根目录下etc/hadoop内,包含一系列.xml和.sh文件,这些就是我们要具体配置的目标。
a、配置hdfs的namenode的服务地址:修改/usr/local/hadoop-2.10.0/etc/hadoop/core-site.xml
增加节点, fs.defaultFS, 服务器配置为master,schame为hdfs, 如不指定端口、默认为8020,具体:
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
b、配置hdfs数据存储的副本个数:修改/usr/local/hadoop-2.10.0/etc/hadoop/hdfs-site.xml
增加dfs.replication节点,值为2,目前有两个slave,如果配置3,超过当前的slave数量,是无效的。
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
c、配置secondaryNamenode: 修改/usr/local/hadoop-2.10.0/etc/hadoop/hdfs-site.xml
增加dfs.namenode.secondary.http-address节点, 值为 master:50090,注意,虽然节点名字是配置的http监控的地址,但该配置项为多用,通过httpaddress的配置, 也同时让hadoop服务确认了secondaryNameNode的主机名字
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
d、配置将mapreduce提交给yarn进行管理,修改/usr/local/hadoop-2.10.0/etc/hadoop/mapred-site.xml
(将mapred-site.xml.template 重命名 mapred-site.xml)
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
e、配置NodeManager上运行的附加服务,将其设置为mapreduce_shuffle,注意不是mapreduce.shuffle;这样才可以在nodemanager节点上正常运行mapreduce计算;修改/usr/local/hadoop-2.10.0/etc/hadoop/yarn-site.xml
增加
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
f、设置resourceManager的主机名,这样让服务启动时能确定在哪台机器上启动ResourceManager;修改/usr/local/hadoop-2.10.0/etc/hadoop/yarn-site.xml
增加
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
注:此属性会在 yarn.resourcemanager.http-adress没有设置的情况下,替换其默认值的主机名,默认端口不变;一旦设定了yarn.resourcemanager.http-address,会覆盖hostname项目的主机值。所以除非有对各个子项目端口的特殊需求,否则按上述直接指定resourcemanager的hostname即可了。
g、修改hadoop-env.sh、mapred-env.sh、yarn-env.sh,修改套路一致,就是修改其中具体的export JAVA_HOME的具体路径;使其能找到java sdk的正确路径,注意不要以为只设定环境变量就无问题。
h、注册所有的slave工作节点, 供主节点在服务启动时知道都在哪些主机上启datanode服务或nodeManager服务;修改etc/hadoop/slaves文件,去掉local,按照 一行一个主机的形式写入,例如我们的内容既是:
slave1
slave2
通过以上abcdefgh几个步骤,hadoop本身的设定基本完成了,将hadoop-2.10.0拷贝至 slave1和slave2两个主机,目录位置要求一致,当然那两台主机也必须配置了java sdk,目录等保持和master一致。
五、配置ssh无密码登录
因为在master节点启动服务时,主节点会通过ssh的方式,按照我们在slaves文件中的主机列表,逐一ssh登录,并启动datanode或者NodeManager服务,所以我们最好配置ssh的自动无密码登录。具体方式如下:
a、在master节点执行 ssh-keygen -t rsa -P '' -t ~/.ssh/id_rsa,这样会在.ssh目录下同时生成id_rsa.pub公钥。
b、将公钥复制到需要信任的slave1、slave2和master自己;针对三个主机名分别执行:ssh-copy-id slave1 、ssh-copy-id slave2、ssh-copy-id master 将公钥加入。
c、因为docker的默认用户是root,并且没有密码,ssh默认是不允许root登录的,我们可以修三台镜像主机的/etc/ssh/sshd_config文件,将PermitRootLogin 设定为yes, 将PermitEmptyPasswords设定为yes;
d、为root增加密码 passwd root
如果ab两步不能执行,那么可在c、d两步骤完成后,可以在再次进行a、b两步骤。
e、配置修改完后,记得重启sshd服务 : service ssh restart
六、格式化namenode的数据
在运行hadoop服务前,需要在master上对namenode的数据存储进行格式化
在 master主机控制台上运行:hdfs namenode -format
七、以上配置完毕后,启动hadoop服务
在master主机的控制台输入start-all.sh
完成后可输入jps来判定服务是否正常,如正常有如下进程
NameNode
SecondaryNameNode
ResourceManager
登入slave1或者slave2,运行jps,如正常应有如下进程
DataNode
NodeManager
stop-all.sh 停止hadoop各项服务。
八、综述
hadoop的整个配置,并无太大难度,但确实是比较繁琐,涉及方面和配置项较多,容易遗漏某个细节导致运行出错。但如结合理解hadoop 服务在运行时的流程和分工, 其配置也就并无难度而易于理解了。
九、附表
FROM ubuntu:latest
COPY sources.list /etc/apt
COPY hadoop-2.10.1.tar.gz jdk1.8.0_191.zip scala-2.13.5.tgz sshd_config hadoop_conf/* /usr/local/
RUN apt update \
&& apt -y install unzip \
&& apt -y install ssh \
&& apt -y install rsync \
&& apt -y install vim \
&& apt -y install inetutils-ping \
&& apt -y install net-tools \
&& echo "service ssh start" >> /root/.bashrc \
&& tar xvf /usr/local/hadoop-2.10.1.tar.gz -C /usr/local \
&& tar xvf /usr/local/scala-2.13.5.tgz -C /usr/local \
&& unzip -d /usr/local /usr/local/jdk1.8.0_191.zip \
&& ln -s /usr/local/hadoop-2.10.1 /usr/local/hadoop \
&& ln -s /usr/local/jdk1.8.0_191 /usr/local/jdk \
&& ln -s /usr/local/scala-2.13.5 /usr/local/scala \
&& rm -f /usr/local/jdk1.8.0_191.zip \
&& rm -f /usr/local/hadoop-2.10.1.tar.gz \
&& rm -f /usr/local/scala-2.13.5.tgz \
&& mv /usr/local/*.sh /usr/local/hadoop/etc/hadoop/ \
&& mv /usr/local/*.xml /usr/local/hadoop/etc/hadoop/ \
&& mv /usr/local/slaves /usr/local/hadoop/etc/hadoop/ \
&& mv /usr/local/sshd_config /etc/ssh/ \
&& passwd -d root
ENV JAVA_HOME=/usr/local/jdk HADOOP_HOME=/usr/local/hadoop SCALA_HOME=/usr/local/scala
ENV PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin
CMD /bin/bash