文档章节

Hadoop上路_15-HBase0.98.0入门

vigiles
 vigiles
发布于 2014/04/03 16:46
字数 1776
阅读 4114
收藏 49

以下操作在Hadoop分布式集群基础上进行。

一。分布式环境搭建

下载:http://www.apache.org/dyn/closer.cgi/hbase/ ,hbase-0.98.0-hadoop2-bin.tar.gz

1.master主控机安装HBase

1)解压

SHELL$ tar -zxvf hbase-0.98.0-hadoop2-bin.tar.gz 
SHELL$ mv hbase-0.98.0-hadoop2 ~/hbase0.98.0hadoop2 

2)配置环境变量

1)修改/etc/profile文件
    SHELL$ sudo gedit /etc/profile 

(2)验证

3)修改%HBASE%/conf/hbase-env.sh

4)修改$HBASE_HOME/conf/hbase-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<property>
		<!-- hbase的master主机名和端口 -->
		<name>hbase.master</name>
		<value>hdfs://192.168.1.240:60000</value>
	</property>
	<property>
		<!-- Hbase数据保存目录 -->
		<name>hbase.rootdir</name>
		<!-- 主机和端口号与$HADOOP_HOME/.../core-site.xml的fs.defaultFS的主机和端口号一致 -->
		<value>hdfs://192.168.1.240:9000/hbase</value>
	</property>
	<property>
		<!-- 开启分布式 -->
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
	<property>
		<!-- hbase集群中zookeeper的主机各节点,使用奇数可尽量确保选举leader公平 -->
		<name>hbase.zookeeper.quorum</name>
		<!-- value>hapsalve1,hapsalve2,hapsalve3</value -->
		<value>192.168.1.241,192.168.1.242,192.168.1.243</value>
	</property>
	<property>
		<!-- hbase临时文件位置 -->
		<name>hbase.tmp.dir</name>
		<value>/home/hadoop/hbase0.98.0hadoop2/hbase-tmp</value>
	</property>
	<property>
		<!-- hbase临时zookeeper数据存放位置 -->
		<name>hbase.zookeeper.property.dataDir</name>
		<value>/home/hadoop/hbase0.98.0hadoop2/zookeeper-temp</value>
	</property>
</configuration>


5$HBASE_HOME/conf/regionservers 文件增加

2.把HBase复制到slave从属机

SHELL$ sudo scp -rpv /home/hadoop/hbase0.98.0hadoop2/ hadoop@hapslave*:/home/hadoop/ 

3.启动HBase集群

Hadoop集群启动后,再启动HBase集群。
SHELL$ start-hbase.sh 


在主控机通过web界面查看(本例配置4个节点):

4.停止HBase集群

SHELL$ stop-hbase.sh

二。HBase Shell

SHELL$ hbase shell

1.建表create

2.列出全部表list

3.表描述describe

4.删除表disable,drop

5.插入条目put

6.展示全表scan

7.查询条目get 

8.更新条目put

9.删除条目delete



清空表:


truncate是一个能够快速清空资料表内所有资料的SQL语法。并且能针对具有自动递增值的字段,做计数重置归零重新计算的作用

10.统计参数

三。JavaAPI

全部API%HBase%/docs目录里,完全是英文的。
本例所须全部jar都可以在%HBase安装目录%/lib目录中找到。图省事,我一股脑儿全导入了。

1.创建一张表

package com.cuiweiyou.test;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
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.TableName;
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.junit.Test;

public class HBaseTest {

	//创建表
	@Test
	public void creatTable() throws Exception {

		String strTBName = "tb_test";	//表
		String strColFamily = "cf";		//列族

		//配置
		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");

		//管理员
		HBaseAdmin hbaseAdmin = new HBaseAdmin(conf);
		//addColumn(String tableName, HColumnDescriptor column)			//向一个已经存在的表添加咧
		//checkHBaseAvailable(HBaseConfiguration hbaseConf)				//静态函数,查看HBase是否处于运行状态
		//deleteTable(byte[] tableName)									//删除一个已经存在的表
		//enableTable(byte[] tableName)									//使表处于有效状态
		//disableTable(byte[] tableName)								//使表处于无效状态
	 	//HTableDescriptor[] listTables()								//列出所有用户控件表项
		//modifyTable(byte[] tableName, HTableDescriptor tableDesc)		//修改表的模式,是异步的操作,耗时
		//tableExists(String tableName)									//检查表是否存在

		//表名称
		TableName tableName = TableName.valueOf(strTBName);

		//表描述器
		HTableDescriptor tableDesc = new HTableDescriptor(tableName);
		//removeFamily(byte[] column)			//移除一个列族
		//getName()								//获取表的名字
		//getValue(byte[] key)					//获取属性的值
		//setValue(String key, String value)	//设置属性的值
		tableDesc.addFamily(new HColumnDescriptor(strColFamily));//添加列族

		//创建一个表,同步操作
		hbaseAdmin.createTable(tableDesc);
		
		System.out.println("创建表" +  strTBName + "成功");
	}
}

