搭建Hadoop伪分布式平台

伪分布式:在一台机器上模拟出分布式环境

1 安装 VMware 或 VirtualBox

笔者很早就安装了 VMware 11

2 安装 CentOS

笔者从网上直接找了“VMware 专用 CentOS”,版本是 6.4,解压后直接用 VMware 打开即可
虚拟机的网络连接方式参见文章《Linux学习笔记(一)——Linux安装》第 5 小节,笔者在此使用的是 host-only 仅主机方式

  • 将宿主机的 VMware Network Adapter VMnet1 的 IPv4 设置为 192.168.80.1
  • 在虚拟机中添加适配器,选择“Wired”,在 Wired 选项卡中勾选“Available to all users”,在 IPv4 Settings 选项卡中将 Address 设置为 192.168.80.100,将 Netmask 设置为 255.255.255.0,将 Gateway 设置为192.168.80.1,其他设置默认即可
  • 在虚拟机中执行命令service network restart,重启网卡,使上面的配置立即生效
  • 在虚拟机中执行命令ifconfig,查看配置是否生效

3 使用 PieTTY 修改主机名

3.1 修改主机名

打开绿色软件 PieTTY

  • 在 Host Name (or IP address) 中输入虚拟机的 IP 地址(在本文中即 192.168.80.100),其他配置默认,点击 Open,输入用户名 root 和其密码
  • 执行命令hostname查看主机名,笔者查到的主机名为“localhost.localdomain”
  • 临时修改主机名:
    1
    2
    3
    4
    5
    [root@localhost ~]# hostname
    localhost.localdomain
    [root@localhost ~]# hostname hadoop
    [root@localhost ~]# hostname
    hadoop
    执行命令hostname 主机名,笔者所用的主机名为 Hadoop,配置后再次用hostname命令查看,发现主机名已经更改成功。但是此时修改的主机名只对当前会话有效,关闭或重启电脑后此设置不被保存,主机名还会恢复为原来的名字
  • 永久性修改主机名:
    打开配置文件:
    1
    [root@localhost ~]# vi /etc/sysconfig/network
    修改主机名:将“HOSTNAME=”后面的内容改为新主机名(在本文中为“hadoop”),输入:wq保存退出

3.2 将主机名与 IP 地址绑定

新修改的主机名是没有和 IP 地址绑定的(执行命令ping hadoop不通)
打开配置文件:

1
[root@localhost ~]# vi /etc/hosts

绑定主机名与 IP:在文件中添加一行“192.168.80.100 hadoop”,输入:wq保存退出

3.3 关闭防火墙

  • 查看虚拟机防火墙:
    1
    [root@localhost ~]# service iptables status
  • 关闭防火墙:
    1
    [root@localhost ~]# service iptables stop
  • 关闭后再次查看防火墙,显示“iptables: Firewall is not running.”
  • 查看再次开启电脑时防火墙是否会自动重启:
    1
    [root@localhost ~]# chkconfig --list | grep iptables
    如果发现出现“on”,说明在相应级别会自动启动
  • 关闭 iptables 的自动启动功能
    1
    [root@localhost ~]# chkconfig iptables off
  • 再次查看防火墙是否会自动启动,发现各级别均为“off”

3.4 SSH(secure shell)的免密码登录

如果要访问对方的服务器,需要知道对方的账号和密码
SSH 加密访问对方的服务器的流程大概是(假如有 A、B 两台机器):

  1. A 产生一对公钥私钥,并把公钥复制到 B 那边
  2. 通信的时候,A 再次连接 B,B 会发来一个字符串,A 将该字符串用自己的私钥加密,然后将加密后的字符串返回给 B
  3. B 用 A 的公钥将字符串再次加密
  4. 用算法比对加密后的字符串是否一致,如果不一致,则判断连接不可信;反之则可信

3.4.1 产生密钥

