所有操作默认非root用户,本文中用 lz 用户。

环境:

软件 版本 备注
ubuntu 18.04  
openjdk 1.8.0_191 $JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
hadoop 2.7.7 $HADOOP_HOME=/usr/local/hadoop
(docker) 18.09.5  

节点:

主机 主机名 角色 IP
物理机 dblab-lz namenode 172.17.0.1
docker1 worker1 datanode 172.17.0.2
docker2 worker2 datanode 172.17.0.3
docker3 worker3 datanode 172.17.0.4
docker4 worker4 datanode 172.17.0.5

所有主机同时设置hosts:

$ sudo vim /etc/hosts

修改为:

172.17.0.1  dblab-lz
172.17.0.2  worker1
172.17.0.3  worker2
172.17.0.4  worker3
172.17.0.5  worker4

将dblab-lz的id_rsa.pub追加到所有5台主机中的~/.ssh/authorized_keys中去,这样各个节点可以互相免密ssh访问:

$ ssh-keygen -t rsa -C 'namenode'
$ cd ~/.ssh
$ cat ./id_rsa.pub > authorized_keys
$ scp ./id_rsa.pub > worker1:/home/lz/.ssh/authorized_keys
$ scp ./id_rsa.pub > worker2:/home/lz/.ssh/authorized_keys
$ scp ./id_rsa.pub > worker3:/home/lz/.ssh/authorized_keys
$ scp ./id_rsa.pub > worker4:/home/lz/.ssh/authorized_keys

在物理机上配置$HADOOP_HOME/etc/hadoop目录下的5个配置文件(若没有则新建),分别是:

slaves

worker1
worker2
worker3
worker4

core-site.xml

<configuration>
    <property>
        <!-- 设置默认文件系统为hdfs即分布式文件系统 -->
        <name>fs.defaultFS</name>
        <value>hdfs://Master:9000</value>
    </property>
    <property>
        <!-- 设置tmp文件夹为止,防止使用系统默认tmp文件夹而被清除 -->
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
</configuration>

hdfs-site.xml

<configuration>
    <property>
        <!-- 设置secondary namenode和namenode同在dblab-lz上 -->
        <name>dfs.namenode.secondary.http-address</name>
        <value>dblab-lz:50090</value>
    </property>
    <property>
        <!-- 设置文件备份数,4个datanode故设置为4 -->
        <name>dfs.replication</name>
        <value>4</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <property>
        <!-- 设置mr任务调度管理器为yarn -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>dblab-lz:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>dblab-lz:19888</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
    <property>
        <!-- 设置yarn资源管理器主机为dblab-lz(也即namenode) -->
        <name>yarn.resourcemanager.hostname</name>
        <value>dblab-lz</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

将配置文件分发到所有worker节点上:

$ scp -r /usr/local/hadoop/etc/hadoop/* worker1:/usr/local/hadoop/etc/hadoop
$ scp -r /usr/local/hadoop/etc/hadoop/* worker2:/usr/local/hadoop/etc/hadoop
$ scp -r /usr/local/hadoop/etc/hadoop/* worker3:/usr/local/hadoop/etc/hadoop
$ scp -r /usr/local/hadoop/etc/hadoop/* worker4:/usr/local/hadoop/etc/hadoop

在物理机上格式化namenode:

$ hdfs namenode -format

应该可以看到类似如下信息:

...
...
19/04/29 10:03:35 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.
...
...
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at dblab-lz/172.17.0.1
************************************************************/

启动hadoop:

$ start-dfs.sh
$ # 可在浏览器输入localhost:50070访问web页面

对应jps进程:

进程名 节点
NameNode namenode
SecondaryNameNode namenode
DataNode datanode

启动yarn:

$ start-yarn.sh

对应jps进程:

进程名 节点
NodeManager namenode
ResourceManager namenode
NodeManager datanode

启动JobHistoryServer

$ mr-jobhistory-daemon.sh start historyserver

对应jps进程:

进程名 节点
JobHistoryServer namenode

关闭JobHistoryServer:

$ mr-jobhistory-daemon.sh stop historyserver

关闭yarn:

$ stop-yarn.sh

关闭hdfs:

$ stop-dfs.sh