2.添加一条记录

//为表添加数据
	@Test
	public void addData() throws IOException {
		String strTBName = "tb_test";
		String strColFamily = "cf";
		String strColumn = "col";		//列名
		String strRowKey = "row1";		//行号
		String strValue = "values";		//值

		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");

		//表实例
		HTable table = new HTable(conf, strTBName);	
		//close()														释放所有的资源或挂起内部缓冲区中的更新
		//exists(Get get)												检查Get实例所指定的值是否存在于HTable的列中
		//get(Get get)													获取指定行的某些单元格所对应的值
		//getEndKeys()													获取当前一打开的表每个区域的结束键值
		//getScanner(byte[] family)										获取当前给定列族的scanner实例
		//getTableDescriptor()											获取当前表的HTableDescriptor实例
		//getTableName()												获取表名
		//isTableEnabled(HBaseConfiguration conf, String tableName)		检查表是否有效

		// 获取所有的列族
		HColumnDescriptor[] columnFamilies = table.getTableDescriptor().getColumnFamilies();
		//HColumnDescriptor的常用方法:
		//getName()								//获取列族的名字
		//getValue(byte[] key)					//获取对应的属性的值
		//setValue(String key, String value)	//设置对应属性的值

		//插入器
		Put put = new Put(Bytes.toBytes(strRowKey));// 设置行号,RowKey
		//add(byte[] family, byte[] qualifier, byte[] value)			将指定的列和对应的值添加到Put实例中
		//add(byte[] family, byte[] qualifier, long ts, byte[] value)	将指定的列和对应的值及时间戳添加到Put实例中
		//getRow()														获取Put实例的行
		//getRowLock()													获取Put实例的行锁
		//getTimeStamp()												获取Put实例的时间戳
		//isEmpty()														检查familyMap是否为空
		//setTimeStamp(long timeStamp)									设置Put实例的时间戳
		
		for (int i = 0; i < columnFamilies.length; i++) {
			String familyName = columnFamilies[i].getNameAsString(); // 获取列族名
			
			//指定列族
			if (familyName.equals(strColFamily)) {
				//插入
				put.add(Bytes.toBytes(familyName), Bytes.toBytes(strColumn), Bytes.toBytes(strValue));
			}
		}
		
		table.put(put);	//运行插入器
		
		System.out.println("存入数据完毕");
	}

3.读取指定行记录

