hadoop:hadoop-2.2.0
hbase:hbase-0.96.0
1.org.apache.hadoop.hbase.client.Put
<1>取消了无参的构造方法
<2>Put类不再继承Writable类
0.94.6时public class Put extends Mutation implements HeapSize, Writable, Comparable<Row>
0.96.0时public class Put extends Mutation implements HeapSize, Comparable<Row>
解决方法:
由public class MonthUserLoginTimeIndexReducer extends Reducer<BytesWritable,MonthUserLoginTimeIndexWritable, ImmutableBytesWritable, Writable> {
改public class MonthUserLoginTimeIndexReducer extends Reducer<BytesWritable,MonthUserLoginTimeIndexWritable, ImmutableBytesWritable, Put> {
2.org.apache.hadoop.hbase.client.Mutation.familyMap
org.apache.hadoop.hbase.client.Mutation.familyMap类型改变:
/**
* 0.94.6
* protected Map<byte[],List<KeyValue>> familyMap
*
* 0.96.*
* protected NavigableMap<byte[],List<Cell>> familyMap
* org.apache.hadoop.hbase.Cell hbase-0.94.*中是没有的
*/
org.apache.hadoop.hbase.KeyValue的改变:
/**
* 0.94.*
* public class KeyValue extends Object implements Writable, HeapSize
*
* 0.96.0
* public class KeyValue extends Object implements Cell, HeapSize, Cloneable
*/
解决方法:将代码中的List<KeyValue>改成List<Cell>
3. org.apache.hadoop.hbase.KeyValue
0.96.0中方法getFamily已被弃用(Deprecated),改成方法getFamilyArray()
4.org.apache.hadoop.hbase.HTableDescriptor
类org.apache.hadoop.hbase.HTableDescriptor的构造方法public HTableDescriptor(String name)已被弃用(Deprecated)
解决方法:使用public HTableDescriptor(TableName name)
旧:HTableDescriptor tableDesc = new HTableDescriptor(tableName);
新:HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));
5.org.apache.hadoop.hbase.client.HTablePool
类org.apache.hadoop.hbase.client.HTablePool整个被弃用(Deprecated)
解决方法:使用HConnection.getTable(String)代替,HConnection是个接口,类CoprocessorHConnection是它唯一的实现类:
HRegionServer hRegionServer = new HRegionServer(conf) ;
HConnection connection = HConnectionManager.createConnection(conf);
hConnection = new CoprocessorHConnection(connection,hRegionServer);
6.org.apache.hadoop.hbase.client.Result
方法public KeyValue[] raw()被弃用(Deprecated),建议使用public Cell[] rawCells()
方法getRow被弃用(Deprecated)
方法getFamily被弃用(Deprecated)
方法getQualifier被弃用(Deprecated)
方法getValue被弃用(Deprecated)
方法public List<KeyValue> getColumn(byte[] family,byte[] qualifier)被弃用(Deprecated)
方法public KeyValue getColumnLatest(byte[] family,byte[] qualifier)被弃用(Deprecated)
Cell中:改成以下方法
getRowArray()
getFamilyArray()
getQualifierArray()
getValueArray()
Result中:增加如下方法
public List<KeyValue> getColumnCells(byte[] family,byte[] qualifier)
public KeyValue getColumnLatestCell(byte[] family,byte[] qualifier)
改动:所有ipeijian_data中凡是和【新增用户活跃用户流失用户】相关的都做如下变化:
旧代码:if (value.raw().length == 1
新代码:if (value.rawCells().length == 1
7.job中设置TableInputFormat.SCAN
0.96.0中去掉了方法:public void write(DataOutput out)throws IOException
之前版本使用conf.set(TableInputFormat.SCAN, StatUtils.convertScanToString(scan));进行设置
StatUtils.convertScanToString的具体实现为:
public static String convertScanToString(Scan scan) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(out);
scan.write(dos);
return Base64.encodeBytes(out.toByteArray());
}
该方法的实现与TableMapReduceUtil.convertScanToString(Scan scan)是一样的。
但是当hbase升级到了0.96.*是对于类Scan弃用(不仅仅是Deprecated,而是Deleted)了方法write,所以上面
的实现变为不正确
hbase0.96.*中对该方法进行了重新的实现:
public static String convertScanToString(Scan scan) throws IOException {
ClientProtos.Scan proto = ProtobufUtil.toScan(scan);
return Base64.encodeBytes(proto.toByteArray());
}
所以做如下更改:
StatUtils类中方法convertScanToString的实现做如上更改以适配hbase0.96.*
8.cn.m15.ipj.db.hbase.MyPut
自定义的Put类,比传统的Put类多一个length,原版和新版代码比较:
原版:(红色字体为API变为新版时报错的地方)
public class MyPut extends Put {
public MyPut(byte[] row, int length) {
//原因是put的无参构造方法已经在新本中消失
if (row == null || length > HConstants.MAX_ROW_LENGTH) {
throw new IllegalArgumentException(“Row key is invalid”);
}
this.row = Arrays.copyOf(row, length);
this.ts = HConstants.LATEST_TIMESTAMP;
}
public MyPut add(byte[] family, byte[] qualifier, long ts, byte[] value,int length) {
List<KeyValue> list = getKeyValueList(family);
KeyValue kv = createPutKeyValue(family, qualifier, ts, value, length);
list.add(kv);
familyMap.put(kv.getFamily(), list);
//familyMap的类型已经改变
return this;
}
private List<KeyValue> getKeyValueList(byte[] family) {
List<KeyValue> list = familyMap.get(family);
//familyMap的类型已经改变
if (list == null) {
list = new ArrayList<KeyValue>(0);
}
return list;
}
private KeyValue createPutKeyValue(byte[] family, byte[] qualifier,long ts, byte[] value, int length) {
return new KeyValue(this.row, 0, this.row.length, family, 0,
family.length, qualifier, 0, qualifier.length, ts,
KeyValue.Type.Put, value, 0, length);
}
}
更改之后:
public MyPut(byte[] row, int length) {
super(row,length);
//新增加
if (row == null || length > HConstants.MAX_ROW_LENGTH) {
throw new IllegalArgumentException(“Row key is invalid”);
}
this.row = Arrays.copyOf(row, length);
this.ts = HConstants.LATEST_TIMESTAMP;
}
public MyPut add(byte[] family, byte[] qualifier, long ts, byte[] value,int length) {
List<Cell> list = getCellsList(family);
KeyValue kv = createPutKeyValue(family, qualifier, ts, value, length);
list.add(kv);
familyMap.put(CellUtil.cloneFamily(kv), list);
return this;
}
private List<Cell> getCellsList(byte[] family) {
List<Cell> list = familyMap.get(family);
if (list == null) {
list = new ArrayList<Cell>(0);
}
return list;
}
private KeyValue createPutKeyValue(byte[] family, byte[] qualifier,long ts, byte[] value, int length) {
return new KeyValue(this.row, 0, this.row.length, family, 0,family.length, qualifier, 0, qualifier.length, ts,
KeyValue.Type.Put, value, 0, length);
}
}
package com.test.hbase; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.TableName; 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.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; import org.apache.hadoop.hbase.Cell; public class HbaseTest { private static Configuration conf = null; /** * 初始化配置 */ static { conf = HBaseConfiguration.create(); } /** * 创建表操作 * * @throws IOException * @throws ZooKeeperConnectionException * @throws MasterNotRunningException */ public void createTable(String tableName, String[] cfs) throws MasterNotRunningException, ZooKeeperConnectionException, IOException { HBaseAdmin admin = new HBaseAdmin(conf); if (admin.tableExists(tableName)) { System.out.println("表已经存在!"); } else { HTableDescriptor tableDesc = new HTableDescriptor( TableName.valueOf(tableName)); for (int i = 0; i < cfs.length; i++) { tableDesc.addFamily(new HColumnDescriptor(cfs[i])); } admin.createTable(tableDesc); admin.close(); System.out.println("表创建成功!"); } } /** * 删除表操作 */ public void deleteTable(String tableName) { HBaseAdmin admin; try { admin = new HBaseAdmin(conf); admin.disableTable(tableName); admin.deleteTable(tableName); admin.close(); System.out.println("表删除成功!"); } 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(); } } /** * 插入一行记录 */ public void writeRow(String tableName, String[] cfs) { try { HTable table = new HTable(conf, tableName); Put put = new Put(Bytes.toBytes("row1")); for (int j = 0; j < cfs.length; j++) { put.add(Bytes.toBytes(cfs[j]), Bytes.toBytes(String.valueOf(1)), Bytes.toBytes("value_1")); } table.close(); System.out.println("添加成功!"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 删除一行记录 */ public void deleteRow(String tableName, String rowKey) { try { HTable table = new HTable(conf, tableName); Delete dl = new Delete(rowKey.getBytes()); table.delete(dl); table.close(); System.out.println("删除行成功!"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 查找一条记录 */ public static void selectRow(String tableName, String rowKey) { try { HTable table = new HTable(conf, tableName); Get g = new Get(rowKey.getBytes()); Result rs = table.get(g); System.out.println(rs); table.close(); System.out.println("查询完成!"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 查询表中所有的行 */ public void scanner(String tableName) { try { HTable table = new HTable(conf, tableName); Scan s = new Scan(); ResultScanner rs = table.getScanner(s); for (Result r : rs) { // keyvalue Cell[] cell = r.rawCells(); System.out.println("长度:" + cell.length); for (int i = 0; i < cell.length; i++) { System.out.println("信息:" + new String(CellUtil.cloneFamily(cell[i])) + " " + new String(CellUtil.cloneQualifier(cell[i])) + " " + new String(CellUtil.cloneValue(cell[i])) + " " + new String(CellUtil.cloneRow(cell[i]))); } System.out.println("\n-----------------------"); } table.close(); System.out.println("执行结束!"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { HbaseTest hbase = new HbaseTest(); String tableName = "test"; hbase.scanner(tableName); } }
相关推荐
下面我们将深入探讨HBase 0.96版本中的关键Java编程知识点。 首先,理解HBase的基础架构至关重要。HBase是构建在Hadoop之上的,利用HDFS作为其底层存储。在Java中,我们通过HBase客户端API与HBase交互,这些API包括...
HBase 0.96则是基于Hadoop的数据库,设计为高度可扩展的列式数据库,适用于实时查询。 **Hadoop 2.6的伪分布式安装** 在伪分布式模式下,所有的Hadoop组件都运行在一个单一节点上,这对于测试和学习Hadoop的环境...
Hadoop2.2+Zookeeper3.4.5+HBase0.96集群环境搭建 Hadoop2.2+Zookeeper3.4.5+HBase0.96集群环境搭建是大数据处理和存储的重要组件,本文档将指导用户从零开始搭建一个完整的Hadoop2.2+Zookeeper3.4.5+HBase0.96集群...
综合以上信息,用户在进行hadoop2.2+hbase0.96+hive0.12的集成安装时,应该详细检查各个组件的版本兼容性,确保系统权限设置正确,按照实践指南执行相关配置步骤,并正确设置和使用MySQL数据库作为元数据存储。...
这个“hbase-0.96 jar包”是HBase 0.96版本的二进制发行版,它包含了运行和开发HBase应用所需的所有库文件。HBase 0.96是一个重要的里程碑,因为它在性能和稳定性上都有显著提升,特别是在处理大规模数据集时。 ...
### hadoop2.2、hbase0.96与hive0.12的安装整合及高可靠部署 #### 一、Hadoop2.2的安装与配置 **1.1 安装前准备** - **操作系统环境**: Linux系统(推荐CentOS 6.x) - **JDK安装**: Hadoop依赖于JDK运行,需先...
资源名称:hadoop2完全分布式及整合hbase0.96安装文档 内容简介: 首先说一下这个安装过程需要注意的地方一、使用新建用户可能会遇到的问题(1)权限问题:对于新手经常使用root,刚开始可以使用,...
#### 三、HBase0.96与Hive0.12整合 **问题导读:** 1. Hive安装是否需要安装MySQL? 2. Hive是否分为客户端和服务器端? 3. Hive的元数据库有哪两种? 4. Hive与HBase整合的关键是什么? 5. Hive的安装是否必须...
1. **下载与解压**:获取HBase 0.96的源码或二进制包,同样解压至合适位置,如`/usr/local/hbase`。 2. **配置环境变量**:在`~/.bashrc`或`~/.bash_profile`中添加HBase的路径,并更新PATH。 3. **修改HBase配置**...
本文将详细介绍如何在Linux环境下搭建Hadoop2.2.0、HBase0.96和Hive0.12的集群环境。 首先,我们从Hadoop的安装开始。Hadoop2.2.0是Apache官方稳定版,可以从官方网站或镜像站点下载。下载完成后,将其上传到Linux...
VMware10+CentOS6.5+Hadoop2.2+Zookeeper3.4.6+HBase0.96安装过程详解 用于解决分布式集群服务器
本文档由王家林老师详细的介绍了 hadoop2.2完全分布式 及整合hbase0.96 安装步骤,图文并茂。
hadoop2完全分布式最新高可靠安装文档及整合hbase0.96中文安装详解,新手必备!
VMware10+CentOS6.5+Hadoop2.2+Zookeeper3.4.6+HBase0.96安装过程详解.pdf
本文将深入探讨如何使用HBase Java API进行数据访问和分页查询。 首先,我们要了解HBase的基本结构,它是由行(Row)、列族(Column Family)、列(Column)和时间戳(Timestamp)组成。在Java API中,我们主要通过...
用户可以通过访问HBase的官方文档页面,然后使用浏览器的查找功能(例如按CTRL+F)搜索关键词“supported”,找到HBase与Hadoop的兼容版本对照表。此外,HBase官方也会提供特定版本的HBase支持的Hadoop版本,通常在...
Java-HBase 开发包是专为Java开发者设计的,用于与HBase数据库进行交互的工具集。HBase是一个分布式、可扩展的列式存储系统,是Apache Hadoop生态系统的一部分,适用于处理大规模数据。这个开发包使得Java程序员可以...
节制2013年12月23日最新的hadoop和hbase兼容版本搭建 hadoop-2.2.0 hbase-0.96.1.1 java Hbase java DBHelper CRUD等通用方法 花了两天时间整理的,含有lib包 & 源码
Java访问Hbase数据库是大数据...通过这个Demo,你可以了解Hbase与Java交互的基本步骤,并以此为基础进行更复杂的操作,如批量操作、扫描等。请确保在实际环境中替换示例中的IP地址和端口号,以适应你的Hbase集群配置。
HBase基本操作 增删改查 java代码 要使用须导入对应的jar包