环境:Linux16.0.4,Hadoop-2.7.3,zookeeper-3.4.10,HBase-1.3.0
这里,我已经安装好了hadoop完全分布式集群(不会安装的网页可以在网上百度,有很多教程),节点为:
Master(namenode) ip:192.168.8.4
Slave1(datanode) ip:192.168.8.5
Slave2(datanode) ip:192.168.8.6
如果不采用hbase自带的zookeeper,则安装hbaser之前需要先安装zookeeper
一、zookeeper-3.4.10完全分布式安装
(1)解压文件
ubuntuserver@Master:~$ tar -zxvf zookeeper-3.4.10.tar.gz
(2)移动文件位置
ubuntuserver@Master:~$ sudo mv zookeeper-3.4.10 /usr/local
(3)修改hosts文件内容如下:
ubuntuserver@Master:~$ cat /etc/hosts
127.0.0.1 localhost
192.168.8.4 Master
192.168.8.5 Slave1
192.168.8.6 Slave2
这里由于我已经在安装hadoop集群的时候已经是修改好了的,所以只是显示出来作为提醒不要忘了修改。
(4)修改zookeeper配置文件
1.复制zoo_sample.cfg文件为zoo.cfg文件
ubuntuserver@Master:/usr/local/zookeeper-3.4.10/conf$ sudo cp zoo_sample.cfg zoo.cfg
2.修改zoo.cfg文件参数如下
tickTime=2000initLimit=5syncLimit=2dataDir=/usr/local/storage/zookeeperclientPort=2181server.1=Master:2888:3888server.2=Slave1:2888:3888server.3=Slave2:2888:3888
(5)创建dataDir目录并设置权限
ubuntuserver@Master:/usr/local$ sudo chown -R ubuntuserver ./storage
同样在Slave1与Slave2中进行该步操作
(6)远程分发安装文件
ubuntuserver@Master:/usr/local$ scp -r zookeeper-3.4.10 Slave1:~
ubuntuserver@Master:/usr/local$ scp -r zookeeper-3.4.10 Slave2:~
在Slave1与Slave2中将安装文件mv 到/usr/local
(7)设置myid
conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字
ubuntuserver@Master:/usr/local$ echo "1" > ./storage/zookeeper/myid
ubuntuserver@Slave1:/usr/local$ echo "2" > ./storage/zookeeper/myid
ubuntuserver@Slave2:/usr/local$ echo "3" > ./storage/zookeeper/myid
(8)设置环境变量
ubuntuserver@Master:sudo vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10
export PATH=$ZOOKEEPER_HOME/bin:$PATH
ubuntuserver@Master:source /etc/profile
同样在Slave1与Slave2中设置环境变量
(9)启动zookeeper集群
对每一个节点进行启动
ubuntuserver@Master:~$ zkServer.sh start
ubuntuserver@Slave1:~$ zkServer.sh start
ubuntuserver@Slave2:~$ zkServer.sh start
对每一个节点执行zkServer.sh status命令可以查看该节点是leader还是follower
二、hbase-1.3.0完全分布式安装
(1)解压并移动文件
ubuntuserver@Master:~$ hbase-1.3.0-bin.tar.gz
ubuntuserver@Master:~$sudo mv hbase-1.3.0 /usr/local
(2)修改hbase-site.xml文件
修改内容如下:
<configuration>
<!--value要和hadoop的core-site.xml中Master及端口号一样-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.8.4:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--不要写成了hbase.master.port了,这个属性可以不配置-->
<property>
<name>hbase.master</name>
<value>hdfs://192.168.8.4:60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>Master:2181,Slave1:2181,Slave2:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/storage/zookeeper</value>
</property>
</configuration>
(3)创建hbase目录
ubuntuserver@Master:~$ hadoop fs -mkdir /hbase
(4)修改regionservers文件
将文件内容修改为与hadoop的slaves文件一样的内容。我这里的内容修改成了
Slave1
Slave2
(5)修改hbase-env.sh
找到#export JAVA_HOME=**************这行。修改为自己的JAVA_HOME,如
export JAVA_HOME=/usr/local/jdk1.8.0_111
同时
设置export HBASE_MANAGES_ZK=false
(6)
将$HADOOP_HOME/share/hadoop/tools/lib下面的aws-java-sdk-1.7.4.jar拷贝到hbase的lib目录下面。
如果不拷贝,会出现几个问题:
a.即使能进入命令行,但是在Hbase命令行中执行命令会报Caused by: java.lang.ClassNotFoundException: com.amazonaws.event.ProgressListener这个错误。
b.有可能HMaster能启动成功,但是RegionServer会启动不了。
(7)替换hbase-1.3.0/lib文件夹下面的hadoop包
经本人验证,第7步(替换hbase-1.3.0/lib文件夹下面的hadoop包)可以不做,不过看到网上有些安装教程有替换步骤,因此也将替换步骤写下来。
如果hadoop包与hadoop-2.7.3下面的不一致,则要将hadoop-2.7.3下面的包拷贝到hbase-1.3.0/lib下面。由于hbase-1.3.0是基于hadoop-2.5.1的,所以要先删 除。
a.删除hbase-1.3.0/lib下面的hadoop包
ubuntuserver@Master:/usr/local/hbase-1.3.0/lib$ rm -r hadoop*.jar
b.拷贝hadoop-2.7.3下面的hadoop包到hbase-1.3.0/lib下面
ubuntuserver@Master:~$ find /usr/local/hadoop/share/hadoop -name "hadoop*jar" | xargs -i cp {} /usr/local/hbase-1.3.0/lib
(8)修改环境变量
export HBASE_HOME=/usr/local/hbase-1.3.0
export PATH=$HBASE_HOME/bin:$PATH
三个节点都修改
(9)分发hbase-1.3.0到其他节点
ubuntuserver@Master:/usr/local$ scp -r hbase-1.3.0 Slave1:~
ubuntuserver@Master:/usr/local$ scp -r hbase-1.3.0 Slave2:~
将hbase-1.3.0移动到/usr/local下面
(10)重启三个节点
(11)依次启动hadoop集群,zookeeper集群(三个节点依次启动),hbase集群(start-hbase.sh)
即在Master执行:ubuntuserver@Master:~$ start-dfs.sh
在三个节点(Master,Slave1,Slave2)执行:
ubuntuserver@Master:~$ zkServer.sh start
ubuntuserver@Slave1:~$ zkServer.sh start
ubuntuserver@Slave2:~$ zkServer.sh start
然后在Master执行:ubuntuserver@Master:~$ start-hbase.sh
在Master输入:
ubuntuserver@Master:~$ jps
2339 QuorumPeerMain
2214 SecondaryNameNode
2598 Jps
1998 NameNode
2495 HMaster
如果看到HMaster与QuorumPeerMain表示Master启动正常。
在Slave1与Slave2输入:
ubuntuserver@Slave1:~$ jps
2065 QuorumPeerMain
2168 HRegionServer
2266 Jps
1935 DataNode看到QuorumPeerMain与HRegionServer表示启动正常。
安装成功后,进入Hbase 。
执行:hbase shell
参考:https://www.cnblogs.com/freeweb/p/5526080.html
然后可以通过端口号16010在Web查看Hbase状态:http://MasterIP:16010/
问题解决:
问题1:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hbase-1.3.0/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop-2.7.3/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]
这个是jar包冲突了。删除hbase中的slf4j-log4j12-1.7.5.jar。
问题2:
2018-06-04 21:12:59,636 ERROR [main] regionserver.HRegionServerCommandLine: Region server exiting
java.lang.RuntimeException: Failed construction of Regionserver: class org.apache.hadoop.hbase.regionserver.HRegionServer
at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:2698)
at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:64)
at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:126)
at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:2713)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:2696)
... 5 more
Caused by: java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.fs.s3a.S3AFileSystem could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2558)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2569)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2586)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2625)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2607)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
at org.apache.hadoop.hbase.util.FSUtils.getRootDir(FSUtils.java:1003)
at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:577)
... 10 more
Caused by: java.lang.NoClassDefFoundError: com/amazonaws/event/ProgressListener
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
... 22 more
Caused by: java.lang.ClassNotFoundException: com.amazonaws.event.ProgressListener
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 27 more
将$HADOOP_HOME/share/hadoop/tools/lib下面的aws-java-sdk-1.7.4.jar拷贝到hbase的lib目录下面。
最后贴张命令执行成功的图片: