chenpengcong / blog

14 stars 3 forks source link

Hadoop集群搭建 #25

Open chenpengcong opened 5 years ago

chenpengcong commented 5 years ago

记录搭建完全分布式Hadoop集群需要做的一些工作,方便日后查看

系统和软件

这里我使用VirtualBox创建3台虚拟机来进行部署,虚拟机的网络配置:为每个虚拟机创建2个网卡,分别将网络连接方式设置为NAT和Host-only,使用NAT网络的网卡用来实现访问外网和访问其他虚拟机,使用Host-only网络的网卡用来实现宿主机与虚拟机之间的访问。还有需要注意的是防火墙可能会影响网络访问,我这里把防火墙都关闭了

一开始,我们需要修改系统的Hostname(默认为localhost.localdomain),分别将3台机器命名为bigdata1,bigdata2,bigdata3 $ hostnamectl set-hostname your-new-hostname

如果不修改的话最终在namenode的webui上只能看到一个节点的情况

不修改hostname的结果截图

修改hostname后即可正常显示

修改hostname的结果截图

至此,我3台机器的hostname与ip的对应情况为

192.168.56.102 bigdata1
192.168.56.101 bigdata2
192.168.56.103 bigdata3

我将使用bigdata1来启动namenode和resourcemanager

接下来修改每台机器的/etc/hosts文件,添加host与ip的映射

192.168.56.102 bigdata1
192.168.56.101 bigdata2
192.168.56.103 bigdata3

这样hadoop配置文件中关于host的配置就可以使用hostname(bigdata1/bigdata2/bigdata3)而不是ip了,以后ip变动了只需要修改hosts文件而不用修改hadoop配置

接下来创建hadoop用户(使用该用户启动hadoop程序,用以区分同一机器上的其他服务) $ adduser hadoop 并切换到hadoop用户

因为打算使用start(stop)-dfs.sh和start(stop)-yarn.sh来一次性启动(停止)所有节点的hadoop服务且该脚本依赖ssh来执行(停止)各个节点上的服务,所以需要为hadoop用户配置ssh,实现hadoop用户不用密码即可登陆bigdata1/bigdata2/bigdata3

首先生成RSA公私钥对: $ ssh-keygen -t rsa -f ~/.ssh/id_rsa,为安全起见,这里最好为密钥生成一个口令

接下来将公钥追加到登陆目标主机的~/.ssh/authorized_keys文件中:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@bigdata1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@bigdata2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@bigdata3

此时我们登陆bigdata1/2/3还是需要输入密钥id_rsa的口令,我们还需要使用ssh-agent来实现免口令登陆

eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa

这样hadoop在登陆时就不需要输入密钥的口令了

完成上面工作后,可以开始对hadoop的配置文件进行修改了

在~/.bashrc配置HADOOP_HOME环境变量

export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
export PATH=$HADOOP_HOME/bin:$PATH

在$HADOOP_HOME/etc/conf/hadoop-env.sh中配置JDK路径和pid文件路径

export JAVA_HOME=/home/hadoop/jdk1.8.0_201
export HADOOP_PID_DIR=/home/hadoop/.hadoop
export YARN_PID_DIR=/home/hadoop/.hadoop

hadoop的pid文件默认存放在/tmp目录,而/tmp目录一般会有定期清理策略,会造成这样一个问题:hadoop程序正常启动一段时间后,pid文件被删除了,此时运行stop-dfs.sh将无法向该进程发送信号从而结束进程,因为获取不到进程id

接下来将所有节点的配置文件都改成下述配置即可

$HADOOP_HOME/etc/conf/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://bigdata1:9000</value>
    </property>
</configuration>

$HADOOP_HOME/etc/conf/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.namenode.name.dir</name><!--供namenode存储永久性的文件系统元数据(编辑日志和文件系统映像),如果指定多目录,这些元数据会同时备份在所有指定目录 -->
        <value>/home/hadoop/data/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name><!--设置datanode存储数据块的目录列表(不是冗余备份),为了提高性能,最好分别为各个本地磁盘指定一个存储目录,这样一来数据块跨磁盘分布,针对不同数据块的读操作可以并发执行,取自权威指南10.3.3节-->
        <value>/home/hadoop/data/data</value>
    </property>
</configuration>

$HADOOP_HOME/etc/conf/yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>bigdata1</value>
    </property>
    <property>
        <name>yarn.nodemanager.log-dirs</name>
        <value>/home/hadoop/data/yarn/logs</value>
    </property>
    <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/home/hadoop/data/yarn/local</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
</configuration>

$HADOOP_HOME/etc/conf/mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

最后将作为slave节点的hostname添加bigdata1的$HADOOP_HOME/etc/hadoop/slaves文件,start(stop)-dfs.sh和start(stop)-yarn.sh脚本会读取该文件去各个slave节点启动(关闭)相应服务

bigdata1
bigdata2
bigdata3

到这里hadoop集群即可正常运行,更多配置可以参考Determining HDP Memory Configuration SettingsHow to Plan and Configure YARN and MapReduce 2 in HDP 2.0