前要说明
1.集群说明
Hbase在完全分布式环境下,由Master进程负责管理RegionServers集群的负载均衡以及资源分配,ZooKeeper负责集群元数据的维护并且监控集群的状态以防止单点故障,每个RegionServer会负责具体数据块的读写,HBase所有的数据存储在HDSF系统上。
master slaver1 slaver2 slaver3 master1主机名(需要现有的主机名替换)
2.版本说明
版本:当前Ubuntu系统,jdk1.7.0_55
Hadoop选的最新稳定版:hadoop-2.7.3 t:16.8.26
Zookeeper选的最新稳定版:zookeeper-3.4.10 t:16.9.3
Hbase最新稳定版:hbase-1.2.5 t:16.10.26
理论上说,这是套系统,从时间更新的情况看也是这样,但是具体是否兼容或有问题得实际搭建看情况。
附加:CDH版本,目前主流生产环境都用这个,连网的情况,只需下个客户端,其他自动给配置,问题相对少很多,基本功能免费,高级功能收费。但是一般情况基本功能就可以,选择的换肯定是CDH5,但是具体哪个5点几没有研究过(理论上说应该都可以)
3.所有服务器环境配置说明
1.基本要求,为方便配置要求所有机器的所有安装路径文件路径及用户名
解压命令:
tar zxvf jdk-7u80-linux-x64.tar.gz 解压jdk
tar zxvf zookeeper-3.4.10.tar.gz 解压zk
tar zxvf hadoop-2.7.3.tar.gz 解压hadoop
tar zxvf hbase-1.2.5-bin.tar.gz 解压hbase
安装顺序jdk,zk,hadoop,hbase
启动顺序zk,hadoop,hbase
关闭顺序hbase,hadoop,zk
2.修改/etc/profile文件
即添加环境变量
在最后添加如下内容:
#java
export JAVA_HOME=/home/hadoop/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH
#zk
export ZOOKEEPER=/home/hadoop/zookeeper-3.4.10
export PATH=$ZOOKEEPER/bin:$PATH
#hadoop
export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#hbase
export HBASE_HOME=/home/hadoop/hbase-1.2.5
export PATH=$HBASE_HOME/bin:$PATH
执行source /etc/profile是环境变量生效
如果使用export PATH=$PATH: $JAVA_HOME/bin需切换jdk版本
$ sudo update-alternatives –install /usr/bin/javah javah /home/hadoop/jdk1.7.0_80/bin/javah
$ sudo update-alternatives –install /usr/bin/javac javac/home/hadoop/jdk1.7.0_80/bin/javac
$ sudo update-alternatives –install /usr/bin/javaws javaws /home/hadoop/jdk1.7.0_80/bin/javaws
$ sudo update-alternatives –install /usr/bin/java java /home/hadoop/jdk1.7.0_80/bin/java
$ sudo update-alternatives –install /usr/bin/jar jar/home/hadoop/jdk1.7.0_80/bin/jar
$ sudo update-alternatives –config java
$ sudo update-alternatives –config javac
$ sudo update-alternatives –config javah
$ sudo update-alternatives –config jar
3 配置host
配置所有机器主机名及ip地址
修改/etc/hosts
将127的ip全部用#注掉
并添加下面内容:
192.168.1.171 master
192.168.1.172 slaver1
192.168.1.173 slaver2
192.168.1.174 slaver3
192.168.1.175 master1
4建立ssh无密码登录
为了方便起见,所有机器都为无密码访问:
https://blog.csdn.net/dawn_rainbow/article/details/83746525
Zookeeper集群部署:
1)创建配置文件conf/zoo.cfg
mv zoo_sample.cfg zoo.cfg
2)更改conf/zoo.cfg的内容
# ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的
tickTime=2000
#Leader-Follower初始通信时限, Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许Follower在 initLimit 时间(10*tickTime)内完成这个工作
initLimit=10
#Leader-Follower同步通信时限,在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit(2*tickTime)之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题
syncLimit=2
#存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能(在启动zk前要建好这个目录)
dataDir= /home/hadoop/data/zookeeper
#客户端连接端口
clientPort=2181
#服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)必须为奇数个服务器(本机用0.0.0.0)
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server.4=slave3:2888:3888
server.5=master1:2888:3888
3)更改conf/log4j.properties的内容
第4行
zookeeper.log.dir=/home/hadoop/logs/zookeeper/
第6行
zookeeper.log.threshold=INFO
第7行
zookeeper.tracelog.dir=/home/hadoop/logs/zookeeper/
4)更改bin/ zkEnv.sh
第56行
ZOO_LOG_DIR="/home/hadoop/logs/zookeeper/"
5)拷贝zookeeper到每台机器
相关命令建文档开头
6)在每台的机器的dataDir目录下,新建文件myid,输入对应的编号
新建文件:touch myid
即server.X后面的X
7)启动zookeeper
如配置环境变量直接执行如下命令,若没有配置需进到zookeeper安装文档下的bin目录
每台机器都需要启动
zkServer.sh start
刚起来的时候会报错,全部机器都起来后,就不会报错了
8)测试
Java代码
zkServer.sh status
出现:
Mode:leader或Mode:follower
证明启动成功
Hadoop(hdfs)集群部署:
1.修改etc/hadoop/hadoop-env.sh
修改如下内容:
第25行修改jdk路径
export JAVA_HOME=/home/hadoop/jdk1.7.0_80
第72行去掉#,并修改日志地址
export HADOOP_LOG_DIR=/home/hadoop/logs/hadoop
2.修改etc/hadoop/core-site.xml,
在<configuration>标签中添加如下内容:
<property>
<name>fs.defaultFS</name>
<value>hdfs://myHadoop</value>
<description>表示hdfs路径的逻辑名称hadoop 2.x以后叫fs.defaultFS </description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hdfs/tmp</value>
<description>表示hadoop存放数据的目录,即包括NameNode的数据,
也包括DataNode的数据。该路径任意指定,只要实际存在该文件夹即可</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,master1:2181,slave1:2181,slave2:2181,slave3:2181</value>
</property>
3.修改etc/hadoop/hdfs-site.xml
在<configuration>标签中添加如下内容:
<!--指定hdfs默认副本数,默认3 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>myHadoop</value>
</property>
<!-- myHadoop下面有两个NameNode,分别是h1,h2 -->
<property>
<name>dfs.ha.namenodes.myHadoop</name>
<value>h1,h2</value>
</property>
<!-- h1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myHadoop.h1</name>
<value>master:9000</value>
</property>
<!-- h2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myHadoop.h2</name>
<value>master1:9000</value>
</property>
<!-- h1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myHadoop.h1</name>
<value>master:50070</value>
</property>
<!-- h2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myHadoop.h2</name>
<value>master1:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave1:8485;slave2:8485;slave3:8485/myHadoop</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.myHadoop</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<!--
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
-->
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journal</value>
</property>
<!-- 在h1和h2上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 存贮在本地的名字节点数据镜象的目录,作为名字节点的冗余备份 -->
<!--
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
-->
<!-- 数据节点的块本地存放目录 -->
<!--
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
-->
4.修改etc/hadoop/slaves,这个是所有datanode的机器
slave1
slave2
slave3
6.修改etc/hadoop/log4j.properties
第19行
hadoop.log.dir=/home/hadoop/logs/hadoop
7.初始化hadoop
将配置好的hadoop加压文件拷贝到所有其他机器,
注:所有机器路径必须一致用户名一样
如果已经配置文档开头的hadoop环境变量则可以在用户的根目录即/home/hadoop/下直接执行下面相关命令,若没有配置环境变量只有进到hadoop安装文档下相应的sbin即bin目录下执行
初始化hdfs文件:
1.在每个journalnode(即slave1,slave2,slave3)节点用如下命令启动journalnode
sbin/hadoop-daemon.sh start journalnode
验证:执行jps命令 出现JournalNode证明启动成功
2.在主namenode(master)节点用格式化namenode
bin /hdfs namenode –format
3.在主namenode(master)节点启动namenode进程
sbin /hadoop-daemon.sh start namenode
4.在备namenode(master1)节点执行命令
bin/hdfs namenode –bootstrapStandby
说明:这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了
5.启动备namenode(master1)进程
sbin /hadoop-daemon.sh start namenode
验证:执行jps命令 出现NameNode证明启动成功
这时候,使用浏览器访问 http://192.168.1.171:50070 和 http://192.168.1.175:50070 。如果能够看到两个页面,证明NameNode启动成功了(本机C:\Windows\System32\drivers\etc\hosts必须添加192.168.1.171 master 192.168.1.175 master2 否则拒绝访问)。这时,两个NameNode的状态都是standby
6.在其中一个namenode节点下格式化zk
bin/hdfs zkfc –formatZK
7.在两个namenode节点都执行以下命令进行主NameNode选举
sbin/hadoop-daemon.sh start zkfc
8.在所有datanode节点都执行以下命令启动datanode
sbin/hadoop-daemon.sh start datanode
9.停止集群命令
sbin/stop-dfs.sh
8.日常启停命令
sbin/start-dfs.sh
sbin/stop-dfs.sh
Hbase集群部署:
1.修改conf/hbase-env.sh
第28行
export JAVA_HOME=/home/hadoop/jdk1.7.0_80
第31行
export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
第48行
export HBASE_LOG_DIR=/home/hadoop/logs/hbase
第129行
export HBASE_MANAGES_ZK=false
2.修改conf/hbase-site.xml
在<configuration>标签下添加
<property>
<name>hbase.rootdir</name>
<value>hdfs://myHadoop/hbase</value>
<description>设置 hbase 数据库存放数据的目录,这里是放在hadoop hdfs上,这里要与hadoop的core-site.xml文件中的fs.defaultFS中的值一致,然后在后面添加自己的子目录,我这里定义是hbase</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>打开 hbase 分布模式</description>
</property>
<property>
<name>hbase.master</name>
<value>60000</value>
<description>主备情况下只需要写端口号,不必写主机名</description>
</property>
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
<description>web界面访问端口</description>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/home/hadoop/data/hbase</value>
<description>hbase的一些临时文件存放目录。</description>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2,slave3,master1</value>
<description> 指定 zookeeper 集群节点名 , 因为是由 zookeeper 表决算法决定的</description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
<description> 连接到zookeeper的端口,默认是2181</description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/data/zookeeper</value>
</property>
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>master与regionserver允许有3分钟误差</description>
</property>
3.修改conf/regionservers
在regionsers文件中添加
slave1
slave2
slave3
4.新增conf/backup-masters
在conf目录下新增文件
mkdir backup-masters
在backup-masters文件中添加
master1
作用:主要用于主机宕机后备用机接管hbase
5.修改conf/log4j.properties
第20行
hbase.log.dir=/home/hadoop/logs/hbase
6.拷贝hbase到所有的节点
同hadoop与zk
7.启动hbase
配置了环境变量直接执行,没有配置进入bin目录下
start-hbase.sh
8.hbase自带的web界面
http://192.168.1.171:60010/
http://192.168.1.175:60010/
9.测试
1.登录hbase客户端
文档开头配置hbase环境变量直接执行,没有配置进到hbase安装目录下的bin
hbase shell
2.新建数据表,并插入3条记录
hbase(main):003:0> create 'test', 't1'
(create '表名', '列族')
0 row(s) in 1.2200 seconds
hbase(main):003:0> list 'table'
test
1 row(s) in 0.0550 seconds
hbase(main):004:0> put 'test', 'row1', 't1:a', 'value1'
(put '表名', '行号', '列族:列', '列值' )
0 row(s) in 0.0560 seconds
hbase(main):005:0> put 'test', 'row2', 't1:b', 'value2'
0 row(s) in 0.0370 seconds
hbase(main):006:0> put 'test', 'row3', 't1:c', 'value3'
0 row(s) in 0.0450 seconds
3.查看插入的数据
hbase(main):007:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1288380727188, value=value1
(行号 column=列族:列, timestamp=时间版本时间搓, value=列值)
row2 column=cf:b, timestamp=1288380738440, value=value2
row3 column=cf:c, timestamp=1288380747365, value=value3
3 row(s) in 0.0590 seconds
4.读取单条记录
hbase(main):008:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=1288380727188, value=value1
1 row(s) in 0.0400 seconds
5.停用并删除数据表
hbase(main):012:0> disable 'test'
0 row(s) in 1.0930 seconds
hbase(main):013:0> drop 'test'
0 row(s) in 0.0770 seconds
先停用后删除
6.退出
hbase(main):014:0> exit
如果Ctrl+z退出需要手动杀死线程(不然连接不会被释放)
jps
杀死 Main线程号
10.日常命令
start-hbase.sh
stop-hbase.sh
dfs.namenode.support.allow.format=true
NN是否允许被格式化?在生产系统,把它设置为false,阻止任何格式化操作在一个运行的DFS上。
建议初次格式化后,修改配置禁止
dfs.client.write.exclude.nodes.cache.expiry.interval.millis=600000
最大周期去让DN保持在例外节点队列中。毫秒。操过此周期,先前被排除的DN将被移除缓存并被尝试再次申请Block。默认为10分钟。
dfs.heartbeat.interval=3
DN的心跳间隔3秒
dfs.namenode.heartbeat.recheck-interval
HeartbeatMonitor 会定期的检测已注册的数据节点的心跳包,每一次检测间隔300000毫秒即默认5分钟
Namenode判断一个DataNode死亡的时间为2* dfs.namenode.heartbeat.recheck-interval+10* dfs.heartbeat.interval即如果都为默认值为10分30秒