大数据,Hbase,python
一、下载二、安装和配置
1. 搭建hadoop环境2. 安装3. 验证4. 安装模式配置
1) 伪分布式模式配置
(1)编辑 `/usr/local/hbase/conf/hbase-env.sh` 文件(2)编辑 `/usr/local/hbase/conf/hbase-site.xml` 文件 2) 单机模式配置
(1)编辑 `/usr/local/hbase/conf/hbase-env.sh` 文件(2)编辑 `/usr/local/hbase/conf/hbase-site.xml` 文件 三、启动
(i)先启动hadoop(ii)再启动Hbase(iii)进入Hbase shell界面:(iv)停止Hbase运行:(v)停止Hadoop运行:---- 一定要先关闭停止Hbase才能关闭Hadoop注意:这里启动关闭Hadoop和Hbase的顺序一定是:==启动Hadoop—>启动Hbase—>关闭Hbase—>关闭Hadoop== 四、配置文件的一些其他配置
(一)配置`/usr/local/hbase/conf/hbase-env.sh` 文件
1. 禁止Hbase查找Hadoop的Classs (二)配置`/usr/local/hbase/conf/hbase-env.sh` 文件
1. 关闭启动Hbase shell出现的警告 五、使用
例1.
1)==创建==`student`表:2)==插入==数据到`student`表:3)==删除==`student`表:4)==查询==`student`表:
大数据,Hbase,python在Hbase官网 http://archive.apache.org/dist/hbase/ 下载 hbase-2.2.2-bin.tar.gz。
二、安装和配置 1. 搭建hadoop环境首先确保安装好了Hadoop3.1.3,因为Hbase对Hadoop具有版本依赖性,并且所有操作是在新建的名为hadoop的用户下执行的。可参考我的另一篇博文https://blog.csdn.net/Acegem/article/details/122880274?spm=1001.2014.3001.5502。
2. 安装然后进行如下操作:
su hadoop # 切换到名为hadoop的用户 sudo tar -xzvf hbase-2.2.2-bin.tar.gz -C /usr/local # 解压到/usr/local/目录下 cd /usr/local sudo mv ./hbase-2.2.2 ./hbase # 重命名,方便使用 sudo chown -R hadoop ./hbase # 把hbase目录权限赋予给hadoop用户
配置环境变量:
打开终端输入sudo vim ~/.bashrc,将/usr/local/hbase/bin添加到环境变量中:
export PATH=$PATH:/usr/local/hbase/bin
可参考我的另一篇Spark的博文https://blog.csdn.net/Acegem/article/details/122878998?spm=1001.2014.3001.5502,这里有所有大数据相关的环境变量配置。
记得输入source ~/.bashrc使环境变量生效!
配置hbase变量:
输入
cd /usr/local/hbase sudo vim /usr/local/hbase/bin/hbase
将/usr/local/hbase/bin/hbase文件的162行处的CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar修改为:
CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar:/usr/local/hbase/lib/*
如下图:
输入
cd /usr/local/hase sudo source ./bin/hbase # 一定要有sudo
使hbase配置生效。
注:如果不进行这一步hbase文件的配置,下面输入./bin/hbase version进行版本验证会报错:
Error: Could not find or load main class org.apache.hadoop.hbase.util.GetJavaProperty。当然hbase shell也启动不了。
输入
cd /usr/local/hbase ./bin/hbase version
或直接输入/usr/local/hbase/bin/hbase version 进行验证。如果看到输出版本消息则表示安装成功,如下:
Hbase的安装运行有三种模式:单机模式、伪分布式模式、分布式模式。
我选择Hbase伪分布式模式配置,后面的单机模式配置参考即可。
伪分布式模式即结合HDFS,将Hbase数据存储到HDFS中,所以进行下面的配置前先在HDFS主目录下创建一个名为hbase的目录,以用来存放Hbase数据,并在下面的配置文件中进行Hbase在HDFS中的存储目录设置。
Hadoop的配置和操作在本文开头提到了我的另一篇博文,下面命令有问题的可以参考开头提到的另一篇博文。在HDFS主目录下创建一个名为hbase的目录的操作如下:
# ssh无密码登录。 ssh localhost cd /usr/local/hadoop # 启动HDFS ./sbin/start-dfs.sh # 在HDFS主目录中创建名为hbase的目录 ./bin/hdfs dfs -mkdir hbase # HDFS主目录即/user/hadoop。(因为之前在HDFS创建的hadoop用户即/user/hadoop), # 故等价 ./bin/hdfs dfs -mkdir /user/hadoop/hbase1) 伪分布式模式配置 (1)编辑 /usr/local/hbase/conf/hbase-env.sh 文件
修改内容如下:
# 第28行位置 export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 # 第31行位置 export Hbase_CLASSPATH=/usr/local/hbase/conf # 第126行位置 # Hbase_MANAGES_ZK设置为true,表示由hbase自己管理zookeeper,不需要单独的zookeeper。Hbase_MANAGES_ZK == hbase_manages_ZK(ZK==zookeeper) export Hbase_MANAGES_ZK=true
(这些都是已经存在的注释,将注释去掉再修改下即可,可以在vim模式下输入:+/来检索定位位置,使用n来进行Next翻页。)
(2)编辑 /usr/local/hbase/conf/hbase-site.xml 文件假设当前Hadoop集群在本机上运行在伪分布式模式下,其NameNode运行在9000端口。
将 /usr/local/hbase/conf/hbase-site.xml 文件的内容由:
改为:
hbase.rootdir hdfs://localhost:9000/hbase hbase.cluster.distributed true hbase.unsafe.stream.capability.enforce false
上面配置解释如下:
hbase.rootdir hdfs://localhost:9000/hbase hbase.cluster.distributed true hbase.unsafe.stream.capability.enforce false
注:
hbase.rootdir:Hbase数据的存储目录。
默认Hbase数据是存储在本地/tmp中的。如果不改这个配置,数据会在重启的时候丢失。所以这个目录要么设置成HDFS目录,要么在下面单机配置模式下设置成本地目录。hbase.unsafe.stream.capability.enforce:控制Hbase是否检查流功能(hflush / hsync)。
如果您打算在rootdir表示的LocalFileSystem上运行,那就禁用此选项。如果没有设置hbase.unsafe.stream.capability.enforce为false,那么,在启动Hbase以后,会出现无法找到HMaster进程的错误,启动后查看系统启动日志(/usr/local/hbase/logs/hbase-hadoop-master-ubuntu.log),会发现如下错误:
2020-01-25 15:04:56,916 ERROR [master/localhost:16000:becomeActiveMaster] master.HMaster: Failed to become active master java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so. Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it.2) 单机模式配置 (1)编辑 /usr/local/hbase/conf/hbase-env.sh 文件
修改内容如下:
# 第28行位置 export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 # 第126行位置。 # Hbase_MANAGES_ZK设置为true,表示由hbase自己管理zookeeper,不需要单独的zookeeper。 export Hbase_MANAGES_ZK=true
(这些都是已经存在的注释,将注释去掉再修改下即可,可以在vim模式下输入:+/来检索定位位置,使用n来进行Next翻页。)
(2)编辑 /usr/local/hbase/conf/hbase-site.xml 文件因为是单机模式配置,要先在本地新建一个目录来保存Hbase数据,如在/usr/local/hbase/目录下新建myHbaseData目录,即在/usr/local/hbase/myHbaseData目录下存放Hbase数据,并将其属性设置在配置文件中。如下:
将 /usr/local/hbase/conf/hbase-site.xml 文件的内容由:
改为:
三、启动 (i)先启动hadoophbase.rootdir file:///usr/local/hbase/myHbaseData
ssh localhost cd /usr/local/hadoop ./sbin/start-dfs.sh
输入jps,可以看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功。
(ii)再启动Hbase输入
cd /usr/local/hbase # 启动Hbase ./bin/start-hbase.sh
如下图(伪分布式模式为例):
输入jps可以看到HMaster,HRegionServer和HQuorumPeer都已经成功启动,表示Hbase也启动成功。
综合(i)(ii),此时应该出现的进程列表:
Jps # Hadoop进程 NameNode DataNode SecondaryNameNode # Hbase进程 Hmaster HregionServer HQuorumPeer(iii)进入Hbase shell界面:
输入
cd /usr/local/hbase # 启动Hbase shell ./bin/hbase shell(iv)停止Hbase运行:
输入
cd /usr/local/hbase # 停止Hbase运行 ./bin/stop-hbase.sh(v)停止Hadoop运行:---- 一定要先关闭停止Hbase才能关闭Hadoop
cd /usr/local/hadoop # 停止hadoop运行 ./sbin/stop-dfs.sh
注意:如果在操作Hbase的过程中发生错误,可以通过{Hbase_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
注意:这里启动关闭Hadoop和Hbase的顺序一定是:启动Hadoop—>启动Hbase—>关闭Hbase—>关闭Hadoop 四、配置文件的一些其他配置 (一)配置/usr/local/hbase/conf/hbase-env.sh 文件 1. 禁止Hbase查找Hadoop的Classs当在启动hbase时出现警告:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/hbase/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] SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/hbase/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] ...
要想让这些警告不显示,可以修改/usr/local/hbase/conf/hbase-env.sh 文件来禁止Hbase查找Hadoop的Classs,修改内容如下:
# 第139行位置 # 禁止Hbase查找Hadoop的Classs export Hbase_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"(二)配置/usr/local/hbase/conf/hbase-env.sh 文件 1. 关闭启动Hbase shell出现的警告
当启动Hbase Shell时,出现警告:
WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
跳出警告的原因就是Hbase没有识别到native-hadoop librarys这个库。当然这条警告是不影响 Hbase 运行的。如果想去掉这个警告,可以设置让Hbase识别到native-hadoop librarys这个库,而且这个库文件有助于提高 Hbase 的运行速度:
这里参考官方的解决方案:http://hbase.apache.org/book.html#hadoop.native.lib
其操作是在/usr/local/hbase/conf/hbase-env.sh文件中追加如下内容:
export LD_LIBRARY_PATH=/usr/local/hadoop/lib/native:$LD_LIBRARY_PATH
注:
如果你的 Hadoop没法加载本地库,则需要把下面的内容追加到 /usr/local/hadoop/etc/hadoop/hadoop-env.sh 或者 ~/.bashrc 中:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_HOME=/usr/local/hadoop export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"五、使用
打开上面说的Hbase shell,可以进行Hbase数据库操作。
例1.要创建如下图的表:
| id | info | ||
|---|---|---|---|
| name | gender | age | |
| 1 | zhangsan | F | 25 |
| 2 | lisi | M | 26 |
可在Hbase Shell中执行如下命令:
1)创建student表:hbase> create 'student', 'info'2)插入数据到student表:
// 插入第1个学生的信息。 hbase> put 'student', '1', 'info:name', 'zhangsan' hbase> put 'student', '1', 'info:gender', 'F' hbase> put 'student', '1', 'info:age', '25' // 插入第2个学生的信息。 hbase> put 'student', '2', 'info:name', 'lisi' hbase> put 'student', '2', 'info:gender', 'M' hbase> put 'student', '2', 'info:age', '26'3)删除student表:
hbase> disable 'student' hbase> drop 'student'4)查询student表:
# 查询id=2的学生信息。相当于mysql: select * ... where id = 1 hbase> get 'student', '2' # 查询所有数据(扫描全表)。相当于mysql: select * ... hbase> scan 'student'
结果如下:



