更多
更多

Hadoop完全分布式搭建

准备工作

环境:

1
2
3
4
5
6
7
8
9
本机:macOS

虚拟机(VirtualBox):CentOS 6.9
复制三个CentOS
一个作为主节点(Master),两个从节点(Slave)
三台虚拟机器名分别为:master, slave1, slave2

Hadoop 2.7.3
JDK 1.8

Vim常用操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
esc    从编辑模式切换到命令模式
a 切换到编辑模式,在光标后插入
o 切换到编辑模式,在光标下一行插入

命令模式下:
u 撤销操作
G 跳至文件末尾
dd 删除光标那一行字符
ggdG 清空内容

:wq 保存退出
:q 退出
:q! 强制退出



配置虚拟机

  1. 安装虚拟机

    1. 下载并安装CentOS,我选择的 CentOS 6.9

    2. 配置Java

      1. 卸载自带的jdk
        • rpm -qa | grep jdk查看目前系统的jdk
        • 使用yum -y remove 名称 一个个卸载

      2. 安装 jdk

      3. 配置JAVA环境变量

        • cd/usr/目录下创建java文件夹,mkdir java
        • tar -zxvf 文件名解压到/usr/java/目录下
        • 将jdk的包名改为”jdk”,mv 包名 jdk
        • vim /etc/profile配置环境变量,在文件末尾添加:

          1
          2
          3
          4
          export JAVA_HOME=/usr/java/jdk
          export JRE_HOME=/usr/java/jdk/jre
          export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
          export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
      4. 检测

        • 环境变量生效 source /etc/profile
        • 检测 java -version
    3. 将一台CentOS虚拟机克隆成3台

      VirtualBox有这个功能,复制2个虚拟机,Mac地址重新分配。

      1. 修改机器名 vim /etc/sysconfig/network

      2. 全程使用root账户

      3. 关闭防火墙,GUI设置,或者service iptables stop

      4. 检验各个主机之间能否连通,ping ip

      5. 不管用什么办法,让IP固定不变。设置静态IP,或者使用路由器固定IP。

        我的配置如下:

机器名 IP
master 192.168.76.11
slave1 192.168.76.12
slave2 192.168.76.13
  1. 设置hosts

    三台机器全部设置

    vim /etc/hosts

    1
    2
    3
    4
    5
    6
    127.0.0.1       localhost.localdomain localhost
    ::1 localhost6.localdomain6 localhost6
    #增加了下面3行
    192.168.76.11 master
    192.168.76.12 slave1
    192.168.76.13 slave2



配置ssh免密码登陆

  1. ssh配置,vim /etc/ssh/sshd_config

    1
    2
    3
    4
    # 以下三项修改成以下配置
    RSAAuthentication yes # 启用 RSA 认证
    PubkeyAuthentication yes # 启用公钥私钥配对认证方式
    AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)
  2. 生成ssh key

    1
    2
    3
    4
    5
    cd ~
    ssh-keygen
    一路回车,这样就在~/.ssh目录下生成了几个文件
    cd ~/.ssh
    cat id_rsa.pub >> authorized_keys #这个命令将id_rsa.pub的内容追加了authorized_keys的内容后面

    重启ssh服务,service sshd restart

  3. 免密登陆

    1. 去另外两台机器用同样的方式生成id_rsa.pub
    2. 分别把它们复制到master机器上
    3. 在slave1机器上,scp id_rsa.pub root@192.168.76.11:~/.ssh/id_rsa.pub.1
    4. 在slave1机器上,scp id_rsa.pub root@192.168.76.11:~/.ssh/id_rsa.pub.2
    5. 回到master机器的~/.ssh目录,执行

      1
      2
      cat id_rsa.pub.1 >> authorized_keys
      cat id_rsa.pub.2 >> authorized_keys
    6. 最后我们把这个authorized_keys用scp命令复制到两个从节点上,这样三台机器两两之间就能互相访问了

      1
      2
      scp authorized_keys root@192.168.76.12:~/.ssh/
      scp authorized_keys root@192.168.76.13:~/.ssh/
    7. .ssh目录和.ssh/authorized_keys设置权限,三台机器都执行

      1
      2
      chmod 700 ~/.ssh
      chmod 644 ~/.ssh/authorized_keys
  4. 在各主机下进行无密码登陆测试


配置hadoop

下载hadoop,选择binary包,我下载的hadoop2.7.3,传到master的/usr/下,解压,并将文件夹名改名为hadoop

涉及到的配置文件有7个:

