# 系统信息
3台系统: centos6.8内核:4 内存:4G 硬盘:50G
# 主机名称,ip地址
master: 192.168.1.110
slave1: 192.168.1.111
slave2: 192.168.1.112
######################## 软件下载地址 ########################
链接:https://pan.baidu.com/s/1dFuBnKt 密码:rhwu
######################## 基础初始配置 ########################
# 版本选择
jdk-8u77-linux-x64.rpm
zookeeper-3.4.9.tar.gz
hbase-1.3.1-bin.tar.gz
hadoop-2.7.4.tar.gz
# 配置hosts文件,三台机器都需要
[root@master ~]# cat /etc/hosts
192.168.1.110 master
192.168.1.111 slave1
192.168.1.112 slave2
# 配置用户
1
2
|
groupadd -g 4000 hadoop
useradd
-g 4000 -u 4001 hadoop
|
# 所有的主机 hbase,zookeeper 安装目录都在此处
1
2
|
mkdir
/opt/hadoop
chown
hadoop.hadoop
/opt/hadoop/
-R
|
######################## 时间配置 ########################
# 双机互信
主要有三步:
①生成公钥和私钥
②导入公钥到认证文件
③更改权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@master ~]
# 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:
ee:15:03:c7:3a:a2:8e:6a:c1:0c:74:d3:97:34:77:04 root@master
The key's randomart image is:
+--[ RSA 2048]----+
| . .o.Eoo |
| . o . oo.. |
|. . . . . o |
|. + |
|+ . S o |
| + . o . o |
| . . . . |
| . o . . |
|o.. . . |
+-----------------+
[root@master ~]
# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[root@master ~]
# chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
|
# 主机与从机之间必须可以双向无密码登陆,从机与从机之间无限制
1
2
|
scp
~/.
ssh
/authorized_keys
slave1:
/root/
.
ssh
/
scp
~/.
ssh
/authorized_keys
slave2:
/root/
.
ssh
/
|
# 同步时间
1
2
|
[root@master zookeeper]
# ansible hbase -m cron -a "name='ntpdate' hour='*/1' job='/usr/sbin/ntpdate 192.168.1.110 &> /dev/null'"
[root@master zookeeper]
# ansible hbase -m shell -a "crontab -l"
|
# 时间一定要保持一致
######################## 防火墙配置 ########################
# 防火墙配置 所有的主机上都得配置,或者开放 (2181,2888:3888端口,这部分端口是zookeeper端口)
1
2
3
|
[root@slave2 zookeeper]
# iptables -I INPUT -s 192.168.1.0/24 -j ACCEPT
[root@slave2 zookeeper]
# service iptables save
[root@slave2 zookeeper]
# service iptables restart
|
######################## JDK配置 ########################
# 安装jdk,并配置环境变量,三台机器都需要安装
# 设置环境变量
1
2
3
|
[root@slave2 ~]
# cat /etc/profile.d/java.sh
export
JAVA_HOME=
/usr/java/default
export
PATH=$JAVA_HOME
/bin
:$PATH
|
# 重新加载配置文件使之生效
[root@slave2 ~]# source /etc/profile.d/java.sh
# 查看是否配置完成,3台机器都需要测试
[root@slave2 ~]# java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
######################## zookeeper集群配置 ########################
# 参考文档: http://blog.csdn.net/reblue520/article/details/52279486
# 注意:zookeeper因为有主节点和从节点的关系,所以部署的集群台数最好为奇数个,否则可能出现脑裂导致服务异常
# 下载地址: http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
# 注意三台机器都需要安装,如果对ansible熟悉的话 可以直接使用它
1
2
|
mkdir
/opt/hadoop
chown
hadoop.hadoop
/opt/hadoop/
-R
|
# 安装zookeeper
1
2
3
4
|
[root@master ~]
# cd /opt/hadoop/
[root@master hadoop]
# ls
zookeeper-3.4.9.
tar
.gz
[root@master hadoop]
# tar xf zookeeper-3.4.9.tar.gz
|
# 弄一个软链接,配置文件直接指向这个地址,未来方便更新版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@master hadoop]
# ln -sv zookeeper-3.4.9 zookeeper
"zookeeper"
->
"zookeeper-3.4.9"
[root@master conf]
# cd /opt/hadoop/zookeeper/conf
[root@master conf]
# cp zoo_sample.cfg zoo.cfg
[root@master conf]
# cat zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=
/opt/hadoop/zookeeper/data
dataLogDir=
/opt/hadoop/zookeeper/logs
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
|
# 创建数据以及日志目录,将设置属主属组权限
1
2
|
[root@master conf]
# mkdir /opt/hadoop/zookeeper/data
[root@master conf]
# mkdir /opt/hadoop/zookeeper/logs
|
# 在zoo.cfg中的dataDir指定的目录下,新建myid文件。
# 例如:$ZK_INSTALL/data下,新建myid。在myid文件中输入1。表示为server.1。
echo "1" > data/myid 这里表示的是server.1 如果是第二个机器那么表示server.2
启动:在集群中的每台主机上执行如下命令
bin/zkServer.sh start
查看状态,可以看到其中一台为主节点,其他两台为从节点:
bin/zkServer.sh status
# 启动zookeeper集群
1
2
3
4
|
[root@master zookeeper]
# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config:
/opt/hadoop/zookeeper/bin/
..
/conf/zoo
.cfg
Mode: leader
|
# 从节点
1
2
3
4
|
[root@slave1 zookeeper]
# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config:
/opt/hadoop/zookeeper/bin/
..
/conf/zoo
.cfg
Starting zookeeper ... STARTED
|
# 启动报错 说明没有配置myid文件,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
2017-12-04 11:56:21,306 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from:
/opt/hadoop/zookeeper/bin/
..
/conf/zoo
.cfg
2017-12-04 11:56:21,323 [myid:] - INFO [main:QuorumPeer$QuorumServer@149] - Resolved
hostname
: slave2 to address: slave2
/192
.168.1.112
2017-12-04 11:56:21,324 [myid:] - INFO [main:QuorumPeer$QuorumServer@149] - Resolved
hostname
: slave1 to address: slave1
/192
.168.1.111
2017-12-04 11:56:21,324 [myid:] - INFO [main:QuorumPeer$QuorumServer@149] - Resolved
hostname
: master to address: master
/192
.168.1.110
2017-12-04 11:56:21,325 [myid:] - INFO [main:QuorumPeerConfig@352] - Defaulting to majority quorums
2017-12-04 11:56:21,326 [myid:] - ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing
/opt/hadoop/zookeeper/bin/
..
/conf/zoo
.cfg
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:144)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
Caused by: java.lang.IllegalArgumentException:
/opt/hadoop/zookeeper/data/myid
file
is missing
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:362)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:140)
... 2
more
Invalid config, exiting abnormally
|
# 这里是因为防火墙开着,没有开放端口的原因
1
2
3
4
5
|
2016-03-26 03:48:07,957 [myid:1] - WARN [QuorumPeer[myid=1]
/0
:0:0:0:0:0:0:0:2181:QuorumCnxManager@400] - Cannot
open
channel to 3 at election address S2/这里是地址
java.net.ConnectException: 主机无法连接
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
|
######################## hbase 与hadoop的版本需要对应 ########################
http://blog.csdn.net/shuaigexiaobo/article/details/78114221 低版本与高版本会安不上,还需要注意jdk版本
######################## hadoop 集群配置 ########################
# 软件放置路径为初级配置的路径 /opt/hadoop
1
2
3
|
[root@master hadoop]
# tar xf hadoop-2.7.4.tar.gz
[root@master hadoop]
# ln -sv hadoop-2.7.4 hadoop
"hadoop"
->
"hadoop-2.7.4"
|
# 配置属主属组权限
1
|
[root@master hadoop]
# chown hadoop.hadoop /opt/hadoop/hadoop-2.7.4 -R
|
# 环境变量设置
1
2
3
4
5
6
7
8
9
10
|
vim
/etc/profile
.d
/hadoop
.sh
export
HADOOP_HOME=
/opt/hadoop/hadoop
export
HADOOP_INSTALL=$HADOOP_HOME
export
HADOOP_MAPRED_HOME=$HADOOP_HOME
export
HADOOP_COMMON_HOME=$HADOOP_HOME
export
HADOOP_HDFS_HOME=$HADOOP_HOME
export
YARN_HOME=$HADOOP_HOME
export
HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME
/lib/native
export
PATH=$PATH:$HADOOP_HOME
/sbin
:$HADOOP_HOME
/bin
# export HADOOP_SSH_OPTS="-p 22"
|
# 复制到其它主机中
1
2
|
[root@master hadoop]
# scp /etc/profile.d/hadoop.sh slave1:/etc/profile.d/
[root@master hadoop]
# scp /etc/profile.d/hadoop.sh slave2:/etc/profile.d/
|
# 加载环境变量
1
|
[root@master hadoop]
# soure /etc/profile.d/hadoop.sh
|
# 查看是否生效
1
2
3
|
[root@master hadoop]
# hadoop version
Hadoop 2.7.4
Subversion https:
//shv
@git-wip-us.apache.org
/repos/asf/hadoop
.git -r cd915e1e8d9d0131462a0b7301586c175728a282
|
# hadoop配置文件在放置于/opt/hadoop/hadoop/etc/hadoop
1
2
3
4
5
6
7
|
vim core-site.xml
# 添加如下内容
<configuration>
<property>
<name>fs.default.name<
/name
>
<value>hdfs:
//master
:9000<
/value
>
<
/property
>
<
/configuration
>
|
1
2
3
|
vim hadoop-
env
.sh
#export JAVA_HOME=${JAVA_HOME}
export
JAVA_HOME=
/usr/java/default
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
vim hdfs-site.xml
# 配置hdfs文件数据节点以及名称节点
<configuration>
<property>
<name>dfs.name.
dir
<
/name
>
<value>
/opt/hadoop/hadoop/name
<
/value
>
<
/property
>
<property>
<name>dfs.data.
dir
<
/name
>
<value>
/opt/hadoop/hadoop/data
<
/value
>
<
/property
>
<property>
<name>dfs.replication<
/name
>
<value>3<
/value
>
<
/property
>
<
/configuration
>
mkdir
/opt/hadoop/hadoop/name
mkdir
/opt/hadoop/hadoop/data
|
1
2
3
4
5
6
7
8
|
[root@master hadoop]
# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]
# vim !$
<configuration>
<property>
<name>mapred.job.tracker<
/name
>
<value>master:9001<
/value
>
<
/property
>
<
/configuration
>
|
# 配置从节点 先删除localhost
1
2
3
|
/opt/hadoop/hadoop/etc/hadoop/slaves
slave1
slave2
|
# 三台机器都是一样的配置,放置相同的路径
1
2
|
[root@master hadoop]
# scp -r hadoop-2.7.4 slave1:/opt/hadoop/
[root@master hadoop]
# scp -r hadoop-2.7.4 slave2:/opt/hadoop/
|
# 使用ansible或者手动直接软链接过去就行
1
|
[root@master hadoop]
# ansible hbase -m shell -a 'ln -sv /opt/hadoop/hadoop-2.7.4 /opt/hadoop/hadoop'
|
# 配置属主属组文件
1
|
[root@master hadoop]
# ansible hbase -m shell -a 'chown hadoop.hadoop /opt/hadoop/hadoop -R'
|
# 进入master的/opt/hadoop/hadoop目录,执行以下操作
1
|
# bin/hadoop namenode -format # 格式化namenode,第一次启动服务前执行的操作,以后不需要执行
|
# 启动hadoop服务
1
2
3
4
5
|
[root@master logs]
# sbin/start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
17
/12/04
15:56:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library
for
your platform... using
builtin
-java classes where applicable
Starting namenodes on [master]
master: starting namenode, logging to
/opt/hadoop/hadoop-2
.7.4
/logs/hadoop-root-namenode-master
.out
|
# 查看进程 会发现多了资源名称节点以及namanode
1
2
3
4
5
6
|
[root@master logs]
# jps
5057 ResourceManager
4900 SecondaryNameNode
4709 NameNode
5208 Jps
2734 QuorumPeerMain
|
# 登陆其它节点 会发现多了一个数据节点
1
2
3
4
5
|
[root@slave2 hadoop]
# jps
2624 QuorumPeerMain
3489 NodeManager
3378 DataNode
3603 Jps
|
######################## hbase集群配置 ########################
# 软件放置路径为初级配置的路径 /opt/hadoop
1
2
3
|
[root@master hadoop]
# tar xf hbase-1.3.1-bin.tar.gz
[root@master hadoop]
# ln -sv hbase-1.3.1 hbase
"hbase"
->
"hbase-1.3.1"
|
# 配置文件目录 /opt/hadoop/hbase/conf
vim hbase-env.sh
1
2
3
|
export
JAVA_HOME=
/usr/java/default/
export
HBASE_CLASSPATH=
/opt/hadoop/hadoop/etc/hadoop
export
HBASE_MANAGES_ZK=
false
# 不使用自带的zk,使用独立的zookeeper
|
vim hbase-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
|
<configuration>
<property>
<name>hbase.rootdir<
/name
>
<value>hdfs:
//master
:9000
/hbase
<
/value
>
<
/property
>
<property>
<name>hbase.master<
/name
>
<value>master<
/value
>
<
/property
>
<property>
<name>hbase.cluster.distributed<
/name
>
<value>
true
<
/value
>
<
/property
>
<property>
<name>hbase.zookeeper.property.clientPort<
/name
>
<value>2181<
/value
>
# 这里指的是zook的端口
<
/property
>
<property>
<name>hbase.zookeeper.quorum<
/name
>
# 主机名一定要对应上
<value>master,slave1,slave2<
/value
>
<
/property
>
<property>
<name>zookeeper.session.timeout<
/name
>
# zook的session超时时长
<value>60000000<
/value
>
<
/property
>
<property>
<name>dfs.support.append<
/name
>
<value>
true
<
/value
>
<
/property
>
<
/configuration
>
|
vim regionservers# 配置从节点 一定要对应上
1
2
|
slave1
slave2
|
# 设置软链接,方便未来升级
[root@master hadoop]# ansible hbase -m shell -a "ln -sv /opt/hadoop/hbase-1.3.1 /opt/hadoop/hbase"
# 设置属主属组权限
[root@master hadoop]# ansible hbase -m shell -a "chown hadoop.hadoop /opt/hadoop/hbase-1.3.1 -R"
# 启动三台机器上的 hbase服务
[root@master hadoop]# ansible hbase -m shell -a "/opt/hadoop/hbase-1.3.1/bin/start-hbase.sh"
# 只需要启动master上的,其它机器上会自动启动
[root@master hadoop]# /opt/hadoop/hbase/bin/start-hbase.sh
# 查看master上的服务
1
2
3
4
5
6
7
|
[root@master hadoop]
# jps
5057 ResourceManager
4900 SecondaryNameNode
6516 HMaster
4709 NameNode
6809 Jps
2734 QuorumPeerMain
|
# 查看slave上的从节点服务
1
2
3
4
5
6
7
|
[root@slave1 ~]
# jps
3510 NodeManager
3399 DataNode
2680 QuorumPeerMain
5464 Jps
5049 HMaster
4730 HRegionServer
|
# 进入hbase shell进行验证
/opt/hadoop/hbase/bin/hbase shell
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
|
2017-12-04 16:20:28,690 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library
for
your platform... using
builtin
-java classes where applicable
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding
in
[jar:
file
:
/opt/hadoop/hbase-1
.3.1
/lib/slf4j-log4j12-1
.7.5.jar!
/org/slf4j/impl/StaticLoggerBinder
.class]
SLF4J: Found binding
in
[jar:
file
:
/opt/hadoop/hadoop-2
.7.4
/share/hadoop/common/lib/slf4j-log4j12-1
.7.10.jar!
/org/slf4j/impl/StaticLoggerBinder
.class]
SLF4J: See http:
//www
.slf4j.org
/codes
.html
#multiple_bindings for an explanation.
SLF4J: Actual binding is of
type
[org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter
'help<RETURN>'
for
list of supported commands.
Type
"exit<RETURN>"
to leave the HBase Shell
Version 1.3.1, r930b9a55528fe45d8edce7af42fef2d35e77677a, Thu Apr 6 19:36:54 PDT 2017
hbase(main):001:0>
hbase(main):002:0* list
TABLE
0 row(s)
in
0.2350 seconds
=> []
hbase(main):003:0> create
'scores'
,
'grade'
,
'course'
0 row(s)
in
2.4310 seconds
=> Hbase::Table - scores
hbase(main):004:0> list
TABLE
scores
1 row(s)
in
0.0080 seconds
=> [
"scores"
]
|
#### 此处打开的地址都是 master 的IP , 192.168.1.110