执行命令ssh-keygen -t rsa产生密钥
ssh-keygen产生密钥,-t rsa说明加密算法为 RSA
产生的密钥位于~/.ssh文件夹中(~为当前家目录,由于笔者使用 root 账号,所以即为/root目录)

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
[root@hadoop ~]# cd .ssh
[root@hadoop .ssh]# ls 查看存放密钥的文件夹
[root@hadoop .ssh]# ssh-keygen -t rsa 发现文件夹是空的,产生密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
b3:80:62:b6:55:9f:01:c3:01:eb:e3:5a:c6:95:15:3d root@hadoop
The key's randomart image is:
+--[ RSA 2048]----+
| .o+... |
| ..o .E |
| . . o . |
| . o + o |
| + = + S |
| o * o . o |
| . = . |
| + |
| . |
+-----------------+
[root@hadoop .ssh]# ls
id_rsa id_rsa.pub

3.4.2 验证

当把公钥发给对方后,对方会存储在~/.ssh/authorized_keys文件中(在进行通信验证的时候,会读取authorized_keys文件)
由于笔者此时只有一台虚拟机,所以只能自己访问自己了。。。

1
2
3
[root@localhost .ssh]# cp id_rsa.pub authorized_keys
[root@localhost .ssh]# ls
authorized_keys id_rsa id_rsa.pub

验证:执行命令ssh localhost

1
2
3
4
5
6
7
8
9
10
[root@hadoop .ssh]# ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 07:07:8e:1c:c0:7e:7f:1f:ca:6a:e6:d3:cb:7f:b7:a1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Last login: Fri Nov 18 21:25:18 2016 from 192.168.80.1
[root@hadoop ~]# exit
logout
Connection to localhost closed.
[root@hadoop .ssh]#

4 用 WinSCP 安装 JDK

  • 为了传输文件,笔者首先安装了 WinSCP
  • 安装完毕打开后,在“主机名”填写 IP 地址(192.168.80.100),“用户名”填写“root”,然后填写密码(本文为 hadoop)
  • 登录后将宿主机 Windows 下的文件“jdk-6u24-linux-i586.bin”和“hadoop-1.1.2.tar.gz”从左边拖放到右边希望存放文件的文件夹(笔者选择的是/root/Downloads
  • 在虚拟机下查看
    1
    2
    3
    [root@hadoop ~]# cd /root/Downloads/
    [root@hadoop Downloads]# ls
    hadoop-1.1.2.tar.gz jdk-6u24-linux-i586.bin
  • 将安装包复制到安装目录下
    1
    2
    3
    4
    5
    6
    7
    8
    [root@hadoop Downloads]# cd /usr/local/
    [root@hadoop local]# ls
    bin etc games include lib libexec sbin share src
    [root@hadoop local]# rm -rf * 将目录下的所有文件都删除(选项 r 代表递归,选项 f 表示不用确认,* 代表所有文件)
    [root@hadoop local]# ls
    [root@hadoop local]# cp /root/Downloads/* . . 代表当前目录
    [root@hadoop local]# ls
    hadoop-1.1.2.tar.gz jdk-6u24-linux-i586.bin
  • 解压 JDK 文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@hadoop local]# ./jdk-6u24-linux-i586.bin    解压 JDK 文件
    -bash: ./jdk-6u24-linux-i586.bin: Permission denied 发现权限不够
    [root@hadoop local]# ls -l 查看权限,发现没有执行权限
    total 143420
    -rw-r--r--. 1 root root 61927560 Nov 19 01:20 hadoop-1.1.2.tar.gz
    -rw-r--r--. 1 root root 84927175 Nov 19 01:20 jdk-6u24-linux-i586.bin
    [root@hadoop local]# chmod u+x jdk-6u24-linux-i586.bin
    [root@hadoop local]# ls -l
    total 143420
    -rw-r--r--. 1 root root 61927560 Nov 19 01:20 hadoop-1.1.2.tar.gz
    -rwxr--r--. 1 root root 84927175 Nov 19 01:20 jdk-6u24-linux-i586.bin
    [root@hadoop local]# ./jdk-6u24-linux-i586.bin 再次解压
    ··· 解压过程省略
    [root@hadoop local]# ls
    hadoop-1.1.2.tar.gz jdk1.6.0_24 jdk-6u24-linux-i586.bin
    [root@hadoop local]# mv jdk1.6.0_24 jdk 将 jdk1.6.0_24 重命名(不是必须的)
  • 配置环境变量
    打开配置文件
    1
    [root@hadoop local]# vi /etc/profile
    在文件中添加两行:
    1
    2
    export JAVA_HOME=/usr/local/jdk
    export PATH=.:$JAVA_HOME/bin:$PATH
    如下图所示(一定看清楚是/usr而不是/user,笔者找了好久才发现错误):
    HadoopInstall_1
    让配置立即生效
    1
    [root@hadoop local]# source /etc/profile
    查看是否安装成功:
    1
    2
    3
    4
    [root@hadoop ~]# java -version
    java version "1.6.0_24"
    Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
    Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)

