hadoop+Zookeeper+HBase安装(两个namenode+两个hbase)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunxiaoju/article/details/85878696

1、hadoop+Zookeeper的安装请看:https://blog.csdn.net/sunxiaoju/article/details/85642409

2、在https://hbase.apache.org/downloads.html下载hbase,我们选择2.1.1版本的bin,如下图所示:

3、将下载好的hbase-2.1.1-bin.tar.gz通过如下命令传如到master节点:

scp /Users/sunxiaoju/Desktop/hbase/hbase-2.1.1-bin.tar.gz [email protected]:/home/sunftp/ftpdir/

如下图所示:

4、然后使用如下命令进行解压:

tar -xzvf hbase-2.1.1-bin.tar.gz

5、然后通过如下命令将解压后的文件夹移动到/usr/命令:

sudo mv hbase-2.1.1 /usr/

如下图所示:

6、配置hbase的环境变量编辑 /etc/profile 文件,通过如下命令进行编辑:

sudo vim /etc/profile

然后在该文件中的最后位置加入:

export HBASE_HOME=/usr/hbase-2.1.1
export PATH="$HBASE_HOME/bin:$PATH"

如下图所示:

7、保存退出,然后执行:source /etc/profile命令使之生效.

8、然后即可通过如下命令查看版本:

hbase version

此时会出现无法加载主类,如下错误信息:

错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hbase-2.1.1/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.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 2.1.1
Source code repository git://kalashnikov.local/Users/stack/checkouts/hbase revision=b60a92d6864ef27295027f5961cb46f9162d7637
Compiled by stack on Fri Oct 26 19:27:03 PDT 2018
From source with checksum 25696727867a6ae76c16a9bfb05ac677

如下图所示:

9、出现此问题的原因是hadoop的版本和hbase的版本不对应,由于我装的是hadoop-2.7.7的版本,所以重新下载一个hbase-2.0.4的版本即可,下载好之后重复3~7步骤,然后使用hbase version查看版本号,如下图所示:

10、修改配置文件,切换到 /usr/hbase-2.0.4/conf 下,如下图所示:

11、使用如下命令在hbase-2.0.4创建一个pids,用于存放用于运行hbase进程的pid文件:

sudo mkdir /usr/hbase-2.0.4/pids

如下图所示:

12、此时发现用户和组都是root的,那么需要通过如下命令修改:

sudo chown -R hadoop:hadoop /usr/hbase-2.0.4/pids

如下图所示:

13、修改hbase-env.sh,使用如下命令编辑:

sudo vim hbase-env.sh 

然后在文件末尾加入如下信息:

export JAVA_HOME=/usr/jdk1.8.0_191
export HADOOP_HOME=/usr/hadoop-2.7.7
export HBASE_HOME=/usr/hbase-2.0.4
export HBASE_CLASSPATH=/usr/hadoop-2.7.7/etc/hadoop
export HBASE_PID_DIR=/usr/hbase-2.0.4/pids
export HBASE_MANAGES_ZK=false

如下图所示:

其中HBASE_PID_DIR的路径就是刚才创建的pids文件夹路径,HBASE_MANAGES_ZK则表示禁用hbase自己的zookeeper。

14、在次创建一个tmp文件夹,然后修改所有者,如下图所示:

15、保存退出,然后修改 hbase-site.xml,编辑hbase-site.xml 文件,在<configuration>添加如下配置

        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://sunxj-hdm.myhd.com:9000/hbase</value>
                <description>The directory shared byregion servers.</description>
        </property>
        <!-- hbase端口 -->
        <property>
                <name>hbase.zookeeper.property.clientPort</name>
                <value>2181</value>
        </property>
        <!-- 超时时间 -->
        <property>
                <name>zookeeper.session.timeout</name>
                <value>120000</value>
        </property>
        <!--防止服务器时间不同步出错 -->
        <property>
                <name>hbase.master.maxclockskew</name>
                <value>150000</value>
        </property>
        <!-- 集群主机配置 -->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>sunxj-hdm.myhd.com,sunxj-hdm1.myhd.com,sunxj-hds1.myhd.com,sunxj-hds2.myhd.com</value>
        </property>
        <!--   路径存放 -->
        <property>
                <name>hbase.tmp.dir</name>
                <value>/usr/hbase-2.0.4/tmp</value>
        </property>
        <!-- true表示分布式 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <!-- 指定master -->
        <property>
                <name>hbase.master</name>
                <value>sunxj-hdm.myhd.com:60000</value>
         </property>

