Hadoop1.x安装:完全分布式安装

1. 安装环境

本文使用三台CentOS6.4虚拟机模拟完全分布式环境。

1.1. 安装环境

项目 参数
主操作系统 Windows 10 64 bit,8GB内存
虚拟软件 VMware® Workstation 12 Pro 12.5.2
虚拟机操作系统 CentOS6.5 64位 512MB内存
虚拟机数量 3
jdk版本 java version "1.8.0_131"
安装的hadoop版本 hadoop-1.2.1

1.2. 集群环境

集群包含三个节点:1个namenode、2个datanode

主机名称 主机IP 节点类型 hadoop账号
tiny1 192.168.132.101 namenode grid
tiny2 192.168.132.102 datanode grid
tiny3 192.168.132.103 datanode grid

在我们的测试机上,我们使用三台虚拟机来模拟linux。我们下文中称之为tiny1、tiny2、tiny3

2. 配置hosts文件

我们希望三个主机之间都能够使用主机名称的方式相互访问而不是IP,我们需要在hosts中配置其他主机的host。因此我们在三个主机的/etc/hosts下均进行如下配置:
1. 打开hosts文件

[root@tiny1 ~]# vi /etc/hosts

2. 配置主机host

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.132.101 tiny1
192.168.132.102 tiny2
192.168.132.103 tiny3

3. 将配置发送到其他主机(同时在其他主机上配置)

[root@tiny1 etc]# scp /etc/hosts root@tiny2:/etc/hosts
[root@tiny1 etc]# scp /etc/hosts root@tiny3:/etc/hosts

4. 测试

[root@tiny1 root]$ ping tiny1
[root@tiny1 root]$ ping tiny2
[root@tiny1 root]$ ping tiny3

3.建立hadoop运行账号

我们在所有的主机下均建立一个grid账号用来运行hadoop
创建grid账号的命令如下

[root@tiny1 ~]# useradd grid
[root@tiny1 ~]# # 通过手动输入修改密码
[root@tiny1 ~]# passwd --stdin grid
更改用户 grid 的密码 。
123456
passwd: 所有的身份验证令牌已经成功更新。

测试:

[root@tiny1 ~]# su admin
[admin@tiny1 root]$ su grid
密码:
[grid@tiny1 root]$

4. 设置SSH免密码登陆

关于ssh免密码的设置,要求每两台主机之间设置免密码,自己的主机与自己的主机之间也要求设置免密码。 这项操作我们需要在hadoop用户下执行。

[root@tiny1 ~]# su grid
[grid@tiny1 ~]# ssh-keygen -t rsa
[grid@tiny1 ~]# ssh-copy-id tiny1
[grid@tiny1 ~]# ssh-copy-id tiny2
[grid@tiny1 ~]# ssh-copy-id tiny3

我们在每一台主机上执行如上命令。我们的设置结果如下,在每一台主机grid用户中的~/.ssh/authorized_keys文件中,其内容均为:


ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAs5s4u1SHzkeqHHMozFWyqFj/qKwn57Gm8tpvOxSRY+5xqdEonJGvQ71AF+EOvttz/qBgEGB3UX2jp7YVIcKcc9WDoJXrb2NuBKbnP0zywDCsVQj/4KC7rQzG7YF2x8xueuDrW8nSxmNF1cYfENtYKpIITtL3cwAaVBBgwZJFTj9QN8/cMorG5aclMCETeklpUhGkSZ5Ccjc0FfGNKhnQntPqPVMBbDaSrJ31T7eONlIRymBJufAengHWYFGkEm/mnktxeDxDpVgLSEhbvwRUOeQUZzGfRcpdWwGFyQNoPTfCYKPpaQsJT7tCB97VY6aAZiaNqoN0kLEvKVAYLyhaJQ== grid@tiny1

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAs0uMn5wpUJNqxi++3i2WQu9KSv7Mj2Za4yu/8pXGFDxIEJCNEgREnfSAdrmpftRjp083RV3842zp2fqpbcE335fma7VbIcSqq20cQhWFyB1dZFP+H+f4+RbC5g31Hk5YG+DDY5dEm2B3RLDpLt0FukJcc0smN56ZwQ3JUXxe9ip8slTvtMr2ptvSg86cy+Eu7Gwt+7XHCNYIrxCzv7YQ0WilzvEpHP09wRp/K15HFHh+mTimxN2z4QERNMg77hNYEdEVrOVIhMztgakuhhSkpbyskkQuTeiyvKTLd/QL4iSFjt7dB1nieVFWCRP2yY2AsjD8nbHarBrgYojS/kslCw== grid@tiny2

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAy4h+XIl/IR8/QxtCxW8xl8QOqqZQWlL+rsI2zlhgTb+6dN4B6CE+u3/SrU8c8tLJSAXuRTg+MohIABrKRpFuu8VCLHw27JZ21c9KXpncAe+wkv3vagbH1lfxyYnBGn5XY6MEhNTx7nyBL7O55GNA92kD+JIEGvVF+NUq8yBJDBqeVFoFPU6FARI3OJi1Hlh47+gjIAIp2SP8QEhvjm+katL4+KtGgyHMkw8OYYzW6t6wjzmqgIRdzkIZI0Q0ChC8wAl8wkhwYXnbdw6m4pgSnVJ0zBhQZ5ovCHF3FR0OsrXpoe/2tpjT4LG04khTpqt2T4PC36No3dhcd/9wAw4+4Q== grid@tiny3

