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 文件,在
添加如下配置
hbase.rootdir
hdfs://sunxj-hdm.myhd.com:9000/hbase
The directory shared byregion servers.
hbase.zookeeper.property.clientPort
2181
zookeeper.session.timeout
120000
hbase.master.maxclockskew
150000
hbase.zookeeper.quorum
sunxj-hdm.myhd.com,sunxj-hdm1.myhd.com,sunxj-hds1.myhd.com,sunxj-hds2.myhd.com
hbase.tmp.dir
/usr/hbase-2.0.4/tmp
hbase.cluster.distributed
true
hbase.master
sunxj-hdm.myhd.com:60000
如下图所示:
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.(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.(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 "表名称" , ['列名称:'] |
更新记录 | 就是重写一遍进行覆 |