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
启动成功