5. 安装jdk

此过程在root下进行

[grid@tiny1 ~]$
[grid@tiny1 ~]$ su root
密码: 

5.1 下载并解压jdk

我们需要先下载并解压jdk,注意jdk的下载地址是经常变动的,因此请不要直接用下面的地址下载,下载时请先查看一下地址。

1. 创建java的安装路径

[root@tiny1 grid]# mkdir /usr/java
[root@tiny1 grid]# cd /usr/java

2. 下载jdk
点击Java SE Development Kit 8 Downloads,点击同意后下载jdk-8u141-linux-x64.tar.gz(不同的版本也可以用相同的方式),复制下来下载链接
然后使用wget 下载链接的方式下载jdk

例如:

[root@tiny1 java]#  wget http://download.oracle.com/otn-pub/java/jdk/8u131-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u131-linux-x64.tar.gz?AuthParam=1488850152_387f1ee536313aeb1ffd212acd203c87

3. 解压jdk解压后删除安装包

[root@tiny1 java]# tar -xzvf jdk-8u131-linux-x64.tar.gz\?AuthParam\=1497245763_bb5c713b336123c5d38ef99896a12489
[root@tiny1 java]# rm -f jdk-8u131-linux-x64.tar.gz\?AuthParam\=1497245763_bb5c713b336123c5d38ef99896a12489

4. 查看jdk的地址

[root@tiny1 java]# cd jdk1.8.0_131/
[root@tiny1 jdk1.8.0_131]# pwd
/usr/java/jdk1.8.0_131

5.配置环境变量
/etc/profile文件中配置JAVA_HOME和PATH

[root@tiny1 java]# vi /etc/profile

添加

export JAVA_HOME=/usr/java/jdk1.8.0_141
export PATH=$PATH:/usr/java/jdk1.8.0_141/bin

6.测试
运行java -version检测配置是否成功

[root@tiny01 opt]# java -version
java version "1.8.0"
gij (GNU libgcj) version 4.4.7 20120313 (Red Hat 4.4.7-18)

Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

安装成功

5.2 向其他节点复制jdk

[root@tiny1 jdk1.8.0_121]# ssh tiny2
[root@tiny2 ~]# mkdir /usr/java
[root@tiny2 ~]# ssh tiny3
[root@tiny3 ~]# mkdir /usr/java
[root@tiny3 ~]# logout
[root@tiny2 ~]# logout
[root@tiny1 jdk1.8.0_121]#

[root@tiny1 jdk1.8.0_121]# scp -r /usr/java/jdk1.8.0_121 root@tiny2:/usr/java/jdk1.8.0_121
[root@tiny1 jdk1.8.0_121]# scp -r /usr/java/jdk1.8.0_121 root@tiny3:/usr/java/jdk1.8.0_121

5.3 在各个主机下配置jdk的环境变量

编辑/etc/profile文件

[root@tiny1 jdk1.8.0_121]# vi /etc/profile

在该文件下添加如下内容

## JAVA_HOME 设置
JAVA_HOME=/usr/java/jdk1.8.0_121
export JAVA_HOME
PATH=$PATH:/usr/java/jdk1.8.0_121/bin