//根据RowKey查询整行
	@Test
	public void getRow() throws IOException {
		String strTBName = "tb_test";
		String strRowKey = "row1";

		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");

		HTable table = new HTable(conf, strTBName);	//获取表实例
		
		//查询器
		Get get = new Get(Bytes.toBytes(strRowKey));	//查询指定行
		//addColumn(byte[] family, byte[] qualifier)	获取指定列族和列修饰符对应的列
		//addFamily(byte[] family)						通过指定的列族获取其对应列的所有列
		//setTimeRange(long minStamp,long maxStamp)		获取指定取件的列的版本号
		//setFilter(Filter filter)						当执行Get操作时设置服务器端的过滤器

		Result result = table.get(get);
		//containsColumn(byte[] family, byte[] qualifier)		检查指定的列是否存在
		//getFamilyMap(byte[] family)							获取对应列族所包含的修饰符与值的键值对
		//getValue(byte[] family, byte[] qualifier)				获取对应列的最新值
		
		List<Cell> listCells = result.listCells();	//指定行、全部列族的全部列

		for (Cell cell : listCells) {
			System.out.println("列  族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
			System.out.println("列  名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
			System.out.println("列  值:" + Bytes.toString(CellUtil.cloneValue(cell)));
			System.out.println("时间戳:" + cell.getTimestamp());
		}
	}

4.显示所有数据

//遍历全部条目
	@Test
	public void getAllRows() throws IOException {
		String strTBName = "tb_test";

		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");
		HTable table = new HTable(conf, strTBName);	//获取表实例

		//扫描器
		ResultScanner resultScanner = table.getScanner(new Scan());	//针对全表的查询器
		Iterator<Result> results = resultScanner.iterator();
		while(results.hasNext()) {
			Result result = results.next();
			List<Cell> cells = result.listCells();
			for(Cell cell : cells) {
				System.out.println("列  族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
				System.out.println("列  名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
				System.out.println("列  值:" + Bytes.toString(CellUtil.cloneValue(cell)));
				System.out.println("时间戳:" + cell.getTimestamp() + "\n------------------");
			}
		}
	}

5.更新条目

//更新表中某行的某一列
	@Test
	public void updateTable() throws IOException {
		String strTBName = "tb_test";
		String strColFamily = "cf";
		String strColumn = "col";
		String strRowKey = "row1";
		String strNewValue = "NewValues";

		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");
		HTable table = new HTable(conf, strTBName);	//获取表实例

		Put put = new Put(Bytes.toBytes(strRowKey));
		//仍然是插入操作(已知列族,已知列,新值)
		put.add(Bytes.toBytes(strColFamily), Bytes.toBytes(strColumn), Bytes.toBytes(strNewValue));
		table.put(put);

		System.out.println("更新结束");
	}

6.删除单元格

//删除指定行的指定的列(删除单元格)
	@Test
	public void deleteColumn() throws IOException {
		String strTBName = "tb_test";
		String strColFamily = "cf";
		String strColumn = "col";
		String strRowKey = "row1";

		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");
		HTable table = new HTable(conf, strTBName);	//获取表实例

		//删除器
		Delete del = new Delete(Bytes.toBytes(strRowKey));
		del.deleteColumns(Bytes.toBytes(strColFamily), Bytes.toBytes(strColumn));
		table.delete(del);
		
		System.out.println("行:" + strRowKey + ",列族:"+ strColFamily +",列:"+ strColumn +",删除完毕");
	}

7.删除整行

//删除整行
	@Test
	public void deleteAllColumn() throws IOException {
		String strTBName = "tb_test";
		String strRowKey = "row1";

		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");
		HTable table = new HTable(conf, strTBName);	//获取表实例

		Delete deleteAll = new Delete(Bytes.toBytes(strRowKey));

		table.delete(deleteAll);

		System.out.println("这一行全删除了");
	}

8.删除表单

//删除表
	@Test
	public void deleteTable() throws IOException {
		String strTBName = "tb_test";
		
		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "192.168.1.241,192.168.1.242,192.168.1.243");

		HBaseAdmin admin = new HBaseAdmin(conf);

		admin.disableTable(strTBName);
		admin.deleteTable(strTBName);
		System.out.println(strTBName + "表 删除了");
	}



- end

欢迎加入Hadoop技术交流及就业指导群:199362441

© 著作权归作者所有

vigiles

vigiles

粉丝 99
博文 84
码字总数 82564
作品 0
昌平
程序员
私信 提问
编写hive udf函数

udf编写入门 大写转小写 package com.afan; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public class UDFLower extends UDF{ public Text evaluate(fin......

SimplePoint
2017/02/14
0
0
hadoop hive hbase 入门学习 (二)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// hadoop 自学系列 hado......

curiousby
2015/03/08
0
0
Flume1.5.0入门:安装、部署、及flume的案例

Flume1.5.0入门:安装、部署、及flume的案例 问题导读 1.什么是flume 2.flume的官方网站在哪里? 3.flume有哪些术语? 4.如何配置flume数据源码?   一、什么是Flume?   flume 作为 clou...

片刻
2016/01/27
215
0
(高清,无码)全国第一部hadoop教程全发布,陆续更新中......

雷锋来了,hadoop教程合集! Hadoop从入门到上手企业开发第1天 http://pan.baidu.com/s/1c0vU0dq Hadoop从入门到上手企业开发第2天 http://pan.baidu.com/s/1gd5XKXX Hadoop从入门到上手企业...

大象分享
2015/02/25
1K
17
我的数据分析(算法)学习进阶路线

今天简单介绍下,我入门数据分析以及算法工程师对我有帮助的资料。 第一步报个驾校,有车可以练车技 开车第一步不是学习交规,而是先报个驾校,你得有车可以练车技。就像用python写程序第一步...

cloudinsea
2018/05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
4
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部