最近在为公司搭建hadoop集群,安装hbase的时候出现了很多问题,下面写了我遇到的三个坑,如果你们按着我的步骤操作,应该是可以避开一些错误的(不能保证能行,但是可以参考),另外安装到sqoop的时候出现了标题的那个错误,并且当敲出hbase version查询hbase版本的时候,虽然有结果显示,但是还是报这个错误出来,这个问题翻了好多页的百度才找到解决办法,比较坑,所以放标题了,方便其他人查到。如果不看配置的,可以直接跳到最下面,看错误的解决办法。其他的错误我穿插在配置里面了,你们找一下吧。
版本选择:
Hadoop:3.1.2
Hbase:2.2.1
顺便我想说一下版本选择的问题,其实版本选择的话都选最新的一般都没问题,百度了兼容上的选择,很多都说Hadoop3.1.1+和Hbase2.1.1+是兼容的,而我这2.2.1的反正我后来试了也是可以的。而当我出现了上面hbase的GetJavaProperty的那个错误的时候,百度查到一篇文章说是版本问题,文章说换了hbase的版本之后就可以用了。。我不是想质疑别人,但是我真的很想问一下那个作者是不是真的成功了,因为我为此换了3个版本,2.16,2.11,2.2.1,一直还是报一样的错误,也许是需要再往下换几个版本才行,所以说菜有时候就真的只能花时间试。。换版本太花时间了,其实这个错误其实就是找不到这个类,找到办法解决就可以了。
还是写上遇到什么坑吧:
1.启动hbase之后jps没有出现Hmaster,并且日志报错regionserver.HRegionServer: Failed construction RegionServer
2.以用hbase shell,写命令,就出现 ERROR: KeeperErrorCode = NoNode for /hbase/master
3.找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty
Hadoop的安装我就不讲了,百度上很多教程,Hbase比较多问题我才说说而已。
1.下载Hbase的网址
这里有两个选择:
百度直接就找阿帕奇官网下载:https://hbase.apache.org/downloads.html
按道理来说这两个版本都能用。
另外就是各种版本可供选择:http://archive.apache.org/dist/hbase/.
这个自己选把,啥版本都有。
可以浏览器下载好丢进去虚拟机,或者直接在命令行上用wget下载下来也行。
2.解压
下载好之后,解压,放到自己指定的目录下改个名字(这个自己喜欢)
tar -zxvf hbase-2.1.1-bin.tar.gz
mv hbase-2.1.1 /opt/bigdata/hbase
3.修改环境变量和改配置文件
vi ~/.bash_profile
加上以下两行(按着自己的路径改)
export HBASE_HOME=/opt/bigdata/hbase
export PATH=$PATH:$HBASE_HOME/bin:/$HBASE_HOME/sbin
修改conf目录下的两个配置文件,这里比较重要:
hbase-env.sh这里有个坑,有些文章说要把HBASE_CLASSPATH改一下,别改,改了就出问题,改下面两行就行了。
export JAVA_HOME=/usr/java/jdk1.8.0_221
export HBASE_MANAGES_ZK=false
hbase-site.xml
注释看完都删掉吧
<configuration>
<property>
<name>hbase.rootdir</name>
<!– 这里建议指定HDFS上的目录为什么的话自己百度吧,端口号要与hdfs-site.xml中设为一致,hbase的这个目录不需要建,自动生成-->
<value>hdfs://hadoop-master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hadoop-master:60000</value>
</property>
<property>
<!–这个tmp目录可能没有,自己建一个指定吧,没有会出问题,why?自己度娘-->
<name>hbase.tmp.dir</name>
<value>/opt/Bigdata/hbase/tmp</value>
</property>
<property>
<!–我是伪分布式,只有一个节点,如果你们多个节点,都写上就行了,例:mini1:2181,mini2:2181,mini3:2181-->
<name>hbase.zookeeper.quorum</name>
<value>hadoop-master</value>
</property>
<property>
<!–我是用自己装的zookeeper,所以在zookeeper目录下找,有些人是在指向hbase里的zookeeper目录里的data,视情况而定吧-->
<name>hbase.zoopkeeper.property.dataDir</name>
<value>/opt/Bigdata/zookeeper/zookeeper_3.4.14/zkdata</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.regionserver.info.port</name>
<value>16030</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<!–这个一定要加!!不加就一用hbase shell就报一个"ERROR: KeeperErrorCode = NoNode for /hbase/master"错误,解决的刚刚说的第二个错-->
<name>zookeeper.znode.parent</name>
<value>/hbase-unsecure</value>
</property>
</configuration>
关于上面的zookeeper.znode.parent
配置指的是ZooKeeper中的Hbase的根ZNode。所有的Hbase的ZooKeeper会用这个目录配置相对路径。默认情况下,所有的Hbase的ZooKeeper文件路径是用相对路径,所以他们会都去这个目录下面。 默认: /hbase(取自hbase默认配置说明.)
有说法是改成/hbase/master/主机名
你们查查我上面写的错会查到很多,大家都可以试试,但是记得每一次你修改完zookeeper.znode.parent
这个配置,需要打开zookeeper
做以下操作:
./zookeeper/bin/zkCli.sh -server Commit-Master:2181,Commit-Slave-1:2181 #启动zookeeper的客户端
rmr /hbase (tab补齐一下就是你原本设置的zookeeper.znode.parent路径)
因为你每一次修改zookeeper都监控着,但是他不能覆盖路径,需要手动清除再覆盖。
这些配置我应该写的比较全的,有意见或者问题的可以评论区我们交流一下。
regionservers
vi regionservers
这个加上节点名字,如果有多个节点就都写进去就行了
hadoop-master
4.其他配置文件
接下来需要切到你的hbase目录下的lib目录找一个文件复制一下htrace-core4-4.2.0-incubating.jar文件到lib目录下,如果是2.1.x版本的,这个文件应该是htrace-core-3.1.0-incubating.jar,放的位置跟下面位置一样。
这个解决的是第一个启动不了Hmaster的问题。
cd /opt/bigdata/hbase/lib/client-facing-thirdparty
cp htrace-core4-4.2.0-incubating.jar ../ 或者 cp htrace-core4-4.2.0-incubating.jar /opt/bigdata/hbase/lib/
然后把hadoop etc目录下的两个文件复制过来一下
cd /opt/bigdata/hadoop/etc/hadoop
cp core-site.xml /opt/bigdata/hbase/conf/
cp hdfs-site.xml /opt/bigdata/hbase/conf/
这里好像看到有些人也复制其他的配置文件,我母鸡,反正能用就行,报错再说把。
最后这个问题,我们需要改一下hbase/bin/目录下的hbase文件
cd /opt/bigdata/hbase/bin
vi hbase
切到182行,在add_to_cp_if_exists “${HBASE_HOME}/hbase-server/target” 这里下面加上两行
# Needed for GetJavaProperty check below
add_to_cp_if_exists "${HBASE_HOME}/hbase-server/target/classes"
把下面大概186,187行的
#add the hbase jars for each module
for f in $HBASE_HOME/hbase-jars/hbase*.jar; do
if [[ $f = *sources.jar ]]
then
: # Skip sources.jar
elif [ -f $f ]
then
CLASSPATH=${CLASSPATH}:$f;
fi
done
这段删掉。
切到大概310行左右,在
if [ -n "${HADOOP_IN_PATH}" ] && [ -f "${HADOOP_IN_PATH}" ]; then
下面加上一段:
# If built hbase, temporarily add hbase-server*.jar to classpath for GetJavaProperty
# Exclude hbase-server*-tests.jar
temporary_cp=
for f in "${HBASE_HOME}"/lib/hbase-server*.jar; do
if [[ ! "${f}" =~ ^.*\-tests\.jar$ ]]; then
temporary_cp=":$f"
fi
done
然后把
HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH" "${HADOOP_IN_PATH}" \
改成
HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH${temporary_cp}" "${HADOOP_IN_PATH}" \
然后wq保存退出,重启一下hbase,就可以了。
很好!我知道你肯定想吐槽我不知道我写的什么东西,所以你再看看下面链接你就懂了。
https://reviews.apache.org/r/69299/diff/2/?expand=1
然后再查一下,正常了,其实我i也不知道这个报错有什么影响,因为就算不改,hbase好像是可以正常使用的。