在每个主机下均进行设置,由于我的电脑上linux都是新安装的,环境变量相同,因此直接复制到了其他主机上。如果不同的主机的环境变量不同,请手动设置

[root@tiny1 hadoop]# scp /etc/profile root@tiny2:/etc/profile
[root@tiny1 hadoop]# scp /etc/profile root@tiny3:/etc/profile

在每个主机上都重新编译一下/etc/profile

[root@tiny1 hadoop]# source /etc/profile

5.4 测试

[root@tiny1 hadoop]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

如果不是命令未找到则表示成功(建议重启一下linux)

6. 下载并解压hadoop

在tiny1的linux控制台下载hadoop并将其解压

1. 切换回grid用户

[root@tiny1 jdk1.8.0_121]# su grid

2. 创建hadoop目录并进入到该目录中

[grid@tiny1 ~]$ cd ~
[grid@tiny1 ~]$ mkdir hadoop
[grid@tiny1 ~]$ cd hadoop
[grid@tiny1 hadoop]$

3. 下载并解压hadoop

[admin@tiny1 hadoop]$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
[admin@tiny1 hadoop]$ tar -xzvf hadoop-1.2.1.tar.gz

7. 配置相关的配置文件

7.1 修改hadooop-env.sh

hadooop-env.sh是一个脚本文件,它主要用来建立环境用的,我们需要修改JAVA_HOME,值的注意的是,它虽然配置为export JAVA_HOME=${JAVA_HOME}但是实际上他不能获取系统设置的JAVA_HOME因此需要手动配置
我们打开该文件:

vi hadoop-1.2.1/conf/hadoop-env.sh

我们将JAVA_HOME的注释解开并将它设置为我们在linux中安装的jdk的位置

# The java implementation to use.  Required.
export JAVA_HOME=/usr/java/jdk1.8.0_121

7.2 修改core-site.xml

打开该文件

vi hadoop-1.2.1/conf/core-site.xml

修改为下面的内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<!-- 指定名称节点 -->
<name>fs.default.name</name>
<!--tiny是主机名称,9000是端口号-->
<value>hdfs://tiny1:9000</value>
</property>

<property>
<!-- hadoop临时路径的指定,如果不指定则使用hadoop根目录,当系统重启后就会清空,那么将无法启动hadoop集群了,所以非常重要 -->
<name>hadoop.tmp.dir</name>
<value>/home/grid/hadoop/hadoop-1.2.1/tmp</value>
</property>
</configuration>

创建/home/admin/hadoop/tmp文件夹

[grid@tiny1 hadoop]$ mkdir /home/grid/hadoop/hadoop-1.2.1/tmp

7.3 修改hdfs-site.xml文件

打开该文件

vi hadoop-1.2.1/conf/hdfs-site.xml

修改为以下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

上面配置是设置副本备份数,因为我们只有两个datanode所以需要配置为1或2,因此这里必须秀该

7.4 修改mapred-site.xml文件

打开该文件

vi hadoop-1.2.1/conf/mapred-site.xml

修改为以下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>tiny1:9001</value>
</property>
</configuration>

这个参数指定的是job.tracker的地址,没有设置这个参数的话,默认是local,即job会进行本地运行。

7.5配置masters和slaves文件

master是namenode所在的机器,slave是datanode所在的机器,我们配置tiny1为master,tiny2和tiny3为slave

修改masters文件(注意,要设置好host)

vi hadoop-1.2.1/conf/masters

修改该文件为:

tiny1

修改salves文件(注意,要设置好host)

vi hadoop-1.2.1/conf/slaves

修改该文件为:

tiny2
tiny3

8.向各节点复制hadoop

将hadoop复制到其他的节点中(每一台机器中的hadoop信息是完全一样的)
将配置好的hadoop复制到其他节点上:

[grid@tiny1 hadoop]$ scp -r ../hadoop grid@tiny2:/home/grid/hadoop
[grid@tiny1 hadoop]$ scp -r ../hadoop grid@tiny3:/home/grid/hadoop

9. 格式化namenode

回到tiny1,格式化tiny1的namenode,执行hadoop安装目录下的bin/hadoop,即:

[grid@tiny1 hadoop]$ hadoop-1.2.1/bin/hadoop namenode -format

