#Hbase的Java API操作之单行读
##【实验目的】
1)掌握Hbase Java API开发环境
2)学会调用Java接口读取一行数据
##【实验原理】
建立Java工程,调用Java API创建读取一行数据。
##【实验环境】
本次环境是:centos6.5+jdk1.7.0_79+hbase0.96+eclipse
host01是计算机名称对应ip地址为 192.168.0.131,可以在/etc/hosts文件中查看映射关系
工具在/simple/soft目录下
##【实验步骤】
###一、准备阶段
1.1 配置主机名和IP的映射关系。
如果你在Windows平台下使用Eclipse开发并执行代码调用Linux平台的Hbase,
则需要配置主机名和IP的映射关系。Linux上部署Hbase的主机名为host01,IP为192.168.0.131。
需要在C:\Windows\System32\drivers\etc目录下的hosts文件中添加内容192.168.0.131 host01。如图1所示
![]()
1.2 准备用于开发Java程序的eclipse。如图2所示
![]()
1.3 准备项目中所需的Hbase包。如图3所示
![]()
包的位置:$HBASE_HOME/lib,如图4所示
![]()
###二、程序编写
2.1 创建Java工程。
在eclipse中的项目列表中,右键点击,选择“new“—>”Java Project…”新建一个项目“GetData” 。 如图5所示
![]()
2.2 创建Java类。
在项目src目录下,右键点击,选择“新建”创建一个类文件名称为“GetTest”,并指定包名” com.simple.get” 。如图6所示
![]()
2.3 复制hbase相关jar包到lib文件夹。
在编写“GetTest”类之前需要把hbase相关的jar包导入,首先在项目根目录下创建一个文件夹lib,
把hbase相关jar包复制到该文件中 。如图7所示
![]()
2.4 将lib下所有的jar包导入到项目环境中。
首先全选lib文件夹下的jar包文件,右键点击,选择“build path”-->“add to build path”。
添加后,发现jar包被引用到了工程的Referenced Libraries中。如图8所示
![]()
2.5 创建程序的入口main方法。
在类“GetTest”中编写程序的入口main方法。如图9所示
![]()
编写代码如下。(注:在实验6中创建了该表,在实验7中插入了数据,这里不再做创建表和插入数据的操作。
如果没有测试表和数据,请回到前边的实验执行相关代码产生数据。)
```java
package com.simple.get;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
public class GetTest {
public static void main(String[] args) throws IOException {
// 一、配置文件设置
// 创建用于客户端的配置类实例
Configuration config = HBaseConfiguration.create();
// 设置连接zookeeper的地址
// hbase客户端连接的是zookeeper
config.set("hbase.zookeeper.quorum", "192.168.0.131:2181");
// 二、 获得要操作的表的对象。
// 第一个参数"config"为配置文件;第二个参数"account1"为数据库中的表名。
// (注:"account1"为上节中所创建的表)
HTable table = new HTable(config, "account1");
// 三、设置Get对象
// 设置要查找的行健值为"rk001"
Get get = new Get(Bytes.toBytes("rk001"));
// 四、根据Get对象获取查询结果Result对象
Result result = table.get(get);
// 五、设置要查询的列族名、列名
// 第一个参数"baseinfo"为列族名;第二个参数"name"为列名。
byte[] rk001_vals = result.getValue(Bytes.toBytes("baseinfo"), Bytes.toBytes("name"));
// 六、将结果转换为字符串并打印到控制台
System.out.println("行健为rk001、列族为baseinfo、列为name的值==>"+Bytes.toString(rk001_vals));
// 七、释放资源
table.close();
}
}
```
###三、程序测试
3.1 通过`start-all.sh`启动Hadoop服务,并通过`cd /simple/hbase-0.96-2-hadoop2/bin`
密令进入Hbase的bin目录下`./start-hbase.sh`启动Hbase服务。通过`jps`查看是否启动成功。
3.2 通过`./hbase shell`密令进入hbase shell。通过`create 'account1','baseinfo','contacts'`
密令创建account1表。并通过`list`查看是否创建成功。
3.3 执行代码。
选中测试类GetTest,右键点击选择”Run as”-->”Java Application”,程序将执行。查看控制台打印的日志,可以判断是否正确执行。如图10所示
![]()
注:如果控制台打印如下日志java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
无需理会。该异常是window平台没有查找到winutils.exe所打印的提示。如图11所示
![]()
###四、查询所有列的值
下面代码的操作步骤同上。这里不再重复。
4.1 插入测试数据代码。
向表account1的列族baseinfo下的列age中插入数据50,该值的行健为rk001.
(注:原先的表account1的列族baseinfo中只有一列name,下面的代码将插入新的列age)
```java
package com.simple.put;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
public class PutTest {
public static void main(String[] args) throws IOException {
// 一、配置文件设置
// 创建用于客户端的配置类实例
Configuration config = HBaseConfiguration.create();
// 设置连接zookeeper的地址
// hbase客户端连接的是zookeeper
config.set("hbase.zookeeper.quorum", "192.168.0.131:2181");
// 二、 获得要操作的表的对象。
// 第一个参数"config"为配置文件;第二个参数"account1"为数据库中的表名。
// (注:"account1"为上节中所创建的表)
HTable table = new HTable(config, "account1");
// 三、设置Put对象
// 设置行健值为"rk001"
Put put = new Put(Bytes.toBytes("rk001"));
// 设置列族、列、cell值
// 其中"baseinfo"位列族;"age"为列;"50"为cell值
put.add(Bytes.toBytes("baseinfo"), Bytes.toBytes("age"), Bytes.toBytes("55"));
// 四、插入一行数据
table.put(put);
// 五、释放资源
table.close();
}
}
```
执行代码后进入hbase shell查看结果。如图12所示
![]()
4.2 查询所有列的值。
代码如下。
```java
package com.simple.get;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
public class GetAllColumnsTest {
public static void main(String[] args) throws IOException {
// 一、配置文件设置
// 创建用于客户端的配置类实例
Configuration config = HBaseConfiguration.create();
// 设置连接zookeeper的地址
// hbase客户端连接的是zookeeper
config.set("hbase.zookeeper.quorum", "192.168.0.131:2181");
// 二、 获得要操作的表的对象。
// 第一个参数"config"为配置文件;第二个参数"account1"为数据库中的表名。
// (注:"account1"为上节中所创建的表)
HTable table = new HTable(config, "account1");
// 三、设置Get对象
// 设置要查找的行健值为"rk001"
Get get = new Get(Bytes.toBytes("rk001"));
// 四、根据Get对象获取查询结果Result对象
Result result = table.get(get);
for(KeyValue kv : result.list()){
String family = new String(kv.getFamily());
System.out.println(family);
String qualifier = new String(kv.getQualifier());
System.out.println(qualifier);
System.out.println(new String(kv.getValue()));
}
// 五、释放资源
table.close();
}
}
```
4.3 测试结果。如图13所示
![]()
#Hbase的Java API操作之扫描读
##【实验目的】
1)掌握Hbase Java API开发环境
2)学会调用Java接口读取所有数据
3)学会调用Java接口读取一定范围内的数据
##【实验原理】
建立Java工程,调用Java API创建读取所有数据和一定范围内的数据。
##【实验环境】
本次环境是:centos6.5+jdk1.7.0_79+hbase0.96+eclipse
host01是计算机名称对应ip地址为 192.168.0.131,可以在/etc/hosts文件中查看映射关系
工具在/simple/soft目录下
##【实验步骤】
###一、准备阶段
1.1 配置主机名和IP的映射关系。
如果你在Windows平台下使用Eclipse开发并执行代码调用Linux平台的Hbase,则需要配置主机名和IP的映射关系。Linux上部署Hbase的主机名为host01,IP为192.168.0.131。
需要在C:\Windows\System32\drivers\etc目录下的hosts文件中添加内容192.168.0.131 host01。如图1所示。
![]()
1.2 准备用于开发Java程序的eclipse。如图2所示。
1.3 准备项目中所需的Hbase包。如图3所示。
![]()
包的位置:$HBASE_HOME/lib,如图4所示。
###二、程序编写
2.1 创建Java工程。
在eclipse中的项目列表中,右键点击,选择“new“—>”Java Project…”新建一个项目“ScanData” 。 如图5所示。
2.2 创建Java类。
在项目src目录下,右键点击,选择“新建”创建一个类文件名称为“ScanTest”,并指定包名” com.simple.scan” 。如图6所示。
![]()
2.3 复制hbase相关jar包到lib文件夹。
在编写“ScanTest”类之前需要把hbase相关的jar包导入,首先在项目根目录下创建一个文件夹lib,把hbase相关jar包复制到该文件中 。如图7所示。
![]()
2.4 将lib下所有的jar包导入到项目环境中。
首先全选lib文件夹下的jar包文件,右键点击,选择“build path”-->“add to build path”。添加后,发现jar包被引用到了工程的Referenced Libraries中。如图8所示。
![]()
2.5 创建程序的入口main方法。
在类“ScanTest”中编写程序的入口main方法。如图9所示。
编写代码如下。(注:在实验6中创建了该表,在实验7、8中插入了数据,这里不再做创建表和插入数据的操作。如果没有测试表和数据,请回到前边的实验执行相关代码产生数据。)
```java
package com.simple.scan;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
public class ScanTest {
public static void main(String[] args) throws IOException {
// 一、配置文件设置
// 创建用于客户端的配置类实例
Configuration config = HBaseConfiguration.create();
// 设置连接zookeeper的地址
// hbase客户端连接的是zookeeper
config.set("hbase.zookeeper.quorum", "192.168.0.131:2181");
// 二、 获得要操作的表的对象。
// 第一个参数"config"为配置文件;第二个参数"account1"为数据库中的表名。
// (注:"account1"为上节中所创建的表)
HTable table = new HTable(config, "account1");
// 三、创建Scan对象
Scan scan = new Scan();
// 四、根据Scan对象获取查询结果ResultScanner对象resultScanner
ResultScanner resultScanner = table.getScanner(scan);
// 遍历打印列族为baseinfo、列为name的值
for (Result result : resultScanner) {
// 将结果转换为字符串并打印到控制台
System.out.println("查询account1中的所有数据==>"+Bytes.toString(result.getValue(Bytes.toBytes("baseinfo"), Bytes.toBytes("name"))));
}
// 五、释放资源
table.close();
}
}
```
###三、程序测试
3.1 通过`start-all.sh`启动Hadoop服务,并通过`cd /simple/hbase-0.96-2-hadoop2/bin`密令进入Hbase的bin目录下
`./start-hbase.sh`启动Hbase服务。通过`jps`查看是否启动成功。
3.2 通过`./hbase shell`密令进入hbase shell。通过`create 'account1','baseinfo','contacts'`密令创建account1表。通过`list`查看是否创建成功。
3.3 在hbase shell下通过`put 'account1','rk001','baseinfo:name,'zhangsan'`向数据库中插入第一条数据。
`put 'account1','rk002','baseinfo:name,'zhangsan1'`向数据库中插入第二条数据。`put 'account1','rk003','baseinfo:name,'zhangsan2'`向数据库中插入第三条数据。
通过`scan 'account1'`密令查看插入数据的信息。
3.4 执行代码。
选中测试类ScanTest,右键点击选择”Run as”-->”Java Application”,程序将执行。查看控制台打印的日志,可以判断是否正确执行。如图10所示。
![]()
注:如果控制台打印如下日志java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.无需理会。
该异常是window平台没有查找到winutils.exe所打印的提示。如图11所示。
![]()
###四、查询指定范围内的数据
下面代码的操作步骤同上。这里不再重复。
4.1 查询指定范围内的数据。
代码如下。
```java
package com.simple.scan;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
public class ScanSettingTest {
public static void main(String[] args) throws IOException {
// 一、配置文件设置
// 创建用于客户端的配置类实例
Configuration config = HBaseConfiguration.create();
// 设置连接zookeeper的地址
// hbase客户端连接的是zookeeper
config.set("hbase.zookeeper.quorum", "192.168.0.131:2181");
// 二、 获得要操作的表的对象。
// 第一个参数"config"为配置文件;第二个参数"account1"为数据库中的表名。
// (注:"account1"为上节中所创建的表)
HTable table = new HTable(config, "account1");
// 三、创建Scan对象
// 第一个参数"rk001"为行健的开始位置;第二个参数"rk003"为行健的结束位置
Scan scan = new Scan(Bytes.toBytes("rk001"), Bytes.toBytes("rk003"));
// 四、根据Scan对象获取查询结果ResultScanner对象resultScanner
ResultScanner resultScanner = table.getScanner(scan);
// 遍历打印列族为baseinfo、列为name的值
for (Result result : resultScanner) {
// 将结果转换为字符串并打印到控制台
System.out.println("查询account1中指定范围内的数据==>"+Bytes.toString(result.getValue(Bytes.toBytes("baseinfo"), Bytes.toBytes("name"))));
}
// 五、释放资源
table.close();
}
}
```
4.3 测试结果。
如图12所示。
![]()