1
2
3
4
5
6
7
~/usr/hadoop/etc/hadoop/hadoop-env.sh 
~/usr/hadoop/etc/hadoop/yarn-env.sh
~/usr/hadoop/etc/hadoop/core-site.xml
~/usr/hadoop/etc/hadoop/hdfs-site.xml
~/usr/hadoop/etc/hadoop/mapred-site.xml
~/usr/hadoop/etc/hadoop/yarn-site.xml
~/usr/hadoop/etc/hadoop/slaves


1.vim ~/usr/hadoop/etc/hadoop/hadoop-env.sh

1
2
3
# 这个文件要修改的地方就是JAVA_HOME环境变量
# The java implementation to use.
export JAVA_HOME=/usr/java/jdk

2.vim ~/usr/hadoop/etc/hadoop/yarn-env.sh

1
2
3
# yarn的环境配置,同样只需要修改JAVA_HOME就行,找到下面这行
# some Java parameters
export JAVA_HOME=/usr/java/jdk

3.
mkdir ~/usr/hadoop/tmp
vim ~/usr/hadoop/etc/hadoop/core-site.xml

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>

4.vim ~/usr/hadoop/etc/hadoop/hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;dfs.replication配置了文件块的副本数,一般不大于从机的个数。
<configuration>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

5.修改模板文件,

1
2
cd ~/usr/hadoop/etc/hadoop/
cp mapred-site.xml.template mapred-site.xml

vim ~/usr/hadoop/etc/hadoop/mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>20</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>4</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>

6.vim ~/usr/hadoop/etc/hadoop/yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#该文件为yarn框架的配置,主要是一些任务的启动位置
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

7.vim ~/usr/hadoop/etc/hadoop/slaves

1
2
3
# 这是设置从节点hostname的地方,一行一个
slave1
slave2

配置完成


8.将配置好的hadoop复制到其他机器

1
2
scp -r /usr/hadoop root@192.168.76.12:/usr/
scp –r /usr/hadoop root@192.168.76.13:/usr/

安装完成



验证并测试hadoop

  1. 启动

    hadoop的安装目录为 /usr/hadoop

    可选配置hadoop环境变量,vim /etc/profile

    1
    2
    3
    4
    5
    6
    7
    8
    export HADOOP_INSTALL=/usr/hadoop  
    export PATH=${HADOOP_INSTALL}/bin:${HADOOP_INSTALL}/sbin${PATH}
    export HADOOP_MAPRED_HOME=${HADOOP_INSTALL}
    export HADOOP_COMMON_HOME=${HADOOP_INSTALL}
    export HADOOP_HDFS_HOME=${HADOOP_INSTALL}
    export YARN_HOME=${HADOOP_INSTALLL}
    export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_INSTALL}/lib/natvie
    export HADOOP_OPTS="-Djava.library.path=${HADOOP_INSTALL}/lib:${HADOOP_INSTALL}/lib/native"

    source /etc/profile

    • 格式化Namenode

      1
      2
      cd /usr/hadoop
      ./bin/hdfs namenode -format
    • 启动

      1
      2
      3
      cd /usr/hadoop/sbin
      ./start-dfs.sh
      ./start-yarn.sh

      在三台机器上分别执行 jps 命令

    • master上执行有四个进程

      • NameNode
      • ResourceManager
      • <>
      • Jps
    • slave上执行有三个进程

      • DataNode
      • NodeManager
      • Jps
    • 输入以下指令查看报告,hadoop dfsadmin -report

      打开浏览器访问 192.168.76.11:50070

      检查 Live Nodes 是否为2

  2. 运行测试

    向hadoop集群系统提交第一个mapreduce任务(wordcount),进入本地hadoop目录,/usr/hadoop

    1. 在虚拟分布式文件系统上创建一个测试目录/data/input
      bin/hdfs dfs -mkdir -p /data/input

    2. 将当前目录下的README.txt 文件复制到虚拟分布式文件系统中
      hdfs dfs -put README.txt /data/input

    3. 查看文件系统中是否存在我们所复制的文件
      bin/hdfs dfs -ls /data/input

    4. 运行如下命令向hadoop提交单词统计任务
      hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /data/input /data/output/result

    5. 查看result,结果在result下面的part-r-00000中
      hdfs dfs -cat /data/output/result/part-r-00000

      成功运行,则搭建完成。

      停止运行,sh /usr/hadoop/sbin/stop-all.sh



踩过的坑→_→

  1. ssh免密登陆

  2. 重启Linux后Hadoop集群所有的DataNode都无法启动

    1. 首先会出现几种情况,才会出现启动不了datanode的情况

      • 首先修改过master那台的配置文件

      • 多次Hadoop namenode -format这种不好的习惯

    2. jps命令发现没有datanode启动

      • 到每个Slave机器下面去,找到/usr/hadoop/tmp/dfs/,会显示有data,把data文件夹删掉。

      • 重启hadoop。