如下图所示:

16、使用如下命令修改regionservers指定hbase的主从,和hadoop的slaves文件配置一样:

sudo vim regionservers 

将文件修改为:

sunxj-hdm.myhd.com
sunxj-hdm1.myhd.com
sunxj-hds1.myhd.com
sunxj-hds2.myhd.com

如下图所示:

17、使用如下命令将hbase-2.0.4传输到master1,slave1,slave2节点上:

scp -r hbase-2.0.4 [email protected]:/home/sunftp/ftpdir/
scp -r hbase-2.0.4 [email protected]:/home/sunftp/ftpdir/
scp -r hbase-2.0.4 [email protected]:/home/sunftp/ftpdir/

18、然后在master1、slave1、slave2节点上分别执行如下命令,将hbase-2.0.4移动到/usr/目录:

sudo mv /home/sunftp/ftpdir/hbase-2.0.4 /usr/

如下图所示:

18、然后在master1、slave1、slave2节点上分别配置/etc/profile,将如下代码也加入到其他三个节点上:

export HBASE_HOME=/usr/hbase-2.0.4
export PATH="$HBASE_HOME/bin:$PATH"

19、然后在master1、slave1、slave2节点上分别执行source /etc/profile使之配置生效,可通过hbase version验证。

20、在成功启动Hadoop、zookeeper之后在master上启动hbase,使用如下命令进行启动:

start-hbase.sh

如下图所示:

21、然后用jps查看各个节点的进程情况,如下图所示:

master:

master1:

slave1:

slave2:

我们发现没有Hmaster进程,说明没有启动成功

22、通过cat  /usr/hbase-2.0.4/logs/hbase-hadoop-master-sunxj-hdm.log 查看日志:

2019-01-05 23:21:12,399 ERROR [Thread-14] master.HMaster: Failed to become active master
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
	at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
	at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1802)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1321)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3829)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1012)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:855)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)

	at org.apache.hadoop.ipc.Client.call(Client.java:1476)
	at org.apache.hadoop.ipc.Client.call(Client.java:1413)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
	at com.sun.proxy.$Proxy18.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:776)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
	at com.sun.proxy.$Proxy19.getFileInfo(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hbase.fs.HFileSystem$1.invoke(HFileSystem.java:372)
	at com.sun.proxy.$Proxy20.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2117)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1305)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
	at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1425)
	at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:245)
	at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:151)
	at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:122)
	at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:829)
	at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2234)
	at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:567)
	at java.lang.Thread.run(Thread.java:748)
2019-01-05 23:21:12,405 ERROR [Thread-14] master.HMaster: ***** ABORTING master sunxj-hdm.myhd.com,16000,1546701622936: Unhandled exception. Starting shutdown. *****
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
	at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
	at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1802)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1321)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3829)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1012)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:855)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)

	at org.apache.hadoop.ipc.Client.call(Client.java:1476)
	at org.apache.hadoop.ipc.Client.call(Client.java:1413)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
	at com.sun.proxy.$Proxy18.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:776)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
	at com.sun.proxy.$Proxy19.getFileInfo(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hbase.fs.HFileSystem$1.invoke(HFileSystem.java:372)
	at com.sun.proxy.$Proxy20.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2117)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1305)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
	at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1425)
	at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:245)
	at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:151)
	at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:122)
	at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:829)
	at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2234)
	at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:567)
	at java.lang.Thread.run(Thread.java:748)