5 安装 Hadoop

  • 解压压缩包
    1
    2
    3
    4
    5
    6
    7
    8
    [root@hadoop ~]# cd /usr/local/
    [root@hadoop local]# ls
    hadoop-1.1.2.tar.gz jdk jdk-6u24-linux-i586.bin
    [root@hadoop local]# tar -zxvf hadoop-1.1.2.tar.gz
    ··· 解压过程省略
    [root@hadoop local]# ls
    hadoop-1.1.2 hadoop-1.1.2.tar.gz jdk jdk-6u24-linux-i586.bin
    [root@hadoop local]# mv hadoop-1.1.2 hadoop 将 hadoop-1.1.2 重命名(不是必须的)
  • 配置环境变量
    打开配置文件
    1
    [root@hadoop local]# vi /etc/profile
    在文件中添加一行:
    1
    export HADOOP_HOME=/usr/local/hadoop
    在“PATH”变量中添加:$HADOOP_HOME/bin
    如下图所示:
    HadoopInstall_2
    让配置立即生效
    1
    [root@hadoop local]# source /etc/profile
  • 修改位于$HADOOP_HOME/conf目录下的 Hadoop 配置文件
    需要修改的 4 个配置文件分别是:hadoop-env.shcore-site.xmlhdfs-site.xmlmapred-site.xml
    为了避免麻烦,用 WinSCP 打开/usr/local/hadoop/conf,选择文件后编辑
    • hadoop-env.sh
      将第 9 行# export JAVA_HOME=/usr/lib/j2sdk1.5-sun前面的# 去掉,将值改为上文中配置的值**/usr/local/jdk**,保存
      如下图所示:
      HadoopInstall_3
    • core-site.xml
      将文件中
      1
      2
      3
      <configuration>

      </configuration>
      改为:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <configuration>
      <property>
      <name>fs.default.name</name>
      <value>hdfs://hadoop:9000</value>
      <description>change your own hostname</description>
      </property>
      <property>
      <name>hadoop.tmp.dir</name>
      <value>/usr/local/hadoop/tmp</value>
      </property>
      </configuration>
      如下图所示:
      HadoopInstall_4
      其中第 4 行name标签下hadoop为主机名
      • hdfs-site.xml
        将文件中
        1
        2
        3
        <configuration>

        </configuration>
        改为:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        <configuration>
        <property>
        <name>dfs.replication</name>
        <value>1</value>
        </property>
        <property>
        <name>dfs.permissions</name>
        <value>false</value>
        </property>
        </configuration>
    • mapred-site.xml
      将文件中
      1
      2
      3
      <configuration>

      </configuration>
      改为:
      1
      2
      3
      4
      5
      6
      7
      <configuration>
      <property>
      <name>mapred.job.tracker</name>
      <value>hadoop:9001</value>
      <description>change your own hostname</description>
      </property>
      </configuration>
      其中第 4 行value标签下hadoop为主机名

