第5章〓HBase的安装和基础编程HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价的计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。Hadoop安装以后,不包含HBase组件,需要另外安装。 本章首先介绍HBase的安装方法,并介绍HBase的两种不同模式的配置方法,包括单机模式和伪分布式模式;其次介绍一些操作HBase常用的Shell命令;最后,介绍如何使用Eclipse开发可以操作HBase数据库的Java应用程序。 5.1安装HBase 本节介绍HBase的安装方法,包括下载安装文件、配置环境变量、添加用户权限等。 5.1.1下载安装文件 HBase是Hadoop生态系统中的一个组件,但是,Hadoop安装以后,本身并不包含HBase,因此,需要单独安装HBase。登录Linux系统,在Linux系统(不是Windows系统)中打开火狐浏览器,访问本书官网的“下载专区”,在“软件”目录下下载HBase安装文件hbase2.2.2bin.tar.gz。火狐浏览器会默认把下载文件都保存到当前用户的下载目录,由于本书全部采用hadoop用户登录Linux系统,所以,hbase2.2.2bin.tar.gz文件会被保存到/home/hadoop/下载/目录下。 需要注意的是,如果是在Windows系统下载安装文件hbase2.2.2bin.tar.gz,则需要通过FTP软件上传到Linux系统的“/home/hadoop/下载/”目录下,这个目录是本书所有安装文件的中转站。 下载完安装文件后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安装的软件一般都存放在/usr/local/目录下。使用hadoop用户登录Linux系统,打开一个终端,执行如下命令:$ sudotar-zxf~/下载/hbase-2.2.2-bin.tar.gz-C/usr/local将解压的文件名hbase2.2.2改为hbase,以方便使用,命令如下:大数据基础编程、实验和案例教程(第2版)第5章HBase的安装和基础编程$ sudomv/usr/local/hbase-2.2.2/usr/local/hbase5.1.2配置环境变量 将HBase安装目录下的bin目录(即/usr/local/hbase/bin)添加到系统的PATH环境变量中,这样,每次启动HBase时就不需要到/usr/local/hbase目录下执行启动命令,方便HBase的使用。使用vim编辑器打开~/.bashrc文件,命令如下:$ vim ~/.bashrc打开.bashrc文件后,可以看到,已经存在如下PATH环境变量的配置信息,因为,之前在第3章安装Hadoop时,已经为Hadoop添加了PATH环境变量的配置信息:$ export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin这里需要把HBase的bin目录/usr/local/hbase/bin追加到PATH中。当要在PATH中继续加入新的路径时,只要用英文冒号“:”隔开,把新的路径加到后面即可,追加后的结果如下:$ export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/ local/hbase/bin添加后执行如下命令使设置生效:$ source ~/.bashrc5.1.3添加用户权限 需要为当前登录Linux系统的hadoop用户添加访问HBase目录的权限,将HBase安装目录下的所有文件的所有者改为hadoop,命令如下:$ cd/usr/local $ sudochown-Rhadoop./hbase5.1.4查看HBase版本信息 可以通过如下命令查看HBase版本信息,以确认HBase已经安装成功:$ /usr/local/hbase/bin/hbase version执行上述命令以后,如果出现如图51所示的信息,则说明安装成功。 图51查看HBase版本信息 5.2HBase的配置 HBase有3种运行模式,即单机模式、伪分布式模式和分布式模式。 (1) 单机模式: 采用本地文件系统存储数据。 (2) 伪分布式模式: 采用伪分布式模式的HDFS存储数据。 (3) 分布式模式: 采用分布式模式的HDFS存储数据。 本书仅介绍单机模式和伪分布式模式。 在进行HBase配置之前,需要确认已经安装了3个组件: JDK、Hadoop、SSH。HBase单机模式不需要安装Hadoop,伪分布式模式和分布式模式需要安装Hadoop。JDK、Hadoop和SSH的安装方法,已经在第3章做了详细介绍,如果已经按照第3章的方法安装了Hadoop,则这里不需要另外安装JDK、Hadoop和SSH。 5.2.1单机模式配置1. 配置hbaseenv.sh文件使用vim编辑器打开/usr/local/hbase/conf/hbaseenv.sh,命令如下:$ vim /usr/local/hbase/conf/hbase-env.sh打开hbaseenv.sh文件后,需要在hbaseenv.sh文件中配置JAVA环境变量,在第3章已经配置了JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162,这里可以直接复制该配置信息到hbaseenv.sh文件中。此外,还需要添加Zookeeper配置信息,配置HBASE_MANAGES_ZK为true,表示由HBase自己管理Zookeeper,不需要单独的Zookeeper,由于hbaseenv.sh文件中本来就存在这些变量的配置,因此,只需要删除前面的注释符号#并修改配置内容即可,修改后的hbaseenv.sh文件应该包含如下两行信息:export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export HBASE_MANAGES_ZK=true修改完成以后,保存hbaseenv.sh文件并退出vim编辑器。 2. 配置hbasesite.xml文件 使用vim编辑器打开并编辑/usr/local/hbase/conf/hbasesite.xml文件,命令如下:$ vim /usr/local/hbase/conf/hbase-site.xml在hbasesite.xml文件中,需要设置属性hbase.rootdir,用于指定HBase数据的存储位置,如果没有设置,则hbase.rootdir默认为/tmp/hbase${user.name},这意味着每次重启系统都会丢失数据。这里把hbase.rootdir设置为HBase安装目录下的hbasetmp文件夹,即/usr/local/hbase/hbasetmp,修改后的hbasesite.xml文件中的配置信息如下: hbase.rootdir file:///usr/local/hbase/hbase-tmp 保存hbasesite.xml文件,并退出vim编辑器。 3. 启动并运行HBase 现在就可以测试运行HBase,命令如下:$ cd /usr/local/hbase $ bin/start-hbase.sh#启动HBase $ bin/hbase shell#进入HBase Shell命令行模式进入HBase Shell命令行模式以后,用户可以通过输入Shell命令操作HBase数据库。成功启动HBase后会出现图52所示的界面。 图52进入HBase Shell模式 可以使用如下命令停止HBase运行:$ bin/stop-hbase.sh需要说明的是,如果在操作HBase的过程中发生错误,可以查看{HBASE_HOME}目录(即/usr/local/hbase)下的logs子目录中的日志文件,寻找可能的错误原因,然后搜索网络资料寻找相关解决方案。 5.2.2伪分布式模式配置1. 配置hbaseenv.sh文件使用vim编辑器打开/usr/local/hbase/conf/hbaseenv.sh,命令如下:$ vim /usr/local/hbase/conf/hbase-env.sh打开hbaseenv.sh文件后,需要在hbaseenv.sh文件中配置JAVA_HOME、HBASE_CLASSPATH和HBASE_MANAGES_ZK。其中,HBASE_CLASSPATH设置为本机hbase安装目录下的conf目录(即/usr/local/hbase/conf)。JAVA_HOME和HBASE_MANAGES_ZK的配置方法和上面单机模式配置方法相同。修改后的hbaseenv.sh文件应该包含如下3行信息:export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export HBASE_CLASSPATH=/usr/local/hbase/conf export HBASE_MANAGES_ZK=true修改完成以后,保存hbaseenv.sh文件并退出vim编辑器。 2. 配置hbasesite.xml文件 使用vim编辑器打开并编辑/usr/local/hbase/conf/hbasesite.xml文件,命令如下:$ vim /usr/local/hbase/conf/hbase-site.xml在hbasesite.xml文件中,需要设置属性hbase.rootdir,用于指定HBase数据的存储位置。在HBase伪分布式模式中,使用伪分布式模式的HDFS存储数据,因此,需要把hbase.rootdir设置为HBase在HDFS上的存储路径。根据第3章Hadoop伪分布式模式配置可以知道,HDFS的访问路径为hdfs://localhost:9000/,因为,这里设置hbase.rootdir为hdfs://localhost:9000/hbase。此外,由于采用了伪分布式模式,因此,还需要将属性hbase.cluster.distributed设置为true。修改后的hbasesite.xml文件中的配置信息如下: hbase.rootdir hdfs://localhost:9000/hbase hbase.cluster.distributed true hbase.unsafe.stream.capability.enforce false 保存hbasesite.xml文件,并退出vim编辑器。 3. 启动运行HBase 首先登录SSH,由于之前在第3章已经设置了无密码登录,因此这里不需要密码;然后切换至/usr/local/hadoop,启动Hadoop,让HDFS进入运行状态,从而可以为HBase存储数据,具体命令如下:$ ssh localhost $ cd /usr/local/hadoop $ ./sbin/start-dfs.sh输入命令jps,如果能够看到NameNode、DataNode和SecondaryNameNode这3个进程,则表示已经成功启动Hadoop。 然后启动HBase,命令如下:$ cd /usr/local/hbase $ bin/start-hbase.sh输入命令jps,如果出现以下进程,则说明HBase启动成功:Jps HMaster HQuorumPeer NameNode HRegionServer SecondaryNameNode DataNode现在可以进入HBase Shell模式,命令如下:$ bin/hbase shell#进入HBase Shell命令行模式进入HBase Shell命令行模式以后,用户可以通过输入Shell命令操作HBase数据库。 4. 停止运行HBase 最后可以使用如下命令停止运行HBase:$ bin/stop-hbase.sh如果在操作HBase的过程中发生错误,可以查看{HBASE_HOME}目录(即/usr/local/hbase)下的logs子目录中的日志文件,寻找可能的错误原因。 关闭HBase以后,如果不再使用Hadoop,就可以运行如下命令关闭Hadoop:$ cd /usr/local/hadoop $ ./sbin/stop-dfs.sh需要注意的是,启动、关闭Hadoop和HBase时,一定要按照启动Hadoop→启动HBase→关闭HBase→关闭Hadoop的顺序。 5.3HBase常用的Shell命令 在使用具体的Shell命令操作HBase数据之前,需要先启动Hadoop,再启动HBase和HBase Shell,进入Shell命令提示符状态,具体命令如下:$ cd /usr/local/hadoop $ ./sbin/start-dfs.sh $ cd /usr/local/hbase $ ./bin/start-hbase.sh $ ./bin/hbase shell5.3.1在HBase中创建表 假设这里要创建一个表student,该表包含Sname、Ssex、Sage、Sdept、course 5个字段。需要注意的是,在关系数据库(如MySQL)中,需要先创建数据库,再创建表,但是,在HBase数据库中,不需要创建数据库,只要直接创建表就可以。在HBase中创建student表的Shell命令如下:hbase>create 'student','Sname','Ssex','Sage','Sdept','course'对于HBase而言,在创建HBase表时,不需要自行创建行键,系统会默认一个属性作为行键,通常是把put命令操作中跟在表名后的第一个数据作为行键。 创建完student表后,可通过describe命令查看student表的基本信息。describe命令及其执行结果如图53所示。 图53describe命令执行结果 可以使用list命令查看当前HBase数据库中已经创建的表,命令如下:hbase>list5.3.2添加数据 HBase使用put命令添加数据,一次只能为一个表的一行数据的一个列(也就是一个单元格,单元格是HBase中的概念)添加一个数据,所以,直接用Shell命令插入数据效率很低,在实际应用中,一般都是利用编程操作数据。因为这里只要插入一条学生记录,所以,可以用Shell命令手工插入数据,命令如下:hbase>put 'student','95001','Sname','LiYing'上面的put命令会为student表添加学号为'95001'、名字为'LiYing'的一个单元格数据,其行键为95001,也就是说,系统默认把跟在表名student后面的第一个数据作为行键。 下面继续添加4个单元格的数据,用来记录LiYing同学的相关信息,命令如下:hbase>put 'student','95001','Ssex','male' hbase>put 'student','95001','Sage','22' hbase>put 'student','95001','Sdept','CS' hbase>put 'student','95001','course:math','80'5.3.3查看数据 HBase中有两个用于查看数据的命令。 (1) get命令: 用于查看表的某个单元格数据。 (2) scan命令: 用于查看某个表的全部数据。 例如,可以使用如下命令返回student表中95001行的数据:hbase>get 'student','95001'get命令的执行结果如图54所示。 图54get命令的执行结果 下面使用scan命令查询student表的全部数据:hbase>scan 'student'scan命令的执行结果如图55所示。 图55scan命令的执行结果 5.3.4删除数据 在HBase中用delete以及deleteall命令进行删除数据操作,两者的区别: delete命令用于删除一个单元格数据,是put的反向操作;而 deleteall命令用于删除一行数据。 首先使用delete命令删除student表中95001这行中的Ssex列的所有数据,命令如下:hbase>delete 'student','95001','Ssex'delete命令的执行结果如图56所示。 图56delete命令的执行结果 从中可以看出,95001这行中的Ssex列的所有数据已经被删除。 然后使用deleteall命令删除student表中的95001行的全部数据,命令如下:hbase>deleteall 'student','95001'5.3.5删除表 删除表需要分两步操作: 第一步让该表不可用;第二步删除表。例如,要删除student表,可以使用如下命令:hbase>disable 'student' hbase>drop 'student'5.3.6查询历史数据 在添加数据时,HBase会自动为添加的数据添加一个时间戳。在修改数据时,HBase会为修改后的数据生成一个新的版本(时间戳),从而完成“改”操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表时指定。 为了查询历史数据,这里创建一个teacher表,在创建表时,需要指定保存的版本数(假设指定为5),命令如下:hbase>create 'teacher',{NAME=>'username',VERSIONS=>5}插入数据,并更新数据,使其产生历史版本数据,需要注意的是,这里插入数据和更新数据都是使用put命令,具体如下:hbase>put 'teacher','91001','username','Mary' hbase>put 'teacher','91001','username','Mary1' hbase>put 'teacher','91001','username','Mary2' hbase>put 'teacher','91001','username','Mary3' hbase>put 'teacher','91001','username','Mary4' hbase>put 'teacher','91001','username','Mary5'查询时默认情况下会显示当前最新版本的数据,如果要查询历史数据,需要指定查询的历史版本数,由于上面设置了保存版本数为5,所以,在查询时指定的历史版本数的有效取值为1~5,具体命令如下:hbase>get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5} hbase>get 'teacher','91001',{COLUMN=>'username',VERSIONS=>3}上述get命令执行后的结果如图57所示。 图57get命令的执行结果 5.3.7退出HBase数据库 退出数据库操作,输入exit命令即可,命令如下:hbase>exit