如下图所示:

意思是hbase指定的namenode节点的状态是standby,我们查看两个namenode节点的状态确实是standby,如下图所示:

23、我们将hadoop、zookeeper、yarn重启。

重启顺序为zookeeper、hadoop、yarn,当有一个节点为active时,如下图所示:

24、在通过start-hbase.sh来启动,此时用jps来查看进程:

master:

master1:

slave1:

slave2:

25、然后通过web地址来查看,地址为:http://192.168.0.109:16010,如下图所示:

26、此时说明配置habase成功。

27、为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置。当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群。在master、master1、slave1、slave2节点的/usr/hbase-2.0.4/conf/ 目录下新增文件配置backup-masters,在其内添加要用做Backup Master的节点hostname,使用如下命令新建一个backup-masters,如果已存在则进行编辑

sudo vim /usr/hbase-2.0.4/conf/backup-masters

然后输入备用节点的hostname,我们在hbase-site.xml配置的hbase master是sunxj-hdm.myhd.com,那么我们备用的使用sunxj-hdm1.myhd.com,如下图所示:

29、然后使用stop-hbase.sh停止在使用start-hbase.sh启动,此时在两个节点上就会启动两个HMaster,但是在备用节点master1启动之后,master节点上的HMaster进程就会自动关闭,查看master上的日志提示的是与第21和22步的错误是相同的,由于在配置的时候配置的hadoop的主namenode配置到了sunxj-hdm.myhd.com(master)上,但是master的状态是standby,这就引出了当namenode节点来回切换的情况下,而hbase-site.xml中只配置了一个namenode节点,name此时hbase集群就会全部挂掉,解决此方法就是将hbase.rootdir配置成nameservice方式,何为nameservice方式,意思就是在hadoop中配置了nameservice方式,对于外部需要连接hadoop时,只关心nameservice,而不关心是哪个namenode,不管namenode如何切换,都会自动连接到active的哪个namenode节点上,因此需要先查看hadoop的hdfs-site.xml文件中的nameservice名称,如下图所示:

然后打开hbase-site.xml将原来的hbase.rootdir对应的hdfs://sunxj-hdm.myhd.com:9000/hbase更改为hdfs://master/hbase即可,注意在此处是不需要填写端口号的,如下图所示:

注意:将master,master1,slave1,slave2上的全部都修改。

30、再次启动hbase集群即可,查看各个节点的线程情况:

master:

master1:

slave1:

slave2:

31、通过web界面查看,如下图所示:

主节点:

备用节点:

32、此时说明hbase集群已经搭建好了,那么可以通过以下命令进入hbase的shell命令命令行:

hbase shell

如下图所示:

33、然后输入status可以查看hbase的状态,如下图所示:

意思是一个主hbase并且是活动的,一个是备用节点,一共有4个服务

34、通过如下命令创建一个表:

create 'person','name','age'

如下图所示:

其中person是表名,name和age是字段名

35、开始向表中插入数据使用如下命令:

put 'person','1','name','sun'
put 'person','1','age',24

意思是向person的第一行中的name列插入sun,向person的第一行中的age列插入24

36、通过scan '表名'来查看表中所有的记录,如下图所示:

37、具体的请看下表操作方法:

HBase Shell的一些基本操作命令,列出了几个常用的HBase Shell命令,如下:

名称 命令表达式
查看存在哪些表 list
创建表 create '表名称', '列名称1','列名称2','列名称N'
添加记录 put '表名称', '行名称', '列名称:', '值'
查看记录 get '表名称', '行名称'
查看表中的记录总数 count '表名称'
删除记录 delete '表名' ,'行名称' , '列名称'
删除一张表 先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称'
查看所有记录 scan "表名称"
查看某个表某个列中所有数据 scan "表名称" , ['列名称:']
更新记录 就是重写一遍进行覆

猜你喜欢

转载自blog.csdn.net/sunxiaoju/article/details/85878696