天天看点

Hbase集群部署前要说明Zookeeper集群部署:Hadoop(hdfs)集群部署:Hbase集群部署:

前要说明

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

Hbase集群部署前要说明Zookeeper集群部署:Hadoop(hdfs)集群部署:Hbase集群部署:

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秒

继续阅读