今天在ubuntu服务器上尝试安装hbase,参考了网上的教程,遇到了各种坑,所以写个博文记录以下,避免以后采坑。
首先给出参考的几篇文章链接:
Ubuntu16.04 下 hadoop的安装与配置(伪分布式环境)
Linux 下ZooKeeper安装
Hadoop2.7.1 安装提示SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException
Hadoop之Unable to load native-hadoop library问题解决
用Python3.6操作HBase之HBase-Thrift
使用python中的pyhdfs连接HDFS进行操作
在hbase的官网下载1.2.6版本,https://archive.apache.org/dist/hbase/1.2.6/
在1.2.6对应的文档中,我们发现需要安装jdk、zookeeper以及hadoop环境,http://hbase.apache.org/1.2/book.html
hbase1.2.6可使用的jdk是1.7和1.8,由于1.7太老了,这里以安装下载jdk1.8为例
hbase1.2.6可使用的hadoop版本是2.7.1+,这里以安装下载2.7.6为例
创建hadoop用户
sudo useradd -m hadoop -s /bin/bash #创建hadoop用户,并使用/bin/bash作为shell
sudo passwd hadoop #为hadoop用户设置密码,之后需要连续输入两次密码
sudo adduser hadoop sudo #为hadoop用户增加管理员权限
su - hadoop #切换当前用户为用户hadoop,输入刚设置的密码
接着安装ssh,设置ssh无密码登录:
sudo apt-get install openssh-server #安装SSH server
ssh localhost #登陆SSH,第一次登陆输入yes
exit #退出登录的ssh localhost
cd ~/.ssh/ #如果没法进入该目录,执行一次ssh localhost
ssh-keygen -t rsa
输入完 $ ssh-keygen -t rsa 语句以后,需要连续敲击三次回车。其中,第一次回车是让KEY存于默认位置,以方便后续的命令输入。第二次和第三次是确定passphrase,相关性不大。敲完回车后会出现一个图形秘钥。接着输入以下指令:
cat ./id_rsa.pub >> ./authorized_keys #加入授权
ssh localhost #此时已不需密码即可登录localhost,并可见下图。如果失败则可以搜索SSH免密码登录来寻求答案
登录成功后通过exit指令退出localhost,回到hadoop
安装jdk1.8
官网下载jdk1.8,https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载名为 jdk-8u221-linux-x64.tar.gz
下载后将文件上传至ubuntu服务器,将jdk1.8文件进行解压:
sudo tar -zxvf jdk-8u221-linux-x64.tar.gz -C /usr/lib
接着打开profile修改环境变量:
sudo vim /etc/profile
在文件的末尾追加以下信息:
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jdk1.8.0_221 # 目录要换成自己解压的jdk目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使环境变量生效:
source /etc/profile
设置系统默认jdk版本(记得将后面的jdk目录改成自己的jdk解压目录):
sudo update-alternatives --install /usr/bin/java java /usr/lib/jdk1.8.0_221/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jdk1.8.0_221/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jdk1.8.0_221/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jdk1.8.0_221/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jdk1.8.0_221/bin/javap 300
接着执行:
sudo update-alternatives --config java
如果是第一次安装jdk会有如下提示:
There is only one alternative in link group java (providing /usr/bin/java):/usr/lib/jdk1.8.0_221/bin/java
查看jdk版本:
java -version
如果终端打印出 java version"1.8.0_221" 信息,说明安装成功。
安装zookeeper
下载zookeeper的链接:http://mirror.bit.edu.cn/apache/zookeeper/
本文下载的是版本是3.4.14,下载后上传到服务器上:
sudo tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local # 解压文件
cd /usr/local # 进入解压目录
sudo mv zookeeper-3.4.14/ zookeeper # 重命名为zookeeper
sudo chown -R hadoop ./zookeeper # 更改权限,hadoop是我们创建的主机名
切换到zookeeper的conf文件下,备份zoo_sample.cfg,并打开编辑复制的zoo.cfg文件
cp zoo_sample.cfg zoo.cfg //copy一份到当前目录下,并命名为zoo.cfg
vim zoo.cfg
编辑下面两项:
dataDir=/etc/zookeeper
dataLogDir=/etc/zookeeper/log
然后创建/etc/zookeeper以及/etc/zookeeper/log文件夹,并修改权限:
cd /etc/
sudo mkdir zookeeper # 创建文件夹
sudo mldir zookeeper/log
sudo chown -R hadoop zookeeper/ # 修改文件所有者
sudo chmod 777 zookeeper/ # 修改读写权限
接着添加环境变量:
sudo vim /etc/profile
在文件末尾加入:
export ZOOKEEPER=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER/bin
刷新环境变量:
source /etc/profile
启动zookeeper:
zkServer.sh start # 启动
zkServer.sh status # 查看运行状态
启动客户端:
zkCli.sh # 启动客户端
quit # 退出客户端
安装hadoop
下载地址:http://mirrors.hust.edu.cn/apache/hadoop/common/
本文下载的hadoop版本为2.7.6,下载完后将文件上传至服务器。
通过以下指令进行解压:
sudo tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local # 解压文件
cd /usr/local # 进入解压目录
sudo mv hadoop-2.7.6 hadoop # 重命名为hadoop
sudo chown -R hadoop ./hadoop # 更改权限,hadoop是我们创建的主机名
打开profile添加环境变量:
sudo vim etc/profile
在文件的末尾加上以下内容,HADOOP_HOME是你自己解压的hasoop目录位置:
#set hadoop environment
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
更新环境变量:
source /etc/profile # 更新环境变量
hadoop version # 查看hadoop版本信息
接下来进行伪分布式配置:
首先进入/usr/local/hadoop/etc/hadoop/目录,打开hadoop-env.sh文件:
cd /usr/local/hadoop/etc/hadoop/
sudo vim hadoop-env.sh
修改JAVA_HOME:
export JAVA_HOME=/usr/lib/jdk1.8.0_221
接下来需要修改两个配置文件 core-site.xml 和 hdfs-site.xml:
用vim打开core-site.xml文件,添加如下信息:
<configuration><property><name>hadoop.tmp.dir</name><value>file:/usr/local/hadoop/tmp</value><description>Abase for other temporary directories.</description></property><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property>
</configuration>
接着打开hdfs-site.xml,添加如下信息:
<configuration><property><name>dfs.replication</name><value>1</value></property><property><name>dfs.namenode.name.dir</name><value>file:/usr/local/hadoop/tmp/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/usr/local/hadoop/tmp/dfs/data</value></property>
</configuration>
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(可参考官方教程),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
接下来检查hostname是否存在映射(若不检查,可能在hadoop格式化时报错:SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: xxx: xxx: Name or service not known) ,通过以下指令查看本机hostname:
hostname
接下来打开 /etc/hosts 文件看有没有映射信息,我的服务器hostname是tensorflowob则对应以下信息:
127.0.0.1 localhost tensoflowob # 查看该行是否存在,若不存在添加该映射信息
接着重启网络:
/etc/init.d/networking restart
最后测试hadoop:
cd /usr/local/hadoop # 打开hadoop目录
./bin/hdfs namenode -format # 格式化名称节点
./sbin/start-dfs.sh # 启动hadoop
jps # 查看启动结果
正常启动后通过jps指令,应该会显示以下四个信息:
4821 Jps
4459 DataNode
4348 NameNode
4622 SecondaryNameNode
关闭hadoop服务:
./sbin/stop-dfs.sh
如果在启动过程中出现“The authenticity of host ‘0.0.0.0 (0.0.0.0)’ can’t be established.”类似错误,登录root管理员,输入指令ufw disable,关闭防火墙,重启下系统即可。
安装hbase
我们安装好jdk和hadoop环境后,开始安装hbase,hbase1.2.6的下载链接:https://archive.apache.org/dist/hbase/1.2.6/
下载完成后上传至服务器,并进行解压:
sudo tar -zxvf hbase-1.2.6-bin.tar.gz -C /usr/localcd /usr/local
sudo mv hbase-1.2.6/ hbase # 修改文件名
接着配置环境变量:
sudo vim /etc/profile
在文件末尾加上:
# set hbase environment
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin
更新环境变量:
source /etc/profile # 更新环境变量
hbase version # 查看hbase版本信息
修改hbase的配置文件(这里需要修改4个文件):
进入到hbase的安装目录下的conf配置文件夹
1)首先修改hbase-env.sh文件:
cd /usr/local/hbase/conf
sudo vim hbase-env.sh
修改其中的:
export JAVA_HOME=/usr/lib/jdk1.8.0_221
export HBASE_MANAGES_ZK=false # 使用本机自带的zookeeper
2)接着修改hbase-site.xml文件:
<configuration><property><!-- 指定hbase在HDFS上的存储路径 --><name>hbase.rootdir</name><value>hdfs://localhost:9000/myhbase</value></property><property><!-- 指定hbase是分布式的 --><name>hbase.cluster.distributed</name><value>true</value></property><property><!-- 指定zk的地址,多个用','隔开 --><name>hbase.zookeeper.quorum</name><value>tensorflowob</value></property>
</configuration>
3)修改regionservers文件,配置从节点的主机名
sudo vim regionservers
清空里面的信息,将hadoop的节点信息添加进去即可(注意不要有多余的空格和回车)
tensoflowob
4)新建一个文件backup-masters配置hmaster的备份节点:
sudo vim backup-masters
这里将备份节点备份在hadoop上(可设置多个节点),在backup-masters中写入:
tensorflowob
接着,我们将hadoop的配置文件hdfs-site.xml core-site.xml放到hbase的conf下(当前目录在hbase的conf下):
sudo cp /usr/local/hadoop/etc/hadoop/core-site.xml ./
sudo cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ./
全部修改完后开始启动hbase,注意:启动hbase之前需要提前启动zookeeper和hadoop:
zkServer.sh start # 启动zookeeper
zkServer.sh status # 查看运行状态cd /usr/local/hadoop # 打开hadoop目录
./bin/hdfs namenode -format # 格式化名称节点,若之前格式化过请忽略此步骤
./sbin/start-dfs.sh # 启动hadoop
jps # 查看启动结果cd /usr/local/hbase/ # 进入hbase目录
./bin/start-hbase.sh # 开启hbase
jps # 查看启动结果# 如果要进入hbase的shell窗口,通过以下指令
cd /usr/local/hbase/bin # 进入hbase的bin目录
./hbase shell # 启动hbase shell
quit # 退出shell窗口
在hadoop启动过程后,通过jps指令可以看到启动了:DataNode,NameNode,SecondaryNameNode,Jps,QuorumPeerMain(这个是zookeeper启动的)五个进程。
在hbase启动过程后,通过jps指令查看,除了上面5个进程外还有HMaster和HRegionServer两个进程。
启动完后我们通过浏览器访问 10.2.14.137:16010 就能够进入hbase的管理页面了,其中10.2.14.137是服务器的地址,需要改成你自己的服务器地址,端口号16010是默认的,通过浏览器访问 10.2.14.137:50070 就能够进入hadoop的管理页面了,同样将端口号前的地址改成你自己的服务器地址。
安装thrift模块
hbase是用java语言写的,所以原生支持java,但如果想通过其他语言调用hbase数据库就需要安装thrift模块,本文需要使用python3去调用hbase的thrift模块,所以要在服务器端安装thrift模块,本文安装的是0.11.0版本。
thrift0.11.0版本下载链接:http://mirrors.hust.edu.cn/apache/thrift/0.11.0/thrift-0.11.0.tar.gz
接着安装所需要的依赖包:
apt-get install automake bison flex g++ git libboost1.55 libevent-dev libssl-dev libtool make pkg-config
解压编译安装:
sudo tar -zxvf thrift-0.11.0.tar.gz /usr/local/ # 解压
cd /usr/local
sudo mv thrift-0.11.0/ thrift # 更改文件名称
sudo chmod 777 -R thrift # 赋予读写权限
cd thrift
./configure --with-cpp --with-boost --with-python --without-csharp --with-java --without-erlang --without-perl --with-php --without-php_extension --without-ruby --without-haskell --without-go
sudo make
sudo make install
安装完成后进入到hbase的bin目录下启动thrift接口:
cd /usr/local/hbase/bin
./hbase-daemon.sh start thrift
开启thrift接口后可通过服务器的9090端口去访问hbase数据库。