沉沙
2019-01-09
来源 :
阅读 1423
评论 0
摘要:本篇教程探讨了大数据技术之HBase笔记整理(1),希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。
本篇教程探讨了大数据技术之HBase笔记整理(1),希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

行式数据库:
可以简单的理解为类似传统的rdbmspaint这些数据,存放的数据都是结构化的数据。行式数据库,是有利于全表数据的扫描,不利于只查询个别字段
列式数据库:
对行式数据库的一个改进,将部分列(或者说有关联的一些列)存放到单独的文件中,其他列存在其它多个文件中,我们在进行查询的时候,只需要读取出这些常用列即可完成工作,这样,减少了文件IO的读写,提高读写的效率(不用再想行式数据库进行全表扫描,然后过滤相关字段)在行式数据库里面,大数据领域有一个非常著名的产品——HBase,其有别于传统的RDBMS,被称之为列式数据库,或者是NoSQL(Not Only SQL,是一类数据库的统称,常见的有Hbase、Redis、mechache、mongodb。。。。)中的一块数据。能够满足对hdfs上面海量数据的告诉数据读写。
是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
特点:
高可靠性高性能面向列可伸缩 表的特点 纵向扩展 横向扩展 部署上来说: 分布式集群HBase设计初衷,是为了企业中的大表,面向上百万列,上百亿条记录设计的数据库。可以分布式存储海量的数据具有容错能力强,数据高可靠的特点HBase是一个列式NoSQL数据库数据存储的结构是按照列进行存储。按照列进行存储的数据库产品,一般都有行键的概念。使用行键,可以标示一行数据。理解行键的时候,可以简单的认为是RDBMS中的PK。Hbase存储数据的物理结构是key-value形式。key就是行键。同时可以非常方便的进行横向扩展(scale out,纵向扩展scale up)。
安装前需要保证hadoop、zookeeper、java已经安装好。
解压 ~]$ tar -zxf /home/uplooking/soft/hbase-1.1.5-bin.tar.gz -C /home/uplooking/app重命名 ~]$ mv /home/uplooking/app/hbase-1.1.5 /home/uplooking/app/hbase添加至环境变量 export HBASE_HOME=/home/uplooking/app/hbase配置 $HBASE_HOME/conf/hbase-env.sh、hbase-site.xml $HBASE_HOME/conf/hbase-env.sh export JAVA_HOME=/opt/jdk export HBASE_MANAGES_ZK=false $HBASE_HOME/conf/hbase-site.xml <property> <name>hbase.rootdir</name> <value>hdfs://ns1/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>uplooking01,uplooking02,uplooking03</value> </property>启动 sh $HBASE_HOME/bin/start-hbase.sh 使用jps命令,当有HMaster、HQuorumPeer(使用hbase自带的zk)、HRegionServer三个进程启动的时候,说明hbase服务已经启动成功停止 sh $HBASE_HOME/bin/stop-hbase.sh单进程启动 HMaster hbase-daemon.sh start master HRegionserver hbase-daemon.sh start regionserver访问: web //<ip>:16010 cli bin/hbase shell
在上述的基础之上,只需要再配置一个conf/regionservers,添加两行内容:uplooking02uplooking03注意: 如果已经配置过单机版,需要将hbase在hdfs上面的目录、以及hbase在zk中的目录清除,以免和集群版本操作冲突 zk rmr /hbase hdfs hdfs dfs -rm -R /hbase拷贝master上面的数据到uplooking02和uplooking03 scp -r app/hbase uplooking@uplooking02:/home/uplooking/app/ scp -r app/hbase uplooking@uplooking03:/home/uplooking/app/同样在slave01和slave02上面添加相关环境变量 scp ~/.bash_profile uplooking@uplooking02:/home/uplooking/ scp ~/.bash_profile uplooking@uplooking02:/home/uplooking/ 让其生效 source ~/.bash_profile启动hbase集群 sh $HBASE_HOME/bin/start-hbase.sh 这个时候在master机器上面,有一个进程HMaster,在uplooking02和uplooking03上面分别有一个HRegionServer
启动hbase出现如下问题:
Caused by: java.lang.IllegalArgumentException: java.net.UnknownHostException: ns1 at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:373) at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:258) at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:153) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:602) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:547) at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:139) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2625) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2607) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296) at org.apache.hadoop.hbase.util.FSUtils.getRootDir(FSUtils.java:1002) at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:566) ... 10 moreCaused by: java.net.UnknownHostException: ns1
解决方案:
第一种方式: source一下环境变量文件第二种方式: 将hdfs对应的hdfs-site.xml和core-site.xml交给hbase管理
另外需要注意的是,如果原来已经安装了单机版,如果再安装集群版本时,需要把原来相关的数据删除。
逻辑结构:
表(table) 划分数据集合的概念,和传统的db中的表的概念是一样的。行健(RowKey): 一行数据的唯一标示,要想操作(read/write)一条数据,必须通过行健,其在hbase底层都是使用字节数组进行存放, 所以方便我们使用rk进行排序, 行键是字节数组, 任何字符串都可以作为行键;表中的行根据行键进行排序,数据按照Row key的字节序(byte order)排序存储; 所有对表的访问都要通过行键 (单个RowKey访问,或RowKey范围访问,或全表扫描)。列族(columnFamily) 简单的认为是一系列“列”的集合。列族是以单独的文件进行存储。列限定符(column Qualifier) 或者叫列。列里面的数据定位通过列限定符 每个CF可以有一个或多个列成员(ColumnQualifier), 列成员不需要在表定义时给出,新的列族成员可以随后按需、动态加入。时间戳(version) 在单元格中可以存放多个版本的数据。单元格(cell) Cell 由行键,列族:限定符,时间戳唯一决定,Cell中的数据是没有类型的,全部以字节码形式存贮,主要用来存储数据。
HMaster ----->NameNode 管理节点HRegionServer----->DataNode 存放Region的服务器HRegion 存放hbase中数据的一个概念,可以简单的理解为表,存放一张表中的一部分数据,当该region中的数据超过一定量的时候,会自动进行分裂,分裂成两个region(一份为二),从这个角度上而言,Region是对hbase中表的一个横向的划分。HFile 在hdfs上存放数据之前的一个物理结构,用于接收从客户端提交过来的数据。 一个集群中有多个HRegionServer |-----一个HLog |-----多个HRegion |---多个Store |----一个CF
HBase的物理结构图示如下:
CLI(Command Line interface):
使用bin/hbase shell来进入命令终端命令:list查看当前命名空间下的所有的表,也可以查看特定命名空间下的表 list 'ns:abc.*' --->查看命名空间ns下面的所有的以表名以abc开头的表的列表创建一张表 create 't1', 'cf1' --->在默认的命名空间下创建一张表名为t1,只有一个列族,列族名为cf1查看一张表的所有内容:scan scan 't1'或者scan 'ns1:t1'往表中增加一条记录:put put 't1', '1'(rowkey), 'cf1:name', 'zhangsan'查看其中一个具体的值 get 't1', '1', 'cf1:name'查看表的属性信息: describe/desc 't1'删除记录:delete delete 't1', '1', 'cf1:age' -->删除某一个rowkey对应的cf1:age对应的单元格 deleteall 't1', '2' -->删除rowkey=2对应的所有的单元格删除一张表: 注意:删除表之前,需要先确认表状态是否为disable,如果不是,需要disable '表名' disable 't1' drop 't1'
练习:
rk column column cf name grad course math art |column1 Tom 5 97 872 Jim 4 89 80创建表 create 'stu','name', 'grad','course' --->创建了表stu,有三个列族,name、grad、course增加数据: put 'stu', '1', ':name', 'Tom' 直接写成'name'也是可以的,也就是说name这个列族下面没有多列 put 'stu', '1', ':grad', '5' put 'stu', '1', 'course:art', '97' put 'stu', '1', 'course:math', '88'删除name="Jim"的art成绩 delete 'stu', '2', 'name', 'Jim', "course:art" --->错误的 delete 'stu', '2',"course:art" 因为每次操作,只能操作的是单一单元格,hbase的原子性操作是基于单元格的 而一个单元格的确定是由rk、cf、col、ts(timestamp)删除name="JIM"所在的行的而所有单元格 deleteall 'stu', '2'查看当前表有多少条记录:select count(1) from t; count
package com.uplooking.bigdata.hbase;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.*;import org.apache.hadoop.hbase.client.*;import org.apache.hadoop.hbase.filter.CompareFilter;import org.apache.hadoop.hbase.filter.Filter;import org.apache.hadoop.hbase.filter.FilterList;import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * HBase Java API 学习 */public class HBaseAPIOps { private Connection connection; private Admin admin; @Before public void setUp() throws Exception { Configuration conf = HBaseConfiguration.create(); connection = ConnectionFactory.createConnection(conf); admin = connection.getAdmin(); } /* list 'default:t.*' TABLE t1 t2 */ @Test public void testList() throws IOException { TableName[] tblNames = admin.listTableNames("default:t.*"); for (TableName tblName : tblNames) { System.out.println(tblName.getNamespaceAsString() + ":" + tblName.getNameAsString()); } } @Test public void testCreate() throws IOException { HTableDescriptor desc = new HTableDescriptor(TableName.valueOf("t3")); HColumnDescriptor family = new HColumnDescriptor("cf"); desc.addFamily(family); admin.createTable(desc); } @Test public void testAddRecord() throws IOException { Table t3 = connection.getTable(TableName.valueOf("t3")); byte[] cf = "cf".getBytes(); byte[] nameBytes = "name".getBytes(); byte[] ageBytes = "age".getBytes(); List<Put> puts = new ArrayList<Put>(); /*Put put1 = new Put("1".getBytes()); put1.addColumn(cf, nameBytes, "xiaofazeng".getBytes()); put1.addColumn(cf, ageBytes, "13".getBytes()); puts.add(put1); Put put2 = new Put("2".getBytes()); put2.addColumn(cf, nameBytes, "xiaoshihao".getBytes()); put2.addColumn(cf, ageBytes, "15".getBytes());*/// puts.add(put2); for (int i = 1000; i <= 10000; i++) { Put put = new Put((i + "").getBytes()); put.addColumn(cf, nameBytes, ("xiaohuihui" + i).getBytes()); put.addColumn(cf, ageBytes, ("" + (i % 99 + 1)).getBytes()); puts.add(put); } t3.put(puts); t3.close(); } @Test public void testGetRecord() throws IOException { Table table = connection.getTable(TableName.valueOf("t3")); List<Get> gets = Arrays.asList( new Get("1".getBytes()), new Get("2".getBytes()).addColumn("cf".getBytes(), "name".getBytes()) ); Result[] results = table.get(gets); for (Result result : results) { CellScanner cs = result.cellScanner(); while(cs.advance()) { System.out.println("======================================================="); Cell cell = cs.current(); String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); String cf = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); String qualifier = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); String rk = new String(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()); long timestamp = cell.getTimestamp(); System.out.println(rk + "\t" + cf + ":" + qualifier + "\t" + timestamp + "\t" + value); System.out.println("cell.getValueArray() == cell.getFamilyArray()? " + (cell.getValueArray() == cell.getFamilyArray())); System.out.println("cell.getValueArray() == cell.getQualifierArray()? " + (cell.getValueArray() == cell.getQualifierArray())); System.out.println("cell.getValueArray() == cell.getRowArray()? " + (cell.getValueArray() == cell.getRowArray())); System.out.println("------------------------------------------------------"); int rowOffset = cell.getRowOffset(); short rowLength = cell.getRowLength(); int fOffset = cell.getFamilyOffset(); byte fLength = cell.getFamilyLength(); int qOffset = cell.getQualifierOffset(); int qLength = cell.getQualifierLength(); int vOffset = cell.getValueOffset(); int vLength = cell.getValueLength(); byte typeByte = cell.getTypeByte(); System.out.println("rowOffset: " + rowOffset + ", rowLength: " + rowLength); System.out.println("fOffset: " + fOffset + ", fLength: " + fLength); System.out.println("qOffset: " + qOffset + ", qLength: " + qLength); System.out.println("vOffset: " + vOffset + ", vLength: " + vLength); System.out.println("typeByte: " + typeByte); } } table.close(); } @Test public void testScan() throws IOException { Table table = connection.getTable(TableName.valueOf("t3")); Scan scan = new Scan(); ResultScanner resultScanner = table.getScanner(scan); /* for (Result result : resultScanner) { String name = new String(result.getValue("cf".getBytes(), "name".getBytes())); int age = Integer.valueOf(new String(result.getValue("cf".getBytes(), "age".getBytes()))); String rowKey = new String(result.getRow()); System.out.println(rowKey + "\t" + "cf:name-->" + name + ", cf:age-->" + age); }*/ resultScanner.forEach(result -> { String name = new String(result.getValue("cf".getBytes(), "name".getBytes())); int age = Integer.valueOf(new String(result.getValue("cf".getBytes(), "age".getBytes()))); String rowKey = new String(result.getRow()); System.out.println(rowKey + "\t" + "cf:name-->" + name + ", cf:age-->" + age); }); table.close(); } /** * 条件查询 * 其实说白了就是sql中的where条件,给hbase程序添加过滤器 * @throws IOException */ @Test public void testQueryByCondtion() throws IOException { Table table = connection.getTable(TableName.valueOf("t3")); Scan scan = new Scan(); Filter filter1 = new SingleColumnValueFilter("cf".getBytes(), "age".getBytes(), CompareFilter.CompareOp.GREATER_OR_EQUAL, "13".getBytes()); Filter filter2 = new SingleColumnValueFilter("cf".getBytes(), "age".getBytes(), CompareFilter.CompareOp.LESS_OR_EQUAL, "18".getBytes()); FilterList filterList = new FilterList(); filterList.addFilter(filter1); filterList.addFilter(filter2); scan.setFilter(filterList); ResultScanner resultScanner = table.getScanner(scan); resultScanner.forEach(result -> { String name = new String(result.getValue("cf".getBytes(), "name".getBytes())); int age = Integer.valueOf(new String(result.getValue("cf".getBytes(), "age".getBytes()))); String rowKey = new String(result.getRow()); System.out.println(rowKey + "\t" + "cf:name-->" + name + ", cf:age-->" + age); }); table.close(); } @After public void cleanUp() throws IOException { admin.close(); connection.close(); }}<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hive-api.version>2.1.0</hive-api.version> <hadoop-api.version>2.6.4</hadoop-api.version> <hadoop-core.version>1.2.1</hadoop-core.version> <hbase-version>1.1.5</hbase-version></properties><dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- HBase的maven依赖--> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${hbase-version}</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>${hbase-version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-hbase-handler</artifactId> <version>${hive-api.version}</version> </dependency></dependencies><build> <plugins> <!-- compiler插件, 设定JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> <showWarnings>true</showWarnings> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.uplooking.bigdata.hbase.HBase2HDFSOps</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins></build>
本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号