- 浏览: 223849 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
synack:
写的很好,图文并茂,语言简单清晰,赞!
SkipList 跳表 -
king_c:
jiandandecaicai 写道你好,请教一下是如何通过E ...
从Hadoop URL 中读取数据 -
jiandandecaicai:
你好,请教一下是如何通过Eclipse来连接Hadop机群的, ...
从Hadoop URL 中读取数据
HBase提供了java api来对HBase进行一系列的管理涉及到对表的管理、数据的操作等。常用的API操作有:
1、 对表的创建、删除、显示以及修改等,可以用HBaseAdmin,一旦创建了表,那么可以通过HTable的实例来访问表,每次可以往表里增加数据。
2、 插入数据
创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。
3、 获取数据
要获取数据,使用Get对象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来调用。
4、 浏览每一行
通过Scan可以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan)来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan)都是返回一个Result。Result是一个
KeyValue的链表。
5、 删除
使用Delete来删除记录,通过调用HTable.delete(Delete)来执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)
6、 锁
新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。
7、 簇的访问
客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeper quorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。
以下是一个完整的代码示例,基于hbase-0.90.3编写(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.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
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.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseTest {
private static Configuration conf = null ;
/**
* 初始化配置
*/
static {
Configuration HBASE_CONFIG = new Configuration();
//与hbase/conf/hbase-site.xml中hbase.zookeeper.quorum配置的值相同
HBASE_CONFIG.set( "hbase.zookeeper.quorum" , "10.1.1.1" );
//与hbase/conf/hbase-site.xml中hbase.zookeeper.property.clientPort配置的值相同
HBASE_CONFIG.set( "hbase.zookeeper.property.clientPort" , "2181" );
conf = HBaseConfiguration.create(HBASE_CONFIG);
}
/**
* 创建一张表
*/
public static void creatTable(String tableName, String[] familys) throws Exception {
HBaseAdmin admin = new HBaseAdmin(conf);
if (admin.tableExists(tableName)) {
System.out.println( "table already exists!" );
} else {
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
for ( int i= 0 ; i<familys.length; i++){
tableDesc.addFamily( new HColumnDescriptor(familys[i]));
}
admin.createTable(tableDesc);
System.out.println( "create table " + tableName + " ok." );
}
}
/**
* 删除表
*/
public static void deleteTable(String tableName) throws Exception {
try {
HBaseAdmin admin = new HBaseAdmin(conf);
admin.disableTable(tableName);
admin.deleteTable(tableName);
System.out.println( "delete table " + tableName + " ok." );
} catch (MasterNotRunningException e) {
e.printStackTrace();
} catch (ZooKeeperConnectionException e) {
e.printStackTrace();
}
}
/**
* 插入一行记录
*/
public static void addRecord (String tableName, String rowKey, String family, String qualifier, String value)
throws Exception{
try {
HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
table.put(put);
System.out.println( "insert recored " + rowKey + " to table " + tableName + " ok." );
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 删除一行记录
*/
public static void delRecord (String tableName, String rowKey) throws IOException{
HTable table = new HTable(conf, tableName);
List list = new ArrayList();
Delete del = new Delete(rowKey.getBytes());
list.add(del);
table.delete(list);
System.out.println( "del recored " + rowKey + " ok." );
}
/**
* 查找一行记录
*/
public static void getOneRecord (String tableName, String rowKey) throws IOException{
HTable table = new HTable(conf, tableName);
Get get = new Get(rowKey.getBytes());
Result rs = table.get(get);
for (KeyValue kv : rs.raw()){
System.out.print( new String(kv.getRow()) + " " );
System.out.print( new String(kv.getFamily()) + ":" );
System.out.print( new String(kv.getQualifier()) + " " );
System.out.print(kv.getTimestamp() + " " );
System.out.println( new String(kv.getValue()));
}
}
/**
* 显示所有数据
*/
public static void getAllRecord (String tableName) {
try {
HTable table = new HTable(conf, tableName);
Scan s = new Scan();
ResultScanner ss = table.getScanner(s);
for (Result r:ss){
for (KeyValue kv : r.raw()){
System.out.print( new String(kv.getRow()) + " " );
System.out.print( new String(kv.getFamily()) + ":" );
System.out.print( new String(kv.getQualifier()) + " " );
System.out.print(kv.getTimestamp() + " " );
System.out.println( new String(kv.getValue()));
}
}
} catch (IOException e){
e.printStackTrace();
}
}
public static void main (String [] agrs) {
try {
String tablename = "scores" ;
String[] familys = { "grade" , "course" };
HBaseTest.creatTable(tablename, familys);
//add record zkb
HBaseTest.addRecord(tablename, "zkb" , "grade" , "" , "5" );
HBaseTest.addRecord(tablename, "zkb" , "course" , "" , "90" );
HBaseTest.addRecord(tablename, "zkb" , "course" , "math" , "97" );
HBaseTest.addRecord(tablename, "zkb" , "course" , "art" , "87" );
//add record baoniu
HBaseTest.addRecord(tablename, "baoniu" , "grade" , "" , "4" );
HBaseTest.addRecord(tablename, "baoniu" , "course" , "math" , "89" );
System.out.println( "===========get one record========" );
HBaseTest.getOneRecord(tablename, "zkb" );
System.out.println( "===========show all record========" );
HBaseTest.getAllRecord(tablename);
System.out.println( "===========del one record========" );
HBaseTest.delRecord(tablename, "baoniu" );
HBaseTest.getAllRecord(tablename);
System.out.println( "===========show all record========" );
HBaseTest.getAllRecord(tablename);
} catch (Exception e) {
e.printStackTrace();
}
}
} |
程序编译为一个jar包hbtest.jar,执行脚本:
#!/bin/sh source ~/.bash_profile export HADOOP_CLASSPATH=/home/admin/hadoop/hadoop-core- 0.20 . 2 -CDH3B4.jar:/home/admin/hbase/hbase- 0.90 . 3 .jar:/home/admin/zookeeper/zookeeper- 3.3 . 2 .jar
hadoop jar hbtest.jar |
输出结果是:
create table scores ok. 11 / 09 / 16 00 : 45 : 39 INFO zookeeper.ZooKeeper: Initiating client connection, connectString= 10.1 . 1.1 : 2181 sessionTimeout= 180000 watcher=hconnection
11 / 09 / 16 00 : 45 : 39 INFO zookeeper.ClientCnxn: Opening socket connection to server / 10.1 . 1.1 : 2181
11 / 09 / 16 00 : 45 : 39 INFO zookeeper.ClientCnxn: Socket connection established to search041134.sqa.cm4.tbsite.net/ 10.1 . 1.1 : 2181 , initiating session
11 / 09 / 16 00 : 45 : 39 INFO zookeeper.ClientCnxn: Session establishment complete on server search041134.sqa.cm4.tbsite.net/ 10.1 . 1.1 : 2181 , sessionid = 0x132614b5411007f , negotiated timeout = 180000
insert recored zkb to table scores ok. insert recored zkb to table scores ok. insert recored zkb to table scores ok. insert recored zkb to table scores ok. insert recored baoniu to table scores ok. insert recored baoniu to table scores ok. ===========get one record======== zkb course: 1316105139153 90
zkb course:art 1316105139156 87
zkb course:math 1316105139154 97
zkb grade: 1316105139149 5
===========show all record======== baoniu course:math 1316105139159 89
baoniu grade: 1316105139158 4
zkb course: 1316105139153 90
zkb course:art 1316105139156 87
zkb course:math 1316105139154 97
zkb grade: 1316105139149 5
===========del one record======== del recored baoniu ok. zkb course: 1316105139153 90
zkb course:art 1316105139156 87
zkb course:math 1316105139154 97
zkb grade: 1316105139149 5
===========show all record======== zkb course: 1316105139153 90
zkb course:art 1316105139156 87
zkb course:math 1316105139154 97
zkb grade: 1316105139149 5
|
参考文献:
HBase client API Guide(推荐,对hbase client API的说明比较详细)
另外一个例子:
package gucas.xiaoxia; import java.io.IOException; import java.nio.charset.Charset; 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.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; 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; import org.apache.hadoop.hbase.util.Bytes; public class MyClient { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //read config-file hbase-site.xml, hbase-default.xml Configuration conf = HBaseConfiguration.create(); //create table client Admin HBaseAdmin admin = new HBaseAdmin(conf); HColumnDescriptor[] columns = new HColumnDescriptor[2]; columns[0] = new HColumnDescriptor("books"); columns[1] = new HColumnDescriptor("catalogs"); HTableDescriptor htd = new HTableDescriptor("mytable"); htd.addFamily(columns[0]); htd.addFamily(columns[1]); //create table mytable admin.createTable(htd); //Run some operations HTable table = new HTable(conf, htd.getNameAsString()); //Put opt Put p1 = new Put(Bytes.toBytes("row1")); //Byte p1.add(byte[] column family, byte[] qualifier, byte[] value) p1.add( Bytes.toBytes("books"), Bytes.toBytes("name"), Bytes.toBytes("west jury")); table.put(p1); p1 = new Put(Bytes.toBytes("row2")); p1.add( Bytes.toBytes("books"), Bytes.toBytes("author"), Bytes.toBytes("xiaoxia")); table.put(p1); p1 = new Put(Bytes.toBytes("row2")); p1.add( Bytes.toBytes("catalogs"), Bytes.toBytes("name"), Bytes.toBytes("xiaoxia-catalogs")); table.put(p1); //edit row2 books:author value p1 = new Put(Bytes.toBytes("row2")); p1.add( Bytes.toBytes("books"), Bytes.toBytes("author"), Bytes.toBytes("xiaoxia-books")); table.put(p1); Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); for (Result result2 : scanner) { System.out.println("Scan : "+ result2); } scanner.close(); //get field value Get get = new Get("row1".getBytes()); Result result = table.get(get); System.out.println("get : "+ new String(result.getRow(),Charset.defaultCharset())+", "+new String(result.getValue("books".getBytes(), "name".getBytes()))); System.in.read(); //disable table first ,then delete the table System.out.println("disable table "); admin.disableTable("mytable".getBytes()); System.out.println("delete table "); admin.deleteTable("mytable".getBytes()); } }
发表评论
-
关于Hadoop的InputFormat类
2012-01-01 14:35 1601org.apache.hadoop.mapreduce. ... -
Hadoop之更快的排序
2012-01-01 14:18 1347键默认的排序处理是 ... -
Hbase分析报告
2012-01-01 13:55 1940Hbase分析报告 本 ... -
MapReduce的输入输出格式
2012-01-01 13:53 5042默认的mapper是IdentityMapper,默认的 ... -
Hadoop_Configuration
2011-12-28 16:35 2020刚开始接触Hadoop的API时,首先第一个就 ... -
MapReduce 动态设置 namenode HDFS 的URI
2011-12-28 16:25 2343开发MapReduce程序 一直都是在namenode 那 ... -
分布式数据库 HBase
2011-12-21 16:28 782觉的这篇文章介绍的比较详细,copy一下。作为记录。 ... -
Hadoop 集群 傻瓜式搭建手记
2011-12-21 16:21 1103关于Hadoop的配置,按照我的理解,应该有六个文件需要修改, ... -
什么是面向列开源分布式数据库Hbase
2011-12-21 16:22 2197HBase是一个分布式的、面向列的开源数据库, ... -
HBase访问接口
2011-12-19 10:45 0访问接口 HBase Shell Java cli ... -
HBase关键算法 / 流程
2011-12-19 10:45 1180关键算法 / 流程 region定位 系统如何找到某 ... -
HBase系统架构
2011-12-19 10:44 794Client 1 包含访问hbase的接口 ... -
Hfile存储结构
2011-12-19 10:44 874转自淘宝数据平台 HBase中的所有数据文件都存 ... -
HBASE物理存储
2011-12-19 10:43 9001 已经提到过,Table中的所有行都按照row key ... -
Hbase表的结构
2011-12-19 10:42 890逻辑视图 HBase以表的形式存储数据。表有行和列 ... -
HBase 第一篇
2011-12-18 15:45 961Welcome to Apache HBase! ... -
通过FileSystem API 读取hadoop文件系统数据
2011-12-14 11:11 1966有时无法应用 URL.setURLStreamHandler ... -
从Hadoop URL 中读取数据
2011-12-14 09:40 2675要从Hadoop文件系统中读取文件,最简单的方法就是使用jav ...
相关推荐
本节通过一个具体的编程实例来学习如何使用 HBase Java API 解决实际问题。在本实例中,首先创建一个学生成绩表 scores,用来存储学生各门课程的考试成绩,然后向 scores 添加数据。 表 scores 的概念视图如图 1 所...
**Java API** 是Java编程语言提供的应用程序接口,允许开发者使用Java来访问和操作Hadoop和HBase的功能。对于Hadoop,Java API主要包括`org.apache.hadoop.mapreduce`包下的类,如Job、Mapper、Reducer等,用于实现...
2. **代码示例**:提供实际的Java代码,演示如何编写Map和Reduce函数来处理HBase中的数据,以及如何使用HBaseInputFormat和HBaseOutputFormat与HBase交互。 3. **数据准备**:可能包含一些模拟数据或实际数据,用于...
然而,这一过程涉及到对Hadoop和HBase架构的深入了解,以及对Java编程的熟练掌握。以上提供的知识点涵盖了在Eclipse中设置HBase开发环境的步骤,以及如何编写和运行基本的HBase程序示例。这对于希望在实际项目中应用...
在Java编程环境中,链接并操作HBase是一种常见的任务,特别是在大数据处理和分布式存储的应用场景下。HBase是一个基于Google Bigtable设计的开源NoSQL数据库,它运行在Hadoop之上,提供高并发、低延迟的数据存储服务...
下面我们将深入探讨HBase 0.96版本中的关键Java编程知识点。 首先,理解HBase的基础架构至关重要。HBase是构建在Hadoop之上的,利用HDFS作为其底层存储。在Java中,我们通过HBase客户端API与HBase交互,这些API包括...
总结起来,这个“Hbase操作Hadoop分布式数据库java工程实例”是一个全面的学习资源,涵盖了HBase的基本概念、Java编程接口和测试实践。通过学习和实践这个实例,开发者能够掌握HBase在Hadoop环境下的实际应用,为大...
《HBase编程实践》 HBase,全称为Hadoop Base,是构建在Hadoop分布式文件系统(HDFS)之上的开源非关系型数据库,属于NoSQL数据库的一种。它设计用于处理大规模数据集,提供实时读写性能,尤其适用于大数据领域的...
4. **建立连接**: 通过`ConnectionFactory`创建一个`Connection`实例,这将用于执行HBase操作: ```java Connection connection = ConnectionFactory.createConnection(config); ``` 5. **操作数据**: 使用`...
3. **编写Java代码**:使用生成的Java客户端代码,创建HBase连接,实例化Thrift客户端,然后调用其提供的方法来访问HBase表。通常包括以下步骤: - 连接Thrift服务器:通过`TSocket`或`TFramedTransport`建立与...
在Java编程环境中,HBase是一个基于Google Bigtable设计的分布式、高性能、版本化的NoSQL数据库。多线程技术是Java程序性能优化的关键手段之一,当处理大数据量时,如HBase这样的系统尤其需要多线程来提升数据读写...
这个实例代码将帮助开发者理解和实现如何在Java环境中与HBase交互。 首先,要进行HBase操作,你需要在项目中添加相应的依赖。在`.classpath`和`.project`文件中,可能包含了项目的构建和依赖信息,比如Maven或...
在单机模式下,HBase的配置主要涉及到设置JAVA环境变量,并在 `hbase-env.sh` 文件中设置 `HBASE_MANAGES_ZK` 为 `true`,这表示HBase将管理ZooKeeper实例。同时,我们需要配置 `hbase-site.xml` 文件,以定义HBase...
它不支持复杂的查询,但对于快速检查和监控HBase实例非常有用。 7. **HBase MapReduce**:MapReduce是Hadoop处理大数据的主要工具,HBase与MapReduce结合可以进行批量数据处理和分析。通过编写MapReduce作业,可以...
在ella-hbase-0.96.2中,开发者可以直接利用HBase的Table接口创建实例,然后通过Get或Scan对象来读取数据。例如,可以创建一个Get对象来指定行键,然后调用Table的get方法获取特定行的数据。对于范围查询,可以创建...
Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)兼容,因此非常适合编写HBase的客户端程序。 首先,确保你的开发环境已经配置好,包括安装了Scala、Maven、Hadoop和HBase。在Maven项目中,你需要在`pom.xml`...
- 修改`/usr/local/hbase/conf/hbase-env.sh`,设置`JAVA_HOME`为JDK的安装路径,并设置`HBASE_MANAGES_ZK`为`true`,表示HBase管理自己的ZooKeeper实例。 - 配置`/usr/local/hbase/conf/hbase-site.xml`,尤其是`...
对于更复杂的操作,比如使用Java API编程,我们首先需要在Java程序中建立与HBase的连接。这通常涉及导入相关库,初始化HBase的配置,并创建一个HConnection实例。例如: ```java import org.apache.hadoop.hbase....
Java提供了Thread类以及ExecutorService框架来支持多线程编程,或者使用CompletableFuture进行异步处理。 5. **数据存储**:爬取的数据通常需要保存起来,可能是文件系统、数据库(如MySQL、MongoDB)或NoSQL存储...