zoukankan      html  css  js  c++  java
  • 1006-HBase操作实战(JAVA API状态)

    一、准备阶段
    开发环境:
    hadoop: hadoop -2.4.0
    hbase: hbase -0.94.11-security
    eclipse:Juno Service Release 2

    二、创建 hbasedemo项目

    1、通过 Eclipse 创建一个新 Java project
    2、右击项目根文件夹,选择“Propertiesà> Java Build Pathà> Libraryà>  Add  External  JARs”
    3、加入jar文件到 classpath
    3.1 解压 HBase 安装文件
    3.2 拷贝 hbase-0.94.7-security.jar、 hbase-0.94.11-security-tests.jar到project
    3.3 lib 子文件夹下全部的 jar 包加入到本project的 Build Path下

    三、使用HBase JAVA API

    初始化和释放资源方法:
    public void init() 数据初始化
    public void destory()  释放资源

    验证方法:
    public void testCreate() 验证创建表
    public void testDrop() 验证删除表
    public void testPut()验证加入表数据
    public void testGetByRowKey() 验证怎样通过rowkey获取数据
    public void testScanSToEnd() 验证范围行数据获取
    public void testScanAll()  验证全表扫描

    方法:
    public List<Cell> get(String tableName, String rowKey)  通过rowKey插入表数据
    public List<Result> scan(String tableName)  通过表名查询全部信息
    public List<Result> scan(String tableName,String startRow,String stopRow) 查询范围行方法
    public void create(String tableName, String[] cfs)  通过表名和列族信息创建表
    public void drop(String tableName) 删除表
    public void put(String tableName, List<CellBean> values) 依据提供的表和对象信息插入hbase

    第一步: 封装HBase中的存储单元Cell对象

    /**
     * 封装HBase中存储单元cell对象
     * @author shenfl
     * @version:V1.0
     * @Date:2015-6-8
     */
    public class CellBean {
    
    	//行健
    	private String rowKey;
    	//列族
    	private String columnFamilly;
    	//列名
    	private String columnName;
    	//cell值
    	private String columnValue;
    
    	public String getRowKey() {
    		return rowKey;
    	}
    
    	public void setRowKey(String rowKey) {
    		this.rowKey = rowKey;
    	}
    
    	public String getColumnFamilly() {
    		return columnFamilly;
    	}
    
    	public void setColumnFamilly(String columnFamilly) {
    		this.columnFamilly = columnFamilly;
    	}
    
    	public String getColumnName() {
    		return columnName;
    	}
    
    	public void setColumnName(String columnName) {
    		this.columnName = columnName;
    	}
    
    	public String getColumnValue() {
    		return columnValue;
    	}
    
    	public void setColumnValue(String columnValue) {
    		this.columnValue = columnValue;
    	}
    }
    

    第二步: 使用HBase JAVA API 操作HBase  数据库
    /**
     * 使用HBase JAVA API操作
     * 
     * @author shenfl
     *
     */
    public class HBaseTest {
    	Configuration config = null;
    	// 创建操作表對象
    	HBaseAdmin admin = null;
    	// hbase的连接
    	HConnection conn = null;
    
    	@Before
    	public void init() {
    		config = HBaseConfiguration.create();
    		// HBase仅仅须要知道ZooKeeper。就能够操作RegionServer上的數據,设置HBase 连接ZooKeeper
    		config.set("hbase.zookeeper.quorum", "192.168.2.35:2181,192.168.2.36:2181,192.168.2.37:2181");
    		try {
    			conn = HConnectionManager.createConnection(config);
    			admin = new HBaseAdmin(config);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	@After
    	public void destory() {
    		try {
    			admin.close();
    			conn.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	@Test
    	public void testCreate() {
    		String tableName = "account";
    		String[] columnFamilies = new String[] { "info", "other" };
    		create(tableName, columnFamilies);
    	}
    
    	//@Test
    	public void testDrop() {
    		drop("account");
    	}
    
    	@Test
    	public void testPut() {
    
    		// 设置表对象列表
    		List<CellBean> cbList = new ArrayList<CellBean>();
    		// 设置表名account
    		String tableName = "account";
    		CellBean e = null;
    		for(int i=0;i<3;i++){
    			e = new CellBean();
    			e.setRowKey("g20142500"+i);
    			e.setColumnFamilly("info");
    			e.setColumnName("username");
    			e.setColumnValue("shenfl"+i);
    			cbList.add(e);
    			e = new CellBean();
    			e.setRowKey("g20142500"+i);
    			e.setColumnFamilly("other");
    			e.setColumnName("career");
    			e.setColumnValue("singer"+i);
    			cbList.add(e);
    		}
    		put(tableName, cbList);
    	}
    
    	@Test
    	public void testGetByRowKey() {
    		
    		String tableName = "account";
    		String rowKey = "g201425001";
    		List<Cell> cells = get(tableName, rowKey);
    		StringBuffer info = new StringBuffer();
    		for (Cell c : cells) {
    			//使用CellUtil方法输出相应列。 hbase0.96 版本号使用CellUtil函数
    			info.append(new String(CellUtil.cloneFamily(c))).append(":")
    				.append(new String(CellUtil.cloneQualifier(c))).append("	")
    				.append(new String(CellUtil.cloneValue(c))).append("
    ");
    		}
    		System.out.println(info);
    	}
    	@Test
    	public void testScanSToEnd(){
    		
    		StringBuffer sb = new StringBuffer();
    		String tableName = "account";
    		String startRow = "g201425000";
    		String stopRow = "g201425002";
    		List<Result> rsList = scan(tableName, startRow, stopRow);
    		byte[] rowKey = null;
    		byte[] username = null;
    		byte[] career = null;
    		for(Result rs:rsList){
    			rowKey = rs.getRow();
    			username = rs.getValue(Bytes.toBytes("info"), Bytes.toBytes("username"));
    			career = rs.getValue(Bytes.toBytes("other"), Bytes.toBytes("career"));
    			sb.append(new String(rowKey)).append("	")
    			  .append(new String(username)).append("	")
    			  .append(new String(career)).append("
    ");
    		}
    		System.out.println(sb.toString());
    	}
    	
    	@Test
    	public void testScanAll() {
    		StringBuffer sb = new StringBuffer();
    		List<Result> rsList = scan("account");
    		for (Result rs : rsList) {
    
    			List<Cell> listCells = rs.listCells();
    			for (Cell c : listCells) {
    				// 使用CellUtil方法输出相应列。 hbase0.96 版本号使用CellUtil函数
    				sb.append(new String(CellUtil.cloneRow(c))).append("	")
    				  .append(new String(CellUtil.cloneFamily(c))).append(":")
    				  .append(new String(CellUtil.cloneQualifier(c))).append("	")
    				  .append(new String(CellUtil.cloneValue(c))).append("
    ");
    			}
    		}
    
    		System.out.println(sb);
    	}
    	/**
    	 * 通过rowKey插入表数据
    	 * @param tableName 表名
    	 * @param rowKey	行健
    	 * @return
    	 */
    	public List<Cell> get(String tableName, String rowKey) {
    		HTableInterface table = null;
    		Get get = null;
    		Result rs = null;
    		List<Cell> listCells = new ArrayList<Cell>();
    		try {
    			table = conn.getTable(tableName);
    			get = new Get(Bytes.toBytes(rowKey));
    			rs = table.get(get);
    			listCells = rs.listCells(); 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}finally{
    			try {
    				table.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return  listCells;
    	}
    	
    	/**
    	 * 查询全部行
    	 * 
    	 * @param tableName
    	 * @return
    	 */
    	public List<Result> scan(String tableName) {
    		HTableInterface table = null;
    		List<Result> rsList = new ArrayList<Result>();
    		try {
    			table = conn.getTable(tableName);
    			Scan scan = new Scan();
    			ResultScanner scanner = table.getScanner(scan);
    			Iterator<Result> iterator = scanner.iterator();
    			Result rs = null;
    			while (iterator.hasNext()) {
    				rs = (Result) iterator.next();
    				rsList.add(rs);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally{
    			try {
    				table.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return rsList;
    	}
    	/**
    	 * 查询范围行
    	 * @param tableName 表名
    	 * @param startRow  開始的行健
    	 * @param stopRow   结束行健
    	 * @return
    	 */
    	public List<Result> scan(String tableName,String startRow,String stopRow) {
    		
    		HTableInterface table = null;
    		List<Result> rsList = new ArrayList<Result>();
    		try {
    			table = conn.getTable(tableName);
    			Scan scan = new Scan();
    			scan.setStartRow(Bytes.toBytes(startRow));
    			scan.setStopRow(Bytes.toBytes(stopRow));
    			ResultScanner rs = table.getScanner(scan);
    			
    			for(Result v:rs){
    				rsList.add(v);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally{
    			try {
    				table.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return  rsList;
    	}
    	/**
    	 * 创建壁报
    	 * 
    	 * @param tableName
    	 *            表名
    	 * @param cfs
    	 *            列族
    	 */
    	public void create(String tableName, String[] cfs) {
    
    		if (cfs == null || cfs.length == 0) {
    			return;
    		}
    		try {
    			// 校验表是否存储
    			if (admin.tableExists(tableName)) {
    				return;
    			}
    			// 创建表
    			HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
    			// 创建列族
    			for (String cf : cfs) {
    				desc.addFamily(new HColumnDescriptor(cf));
    			}
    			// 创建表
    			admin.createTable(desc);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 删除表
    	 * 
    	 * @param tableName
    	 *            表名
    	 */
    	public void drop(String tableName) {
    		try {
    			if(admin.tableExists(tableName)){
    				
    				admin.disableTable(tableName);
    				admin.deleteTable(tableName);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 向指定表插入数据
    	 * 
    	 * @param tableName
    	 *            表名
    	 * @param values
    	 *            数据
    	 */
    	public void put(String tableName, List<CellBean> values) {
    
    		if (StringUtils.isBlank(tableName) || values == null || values.size() == 0) {
    			return;
    		}
    		Put put = null;
    		HTableInterface table = null;
    		try {
    			table = conn.getTable(tableName);
    			for (CellBean v : values) {
    				put = new Put(Bytes.toBytes(v.getRowKey()));
    				put.add(Bytes.toBytes(v.getColumnFamilly()), Bytes.toBytes(v.getColumnName()),
    						Bytes.toBytes(v.getColumnValue()));
    				table.put(put);
    			}
    		} catch (Exception e) {
    			// 实际生产环境要通过记录日志。比如: logger.warn("xxxxx",e);
    			e.printStackTrace();
    		}finally{
    			try {
    				table.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }





    參考文章:
    1、HBase连接池 -- HTablePool被Deprecated之后
    http://blog.csdn.net/u010967382/article/details/38046821
    2、HBase Java API 介绍
    http://www.cnblogs.com/NicholasLee/archive/2012/09/13/2683432.html
    3、HBase Java API 操作案例
    http://www.programcreek.com/java-api-examples/index.php?api=org.apache.hadoop.hbase.HTableDescriptor
    http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Admin.html
    http://blog.csdn.net/hadoop_/article/details/11481215

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4805178.html
Copyright © 2011-2022 走看看