17/03/08 04:18:30 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = tiny1/192.168.132.101
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG:   java = 1.8.0_121
************************************************************/
17/03/08 04:18:31 INFO util.GSet: Computing capacity for map BlocksMap
17/03/08 04:18:31 INFO util.GSet: VM type       = 64-bit
17/03/08 04:18:31 INFO util.GSet: 2.0% max memory = 1013645312
17/03/08 04:18:31 INFO util.GSet: capacity      = 2^21 = 2097152 entries
17/03/08 04:18:31 INFO util.GSet: recommended=2097152, actual=2097152
17/03/08 04:18:31 INFO namenode.FSNamesystem: fsOwner=grid
17/03/08 04:18:31 INFO namenode.FSNamesystem: supergroup=supergroup
17/03/08 04:18:31 INFO namenode.FSNamesystem: isPermissionEnabled=true
17/03/08 04:18:31 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
17/03/08 04:18:31 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
17/03/08 04:18:31 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
17/03/08 04:18:31 INFO namenode.NameNode: Caching file names occuring more than 10 times
17/03/08 04:18:32 INFO common.Storage: Image file /home/grid/hadoop/hadoop-1.2.1/tmp/dfs/name/current/fsimage of size 110 bytes saved in 0 seconds.
17/03/08 04:18:32 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/grid/hadoop/hadoop-1.2.1/tmp/dfs/name/current/edits
17/03/08 04:18:32 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/grid/hadoop/hadoop-1.2.1/tmp/dfs/name/current/edits
17/03/08 04:18:32 INFO common.Storage: Storage directory /home/grid/hadoop/hadoop-1.2.1/tmp/dfs/name has been successfully formatted.
17/03/08 04:18:32 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at tiny1/192.168.132.101
************************************************************/

注意日志中的倒数第5行中的

/home/grid/hadoop/hadoop-1.2.1/tmp/dfs/name has been successfully formatted.

这句话表示格式化成功,如果没有显示这句话,那么格式化失败了,这里需要注意。

10. 关闭master的防火墙

在master(tiny1)下,切换为root用户查看防火墙的状态

[root@tiny1 grid]# service iptables status
表格:filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

如果防火墙显示如上面类似,那么说明防火墙处于开启状态,我们需要关闭防火墙(这个命令是暂时关闭防火墙)

[root@tiny1 grid]# service iptables stop
iptables:清除防火墙规则:                                 [确定]
iptables:将链设置为政策 ACCEPT:filter                    [确定]
iptables:正在卸载模块:                                   [确定]
[root@tiny1 grid]# service iptables status
iptables:未运行防火墙。

如果没有关闭防火墙,那么slave(tiny2,tiny3)将无法连接到master

11. 启动hadoop集群

在tiny1下执行hadoop安装目录下bin/start-all.sh脚本启动hadoop:

[grid@tiny1 hadoop]$ hadoop-1.2.1/bin/start-all.sh
starting namenode, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-namenode-tiny1.out
tiny2: starting datanode, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-datanode-tiny2.out
tiny3: starting datanode, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-datanode-tiny3.out
tiny1: starting secondarynamenode, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-secondarynamenode-tiny1.out
starting jobtracker, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-jobtracker-tiny1.out
tiny3: starting tasktracker, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-tasktracker-tiny3.out
tiny2: starting tasktracker, logging to /home/grid/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-grid-tasktracker-tiny2.out

我们可以在hadoop安装目录下的logs文件夹中查看文件日志

12.用jps检验各后台进程是否成功启动

检查tiny1(master)启动的进程

[grid@tiny1 hadoop]$ jps
2278 JobTracker
2198 SecondaryNameNode
2554 Jps
2030 NameNode

应该启动的进程就是上面四个。
检查tiny2,tiny3(slave)启动的进程

[grid@tiny1 ~]$ ssh tiny2
[grid@tiny2 ~]$ jps
2006 Jps
1830 DataNode
1903 TaskTracker
[grid@tiny2 ~]$ ssh tiny3
[grid@tiny3 ~]$ jps
1923 Jps
1799 TaskTracker
1724 DataNode

启动成功

posted on 2017-07-22 20:12  erygreat  阅读(125)  评论(0编辑  收藏  举报

导航