6 对 Hadoop 进行格式化

执行命令:

1
[root@hadoop local]# hadoop namenode -format

注意:多次格式化 Hadoop 会导致一些错误,解决方法是删除/usr/local/hadoop/tmp文件夹,然后再次重新格式化

7 启动 Hadoop

执行命令:

1
[root@hadoop local]# start-all.sh

查看 Java 进程,发现除 JPS 外还有 5 个 Java 进程,分别是NameNode、DataNode、SecondaryNameNode、JobTracker、TaskTracker:

1
2
3
4
5
6
7
[root@hadoop local]# jps
3022 NameNode
3571 Jps
3283 JobTracker
3390 TaskTracker
3120 DataNode
3213 SecondaryNameNode

还可以在浏览器上访问hadoop:50070,如下图所示:
HadoopInstall_5
这也说明 NameNode 本身是个 Web Server
访问hadoop:50030,发现 Map/Reduce 在运行,说明进程 JobTracker 在运行

其实如果在宿主机 Windows 下,在C:\Windows\System32\drivers\etc\hosts中增加一行192.168.80.100 hadoop,将主机名和 IP 地址绑定后,在 Windows 浏览器中也可访问

到这里 Hadoop 伪分布式平台搭建就完成了 :)

8 去除 Hadoop 启动过程中的警告信息

在执行start-all.sh命令的时候发现有警告信息:

1
2
3
4
5
6
7
8
[root@hadoop local]# start-all.sh
Warning: $HADOOP_HOME is deprecated.

namenode running as process 3022. Stop it first.
localhost: datanode running as process 3120. Stop it first.
localhost: secondarynamenode running as process 3213. Stop it first.
jobtracker running as process 3283. Stop it first.
localhost: tasktracker running as process 3390. Stop it first.

先将 Hadoop 关闭:

1
[root@hadoop local]# stop-all.sh

由于是命令start-all.sh报的错,所以先去看一下这个 shell 脚本文件

1
2
[root@hadoop local]# cd hadoop/bin/
[root@hadoop bin]# more stop-all.sh

发现代码中有一段是这么写的:
HadoopInstall_6
这段代码的大概意思就是:如果$bin/../libexec/hadoop-config.sh这个文件存在(-e表示存在),则执行这个文件,如果不存在,则执行$bin/hadoop-config.sh这个文件
然而事实是$bin/../libexec/hadoop-config.sh这个文件是不存在的,所以我们就继续去看文件$bin/hadoop-config.sh

1
2
3
4
5
6
7
8
[root@hadoop bin]# ls
hadoop start-all.sh stop-balancer.sh
hadoop-config.sh start-balancer.sh stop-dfs.sh
hadoop-daemon.sh start-dfs.sh stop-jobhistoryserver.sh
hadoop-daemons.sh start-jobhistoryserver.sh stop-mapred.sh
rcc start-mapred.sh task-controller
slaves.sh stop-all.sh
[root@hadoop bin]# more hadoop-config.sh

然后在最后一页发现了端倪 =_=:
HadoopInstall_7
由于HADOOP_HOME刚刚设置过,显然不为空,所以HADOOP_HOME_WARN_SUPPRESS应该是空的,所以就去给它赋个值,让它不为空 :)

1
[root@hadoop bin]# vi /etc/proflie

增加一行:export HADOOP_HOME_WARN_SUPPRESS=1(等于什么都可以),然后保存退出
然后执行命令source /etc/profile
再次启动,发现没有警告信息了

9 配置回收站

Hadoop 默认 Trash(回收站)的保留时间是 0,即不保留,所以需要在core-site.xml里增加如下配置:

1
2
3
4
5
6
7
<property>
<name>fs.trash.interval</name>
<value>10080</value>
<description>
Number of minutes between trash checkpoints. If zero, the trash feature is disabled
</description>
</property>

10080 = 60 * 24 * 7
所以以上配置是保留 7 天