windows 10环境下搭建基于HBase的Eclipse开发环境
Apache HBase是一个分布式的、面向列的开源数据库,其主要特点是:
- HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库
- 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理 HBase中的海量数据,利用Zookeeper作为其分布式协同服务
- 主要用来存储非结构化和半结构化的松散数据(列存NoSQL数据库)
本文用于指导hbase在windows10环境下单机版的使用,采用伪分布式。
1.1 准备工作
下载对应的软件版本:
- Windows10家庭版
- JDK 1.8.0_171-b11
- hbase-1.2.6.1
lHBase的伪分布模式是依赖于HDFS的,因此在安装HBase之前需要安装匹配版本的Hadoop。新建环境变量HADOOP_HOME,在path后添加:%HADOOP_HOME%\bin
Hadoop安装参考文章:https://www.cnblogs.com/taoweizhong/p/10502261.html
1.2 HBase的配置与启动
【JDK安装不再说明】
第一步:HBase解压软件
我使用的路径是:D:\Study\codeproject\hbase-1.2.6.1
第二步:修改HBase下的conf/hbase-env.cmd
set JAVA_HOME=C:\Java\jdk1.8.0_171
set HBASE_MANAGES_ZK=false
其他都使用默认值,无需修改。
第三步:修改HBase下的hbase-site.xml
D:\Study\codeproject\hbase-1.2.6.1\conf
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///D:/Study/codeproject/hbase-1.2.6.1/data</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>D:/Study/codeproject/hbase-1.2.6.1/data/tmp</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>127.0.0.1</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>D:/Study/codeproject/hbase-1.2.6.1/data/zoo</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<!--HBase以分布式模式进行,这个功能在win下不支持,写成false-->
<value>false</value>
</property>
</configuration>
第四步:启动HBase
D:\Study\codeproject\hbase-1.2.6.1\bin下打开命令行,输入start-hbase.cmd,启动HBase。
第五步:测试Shell
HBase启动后,打开一个新窗口,进入D:\Study\codeproject\hbase-1.2.6.1\bin,在命令行输入hbase shell,出现如下结果表示连接成功。
D:\Study\codeproject\hbase-1.2.6.1\bin>hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.6.1, rUnknown, Sun Jun 3 23:19:26 CDT 2018
hbase(main):001:0>
第六步:打开HBase主页GUI,在浏览器输入网址:http://127.0.0.1:16010/master-status
1.3 HBase的基本操作
第一步:创建表hbase_test有两个列族cf1和cf2
此表有两个列族,cf1和cf2,其中CF1和CF2下分别有两个列name和gender,Chinese和Math
hbase(main):010:0> create 'hbase_test', {NAME=>'cf1'}, {NAME=>'cf2'}
0 row(s) in 1.2440 seconds
=> Hbase::Table - hbase_test
切换到管理页面查看表:
第二步:向表中添加数据,在想HBase的表中添加数据的时候,只能一列一列的添加,不能同时添加多列。
hbase(main):011:0> put'hbase_test', '001','cf1:name','Tao'
0 row(s) in 0.0720 seconds
hbase(main):019:0> put'hbase_test', '002','cf1:gender','man'
0 row(s) in 0.0060 seconds
hbase(main):020:0>
hbase(main):021:0* put'hbase_test', '001','cf2:chinese','99'
0 row(s) in 0.0030 seconds
hbase(main):022:0> put'hbase_test', '001','cf2:math','100'
0 row(s) in 0.0040 seconds
这样表结构就起来了,其实比较自由,列族里边可以自由添加子列很方便。如果列族下没有子列,加不加冒号都是可以的。
如果在添加数据的时候,需要手动的设置时间戳,则在put命令的最后加上相应的时间戳,时间戳是long类型的,所以不需要加引号
hbase(main):045:0> put'hbase_test', '001','cf2:math','91',1478053832459
第三步:查看表中的所有数据
hbase(main):027:0* scan 'hbase_test'
ROW COLUMN+CELL
001 column=cf1:name, timestamp=1552210114388, value=Tao
001 column=cf2:chinese, timestamp=1552210284719, value=99
001 column=cf2:math, timestamp=1552210290155, value=100
002 column=cf1:gender, timestamp=1552210272044, value=man
2 row(s) in 0.0250 seconds
第四步:查看其中某一个Key的数据
hbase(main):028:0> get'hbase_test','001'
COLUMN CELL
cf1:name timestamp=1552210114388, value=Tao
cf2:chinese timestamp=1552210284719, value=99
cf2:math timestamp=1552210290155, value=100
3 row(s) in 0.0280 seconds
1.4 基于eclipse的HBase的java操作
第一步:在eclipse中创建如下demo代码(参考网络代码编写),注意:相关包的引入,否则编译不通过,同时HBase已经启动:
import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.HTablePool; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; public class HbaseTest { private HBaseAdmin admin = null; // 定义配置对象HBaseConfiguration private HBaseConfiguration cfg = null; public HbaseTest() throws Exception { Configuration HBASE_CONFIG = new Configuration(); HBASE_CONFIG.set("hbase.zookeeper.quorum", "127.0.0.1"); HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181"); //HBASE_CONFIG.set("hbase.master", "192.168.1.109:9001"); cfg = new HBaseConfiguration(HBASE_CONFIG); admin = new HBaseAdmin(cfg); } // 创建一张表,指定表名,列族 public void createTable(String tableName, String columnFarily)throws Exception { if (admin.tableExists(tableName)) { System.out.println(tableName + "存在!"); System.exit(0); } else { HTableDescriptor tableDesc = new HTableDescriptor(tableName); tableDesc.addFamily(new HColumnDescriptor(columnFarily)); admin.createTable(tableDesc); System.out.println("创建表成功!"); } } // Hbase获取所有的表信息 public List getAllTables() { List<String> tables = null; if (admin != null) { try { HTableDescriptor[] allTable = admin.listTables(); if (allTable.length > 0) tables = new ArrayList<String>(); for (HTableDescriptor hTableDescriptor : allTable) { tables.add(hTableDescriptor.getNameAsString()); System.out.println(hTableDescriptor.getNameAsString()); } } catch (IOException e) { e.printStackTrace(); } } return tables; } // Hbase中往某个表中添加一条记录 public boolean addOneRecord(String table, String key, String family,String col, byte[] dataIn) { HTablePool tp = new HTablePool(cfg, 1000); // HTable tb = (HTable) tp.getTable(table); Put put = new Put(key.getBytes()); put.add(family.getBytes(), col.getBytes(), dataIn); try { HTablePool pool = new HTablePool(cfg, 1000); pool.getTable(table).put(put); // tb.put(put); System.out.println("插入数据条" + key + "成功!!!"); return true; } catch (IOException e) { e.printStackTrace(); System.out.println("插入数据条" + key + "失败!!!"); return false; } } // Hbase表中记录信息的查询 public void getValueFromKey(String table, String key) { HTablePool tp = new HTablePool(cfg, 1000); // HTable tb = (HTable) tp.getTable(table); Get get = new Get(key.getBytes()); try { Result rs = tp.getTable(table).get(get); if (rs.raw().length == 0) { System.out.println("不存在关键字为" + key + "的行!!"); } else { for (KeyValue kv : rs.raw()) { System.out.println(new String(kv.getKey()) + " " + new String(kv.getValue())); } } } catch (IOException e) { e.printStackTrace(); } } // 显示所有数据,通过HTable Scan类获取已有表的信息 public void getAllData(String tableName) throws Exception { HTable table = new HTable(cfg, tableName); Scan scan = new Scan(); ResultScanner rs = table.getScanner(scan); for (Result r : rs) { for (KeyValue kv : r.raw()) { System.out.println(new String(kv.getKey())+ new String(kv.getValue())); } } } // Hbase表中记录信息的删除 public boolean deleteRecord(String table, String key) { HTablePool tp = new HTablePool(cfg, 1000); // HTable tb = (HTable) tp.getTable(table); Delete de = new Delete(key.getBytes()); try { tp.getTable(table).delete(de); return true; } catch (IOException e) { System.out.println("删除记录" + key + "异常!!!"); return false; } } // Hbase中表的删除 public boolean deleteTable(String table) { try { if (admin.tableExists(table)) { admin.disableTable(table); admin.deleteTable(table); System.out.println("删除表" + table + "!!!"); } return true; } catch (IOException e) { System.out.println("删除表" + table + "异常!!!"); return false; } } // 测试函数 public static void main(String[] args) { try { HbaseTest hbase = new HbaseTest(); hbase.createTable("hbase_test2", "cf1"); // hbase.getAllTables(); hbase.addOneRecord("hbase_test2", "id1", "cf1", "name", "Kite".getBytes()); hbase.addOneRecord("hbase_test2", "id1", "cf1", "address", "HW".getBytes()); // hbase.getValueFromKey("hbase_test2","id1"); // hbase.getAllData("hbase_test2"); // hbase.deleteRecord("hbase_test2", "id1"); // hbase.deleteTable("hbase_test2"); } catch (Exception e) { e.printStackTrace(); } } }
第二步:执行上述代码,成功之后eclipse打印如下信息(上述测试函数中注释掉的代码,可以分别放开测试并查看数据,这里不一一列举):
上述代码执行后结果打印如下:
DEBUG [main] - Connecting to LAPTOP-TAOTAO/192.168.1.104:59608
INFO [main] - Created hbase_test2
创建表成功!
DEBUG [main-SendThread(127.0.0.1:2181)] - Reading reply sessionid:0x16977330f120007, packet:: clientPath:null serverPath:null finished:false header:: 7,4 replyHeader:: 7,1108,0 request:: '/hbase/meta-region-server,F response:: #ffffffff0001a726567696f6e7365727665723a35393633392410ffffffd342ffffffce75323350425546a1aad4c4150544f502d54414f54414f10fffffff7ffffffd1318ffffff9dffffffa9ffffffccffffffb9ffffff972d100183,s{1080,1080,1552483046311,1552483046311,0,0,0,0,67,0,1080}
DEBUG [main-SendThread(127.0.0.1:2181)] - Reading reply sessionid:0x16977330f120007, packet:: clientPath:null serverPath:null finished:false header:: 8,8 replyHeader:: 8,1108,0 request:: '/hbase,F response:: v{'replication,'meta-region-server,'rs,'splitWAL,'backup-masters,'table-lock,'flush-table-proc,'region-in-transition,'online-snapshot,'master,'running,'recovering-regions,'draining,'namespace,'hbaseid,'table}
插入数据条id1成功!!!
插入数据条id1成功!!!
第三步:从HBase的命令行查看新建的表数据:
第四部:从图形界面查看: