【Hadoop】HBase Java API 练习
2016-12-30 16:00
477 查看
1 环境准备
1)成功搭建Hadoop-2.2.0开发环境2)成功启动HBase,通过HBase Shell进行测试
3)使用MyEclipse作为开发工具
4)使用Maven构建项目
2 项目创建
2.1 创建Project
由于我已经创建了项目,所以这里会报错,只要改下Artifact Id就可以。而你只需要输入没有使用过的Artifact Id。
2.2 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.szh</groupId> <artifactId>HBase</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <name>HBase</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hadoop.version>2.2.0</hadoop.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>0.98.23-hadoop2</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>0.98.23-hadoop2</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>0.98.23-hadoop2</version> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.7</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.1</version> <executions> <!-- Run shade goal on package phase --> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- add Main-Class to manifest file --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.szh.hbase.MyDriver</mainClass> </transformer> </transformers> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
在上面的pom.xml中我们导入了hadoop和hbase开发所需要的包,待会我们还要学习如何开发MapReduce和HBase的交互,所以先做好准备,使用Maven开发最好要保证网速,下载真的很慢!!!等待下载完毕….
2.3 MyHbase实例
使用Java API和使用HBase shell本质上是没有任何区别的,都是HBase里面的DDL操作,所以我们本次使用的例子跟HBase Shell 练习里面的例子是一样的,在这里我们先贴出局部代码,大家不用着急,最后会把项目代码给大家的。1)创建HBaseConfiguration来获取HBase的配置文件信息
static Configuration conf = null; static { conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "szh"); }
2)创建表格
/** * 创建表格 * @param tbName 表名 * @param cf 列族名 * @throws IOException * @throws ZooKeeperConnectionException * @throws MasterNotRunningException */ @SuppressWarnings({ "all" }) public static void createTable(String tbName,String[] cf) throws MasterNotRunningException, ZooKeeperConnectionException, IOException{ //用于执行操作 HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor desc = new HTableDescriptor(tbName); for(int i=0;i<cf.length;i++){ desc.addFamily(new HColumnDescriptor(cf[i])); } //判断表格是否存在 if(admin.tableExists(tbName)){ System.out.println(tbName+" exists"); System.exit(0); }else{ admin.createTable(desc); System.out.println("create table success"); } }
3)删除表格
public static void deleteTable(String tableName) throws MasterNotRunningException, ZooKeeperConnectionException, IOException{ //用于执行操作 HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor desc = new HTableDescriptor(tableName); //判断表格是否存在 if(admin.tableExists(tableName)){ admin.disable(tableName); admin.drop(tableName); System.out.println("delete table success"); }else{ System.out.println("table is not exist"); } }
4)插入数据
@SuppressWarnings("all") public static void add(String tableName,String rowKey,String family,String qualifier,String value) throws IOException{ Put put = new Put(Bytes.toBytes(rowKey)); HTable table = new HTable(conf, tableName); put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value)); table.put(put); System.out.println("add data success"); System.out.println("==========="); }
执行main函数:
public static void main(String[] args) { // TODO Auto-generated method stub String tablebName = "student"; String rowKey = "xiaoming"; String[] family = {"info","address","score"}; try { // createTable(tablebName, family); add(tablebName,rowKey,family[0],"age","18"); add(tablebName,rowKey,family[0],"birthday","1990-12-12"); add(tablebName,rowKey,family[0],"school","beijingdaxue"); add(tablebName,rowKey,family[1],"country","china"); add(tablebName,rowKey,family[1],"province","guangdong"); add(tablebName,rowKey,family[1],"city","shenzhen"); add(tablebName,rowKey,family[1],"yuwen","99"); add(tablebName,rowKey,family[1],"shuxue","98"); add(tablebName,rowKey,family[1],"yingyu","100"); } catch (MasterNotRunningException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ZooKeeperConnectionException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
使用HBase Shell查询结果,如下:
5)删除数据
public static void deleteAppointColumn(String tableName,String rowKey,String family,String qualifier) throws IOException{ HTable table = new HTable(conf,Bytes.toBytes(tableName)); Delete delete = new Delete(Bytes.toBytes(rowKey)); delete.deleteColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier)); table.delete(delete); System.out.println("delete data success"); System.out.println("==========="); }
执行main函数:
public static void main(String[] args) { // TODO Auto-generated method stub String tablebName = "student"; String rowKey = "xiaoming"; String[] family = {"info","address","score"}; try { deleteAppointColumn(tablebName,rowKey,family[1],"yuwen"); deleteAppointColumn(tablebName,rowKey,family[1],"shuxue"); deleteAppointColumn(tablebName,rowKey,family[1< f312 /span>],"yingyu"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
使用 HBase Shell 查询结果,如下:
6)更新数据
public static void update(String tableName,String rowKey,String family,String qualifier,String value) throws IOException{ Put put = new Put(Bytes.toBytes(rowKey)); HTable table = new HTable(conf, tableName); put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value)); table.put(put); System.out.println("update data success"); System.out.println("==========="); }
执行main函数:
public static void main(String[] args) { // TODO Auto-generated method stub String tablebName = "student"; String rowKey = "xiaoming"; String[] family = {"info","address","score"}; try { update(tablebName,rowKey,family[0],"age","100"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
使用HBase Shell查询,结果如下:
7)查询数据
7.1)全盘扫描
public static void scanAll(String tableName,String startRow,String stopRow) throws IOException{ HTable table = new HTable(conf, tableName); Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes(startRow)); scan.setStopRow(Bytes.toBytes(stopRow)); ResultScanner rs = null; try{ System.out.println("全盘扫描"); rs = table.getScanner(scan); for(Result r:rs){ for(KeyValue kv:r.list()){ System.out.println("rowKey: "+ Bytes.toString(kv.getRow()) +" family: "+ Bytes.toString(kv.getFamily()) +" qualifiter: "+Bytes.toString(kv.getQualifier()) +" value "+Bytes.toString(kv.getValue()) ); } } }finally{ if(rs!=null){ rs.close(); } } System.out.println("==========="); }
7.2)查询某一列族
public static void scanByFamily(String tableName,String startRow,String stopRow,String family) throws IOException{ HTable table = new HTable(conf, tableName); Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes(startRow)); scan.setStopRow(Bytes.toBytes(stopRow)); scan.addFamily(Bytes.toBytes(family)); ResultScanner rs = null; try{ System.out.println("查询某一列族"); rs = table.getScanner(scan); for(Result r:rs){ for(KeyValue kv:r.list()){ System.out.println("rowKey: "+ Bytes.toString(kv.getRow()) +" family: "+ Bytes.toString(kv.getFamily()) +" qualifiter: "+Bytes.toString(kv.getQualifier()) +" value "+Bytes.toString(kv.getValue()) ); } } }finally{ if(rs!=null){ rs.close(); } } System.out.println("==========="); }
7.3)查询某一列
public static void scanByColumns(String tableName,String startRow,String stopRow,String family,String qualifiter) throws IOException{ HTable table = new HTable(conf, tableName); Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes(startRow)); scan.setStopRow(Bytes.toBytes(stopRow)); scan.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifiter)); ResultScanner rs = null; try{ System.out.println("查询某一列"); rs = table.getScanner(scan); for(Result r:rs){ for(KeyValue kv:r.list()){ System.out.println("rowKey: "+ Bytes.toString(kv.getRow()) +" family: "+ Bytes.toString(kv.getFamily()) +" qualifiter: "+Bytes.toString(kv.getQualifier()) +" value "+Bytes.toString(kv.getValue()) ); } } }finally{ if(rs!=null){ rs.close(); } } System.out.println("==========="); }
7.4)查询某一列的多个版本
public static void getByVersion(String tableName,String rowKey,String family,String qualifier) throws IOException{ HTable table = new HTable(conf, Bytes.toBytes(tableName)); Get get = new Get(Bytes.toBytes(rowKey)); get.setMaxVersions(5); Result result = table.get(get); System.out.println("查询某一列多版本"); List<KeyValue> list = (List<KeyValue>) result.getColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier)); for (KeyValue kv : list) { System.out.println("rowKey: "+ Bytes.toString(kv.getRow()) +" family: "+ Bytes.toString(kv.getFamily()) +" qualifiter: "+Bytes.toString(kv.getQualifier()) +" value "+Bytes.toString(kv.getValue()) +" TimeStamp: "+kv.getTimestamp() ); } System.out.println("==========="); }
这里需要注意的是,0.98版本的HBase默认VERSIONS为1,所以如果你想要获取某一列多个版本数据的话,首先得去修改HBase该列所属的列族的VERSIONS,举个例子:
a. 进入HBase Shell
b. 输入一下命令
alter ‘student’,NAME=>’info’,VERSIONS => 5
查询修改结果:
describe ‘student’
更多HBase Shell细节 可查看HBase Shell 练习
7.5)查询某一行的数据
public static void getByRowKey(String tableName,String rowKey) throws IOException{ HTable table = new HTable(conf,Bytes.toBytes(tableName)); Get get = new Get(Bytes.toBytes(rowKey)); Result result = table.get(get); System.out.println("查询某一行"); for (KeyValue kv : result.list()) { System.out.println("rowKey: "+ Bytes.toString(kv.getRow()) +" family: "+ Bytes.toString(kv.getFamily()) +" qualifiter: "+Bytes.toString(kv.getQualifier()) +" value "+Bytes.toString(kv.getValue()) +" TimeStamp: "+kv.getTimestamp() ); } System.out.println("==========="); }
执行main函数:
public static void main(String[] args) { // TODO Auto-generated method stub String tablebName = "student"; String rowKey = "xiaoming"; String[] family = {"info","address","score"}; try { scanAll(tablebName,rowKey,rowKey); scanByFamily(tablebName,rowKey,rowKey,family[0]); scanByColumns(tablebName,rowKey,rowKey,family[0],"age"); getByVersion(tablebName,rowKey,family[0],"age"); getByRowKey(tablebName,rowKey); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
查看Console:
相关文章推荐
- hadoop_hbase Java API 介绍及使用示例
- hbase java api, NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguratio
- Hadoop学习笔记(十六)---HBase JAVA API
- Hadoop 2.6.0 hbase 0.98 Java API 调用实例
- hbase java Api练习
- JAVA api 远程hbase出错 org.apache.hadoop.hbase.client.RetriesExhaustedException
- hadoop2-HBase的Java API操作
- HBase Java API详解
- HBase Java API使用操作例子
- hbasejava api学习
- java通过api对hadoop的操作
- 黑马程序员-JavaAPI-16天-8(TreeMap练习-字母出现的次数)
- HBase之Java API
- HBase之Java API
- Hadoop总结:在java中使用FileSystem的api读写数据(能力工场--小马哥原创)
- Hadoop总结:在java中使用FileSystem的api读写数据(能力工场)
- HBase客户端Java API使用总结
- JAVA操作HDFS API(hadoop)
- Java的Reflect反射基础API练习
- java API开发hbase启动错误解决办法