hbase基本操作(如何将hbase.site.xml导入项目)
本文目录
- 如何将hbase.site.xml导入项目
- c++ 程序如何操作hbase例如:创建表格,插入数据,查询数据等等
- hbase命令行方式插入一条数据到某个表中使用什么命令
- hbase是如何做到并发写的和随机写的
- hbase是什么工具
- hbase清理数据 用setTimeRange 方法怎么脚本实现
- HBase从入门到精通11:HBase数据保存过程和Region分裂
- hbase源代码 纯java开发的吗
- hbase scan的startRow和endRow
如何将hbase.site.xml导入项目
方法1:最基本的数据导入方法。首先通过JDBC将原本关系型数据库中的数据读出到内存中,然后在使用HBase自带的客户端API将数据put到相应的表中。这种方法通用性强,只要写好接口就可以用,但是效率并不高。 方法2:使用这种方法之前其实是需要先将数据导出到本地,以文本的形式保存,然后使用TableReudcer类编写MapReduce job。这种方法需要频繁的I/O操作,所以效率不高,容易导致HBase节点的不稳定。 方法3:importtsv是HBase内置的数据导入工具,目的是将tsv格式的文件加载到HBase中,本质上它是通过调用MapReudce Job实现数据导入的。注意:使用该方法,需要提前将数据导出到本地,以tsv格式存储。unbulk load模式的importtsv效果一般,适用于小型的数据。 方法4:bulk load是一个快速大量数据高效导入工具,相比于importtsv效率更高。 方法5:Sqoop是apache软件基金会的一个项目,可以用来实现关系型数据库和hdfs,hbase,hive之间的数据高效传输。只需要做一些简单的配置,通过Sqoop命令行指令就可以方便的实现数据导入和导出。下面具体介绍每种方法的做法:JDBC & HBase Client API此处以MySql为例。首先在MySql数据库中创建database ‘test’,然后创建一张表’Info’,这里可以使用可视化软件(例如workbench),也可以直接在命令行输入相应指令::~$mysql -u root -p #root用户登录mysql#创建Info表CREATE TABLE Info (`ID` INT NOT NULL, `Name` VARCHAR(45) NOT NULL, `Number` INT NOT NULL, `Time` VARCHAR(45) NOT NULL, PRIMARY KEY (`ID`));12345671234567然后使用load指令将准备好的数据导入到Info中。数据格式与Info各字段的一致即可。load data local infile ’/home/lvyang/Desktop/test.csv’ into table Info fields terminated by ’,’ 11到此数据已经准备好了。下面就可以进行数据导出导入过程了。 由于需要使用MySql的数据读取接口,所以我们需要到官网下载相应的connector,并将其中包含的mysql-connector-java-版本号-bin.jar文件取出,添加到自己Project的依赖库中。如果对maven比较熟的,就可以忽视这些配置过程,直接配置pom.xml文件即可完成项目依赖设置,方便快捷。 JDBC数据读取:public class JDBCUtils { Connection conn=null; ResultSet rs=null; String databaseName=null; String userName=null; String password=null; String url=null; public JDBCUtils(String databaseName, String userName, String password, String url); public void connect(); public ResultSet readData(String sql); public void writeToConsole(ResultSet rs,String keys); public boolean writeToLocal(ResultSet rs,String path); public void close();}12345678910111213141234567891011121314上面是JDBC工具类定义,可以根据自己的需求,自行添加或者删除方法。部分方法的实现如下,仅做参考:public void connect(){ try { Class.forName("com.mysql.jdbc.Driver"); //注册驱动 System.out.println("load mysql driver successfully!"); conn= (Connection) DriverManager.getConnection(url); //获得connection对象,完成数据库连接 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }} public ResultSet readData(String sql){ try { Statement stmt= (Statement) conn.createStatement(); //创建statement对象 rs=stmt.executeQuery(sql); //执行query命令,获取ResultSet } catch (SQLException e) { e.printStackTrace(); } return rs;}public void close(){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } }}123456789101112131415161718192021222324252627282930313233343536123456789101112131415161718192021222324252627282930313233343536到此JDBC读取数据部分已经完成,下面需要实现HBase数据导入功能:public class HBaseUtils { private static final Log LOG= LogFactory.getLog(HBaseUtils.class); //LOG用于输出部分关键信息 //Here I choose construct func to init configuration instance //and then use connectionFactory to create init conn instance //at last,I use conn to get Hadmin instance //next I will use Hadmin to operate hbase tables private Configuration conf=null; private Admin Hadmin=null; private Connection conn=null; public HBaseUtils(Configuration conf); public void connect(); public boolean isExist(String tableName); public boolean createTable(String tableName,String columnFamily); public boolean writeOne(HashMap《String,String》 data,String keys, String tableName,String columnFamily); public boolean writeMore(List《HashMap《String,String》》 list,String keys,String tableName,String columnFamily); public boolean deleteTable(String tableName); public void close();}123456789101112131415161718123456789101112131415161718部分方法的实现如下,仅做参考:public void connect(){ try { //create connection to hbase conn= ConnectionFactory.createConnection(conf); //get Hadmin which is the database manager Hadmin=conn.getAdmin(); } catch (IOException e) { e.printStackTrace(); if(conn!=null){ try { conn.close(); } catch (IOException e1) { e1.printStackTrace(); } } if(Hadmin!=null){ try { Hadmin.close(); } catch (IOException e1) { e1.printStackTrace(); } } }}public boolean createTable(String tableName,String columnFamily){ /** * create table * here I limit the number of column family to 1 * So here only can create one column family’s table * **/ TableName table_name= TableName.valueOf(tableName); LOG.info("Create table:"+tableName+" now!"); HTableDescriptor tableDesc=new HTableDescriptor(table_name); HColumnDescriptor columnDesc=new HColumnDescriptor(columnFamily); tableDesc.addFamily(columnDesc); try { this.Hadmin.createTable(tableDesc); } catch (IOException e) { e.printStackTrace(); return false; } return true;}public boolean writeOne(HashMap《String,String》 data,String keys, String tableName,String columnFamily){ /** * write one data to table at one time * here I choose the first key as the rowKey,because I think the first key usually is the primary key * **/ boolean flag=false; TableName table_name=TableName.valueOf(tableName); byte column_family=columnFamily.getBytes(); try { Table table=conn.getTable(table_name); byte).toString().getBytes(); //construct HBase table’s rowKey Put put=new Put(rowKey); for(int i=0;i《keys.length;i++){ byte.getBytes(); byte).toString().getBytes(); put.addColumn(column_family,key,value); } table.put(put); table.close(); flag=true; } catch (IOException e) { e.printStackTrace(); } return flag;}public void close(){ /** * close connection * **/ LOG.info("Close connection to HBase!"); if(Hadmin!=null){ try { Hadmin.close(); } catch (IOException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (IOException e) { e.printStackTrace(); } }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878812345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788到此,工具类已经基本完成,下面需要写一个主类:public class deMain { public static void main(String args){ //JDBC Init Connection conn=null; String sql="select * from Info"; String databaseName="test"; String userName="root"; String password="****"; String url="jdbc:mysql://localhost:3306/"+databaseName+"?user="+userName+"&password=" +password+"&useUnicode=true&characterEncoding=utf-8"; //HBase Client Init String tableName="test"; String columnFamily="info"; Configuration conf= HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","127.0.0.1"); conf.set("hbase.master","localhost:9000"); } //JDBC connection and read data JDBCUtils ju=new JDBCUtils(databaseName,userName,password,url); ju.connect(); ResultSet rs=ju.readData(sql); //HBase connect HBaseUtils hbu=new HBaseUtils(conf); hbu.connect(); //依次读取rs中每条记录,并将其写入HBase相应表中即可 ......... //close all connection hbu.close(); ju.close();}123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930到此,大功告成!由于是通过IDE端运行hadoop程序,所以我们需要将需要用到的依赖库导入,而这个过程如果不借助maven的话,就会特别的痛苦。下图是我配置的项目依赖包,仅供参考。 这里写图片描述注:hadoop2.7.2,hbase1.2.1,zookeeper3.4.6
c++ 程序如何操作hbase例如:创建表格,插入数据,查询数据等等
这个问题有相当的难度,同为Hadoop出身的Hypertable和Hbase分别倾向于C和Java,Hbase本身并没有开放面向C的API,但是可以通过Thrift实现,Hbase已经发布了ThriftAPI用以Hbase与C程序之间的交互,ThriftAPI可以参见wiki上一篇文章:***隐藏网址***例外Thrift的使用也可以参见下面两篇文章:***隐藏网址******隐藏网址***还有一种方法比较常用的,就是直接用JNI连接,上层使用Java与Hbase通信,但是有点绕,C++与Hbase的直接通信现在还没有,你可以考虑一下我说的Thrift和JNI 对不起,我也没有用过,可以根据上面的几篇文章自己试一下,按说Thrift作为一种中间渠道,支持Thrift应该都可以操作Hbase
hbase命令行方式插入一条数据到某个表中使用什么命令
命令:disable ’tableName’ --disable表。注:修改表结构时,必须要先disable表。命令:enable ’tableName’ --使表可用命令:drop ’tableName’ --删除表
hbase是如何做到并发写的和随机写的
阅读数:9381Hbase概述 hbase是一个构建在HDFS上的分布式列存储系统。HBase是Apache Hadoop生态系统中的重要 一员,主要用于海量结构化数据存储。从逻辑上讲,HBase将数据按照表、行和列进行存储。如图所示,Hbase构建在HDFS之上,hadoop之下。其内部管理的文件全部存储在HDFS中。与HDFS相比两者都具有良好的容错性和扩展性,都可以 扩展到成百上千个节点。但HDFS适合批处理场景,不支持数据随机查找,不适合增量数据处理且不支持数据更新。Hbase是列存储的非关系数据库。传统数据库MySQL等,数据是按行存储的。其没有索引的查询将消耗大量I/O 并且建立索引和物化视图需要花费大量时间和资源。因此,为了满足面向查询的需求,数据库必须被大量膨胀才能满 足性能要求。Hbase数据是按列存储-每一列单独存放。列存储的优点是数据即是索引。访问查询涉及的列-大量降低系统I/O 。并且每一列由一个线索来处理,可以实现查询的并发处理。基于Hbase数据类型一致性,可以实现数据库的高效压缩。HBase数据模型HBase是基于Google BigTable模型开发的, 典型的key/value系统。一个Row key对应很多Column Family,Column Family中有很多Column。其中,保存了不同时间戳的数据。如图所示,Rowkey cutting对应列簇info和roles。其中,info中有key-value对hight-9ft,state-CA。更清晰的结构如下图所:Hbase的所有操作均是基于rowkey的。支持CRUD(Create、Read、Update和Delete)和 Scan操作。 包括单行操作Put 、Get、Scan。多行操作包括Scan和MultiPut。但没有内置join操作,可使用MapReduce解决。HBase物理模型 Hbase的Table中的所有行都按照row key的字典序排列。Table 在行的方向上分割为多个Region。、Region按大小分割的,每个表开始只有一个region,随 着数据增多,region不断增大,当增大到一个阀值的时候, region就会等分会两个新的region,之后会有越来越多的 region。Region是HBase中分布式存储和负载均衡的最小单元。 不同Region分布到不同RegionServer上。Region虽然是分布式存储的最小单元,但并不是存储 的最小单元。Region由一个或者多个Store组成,每个store保存一个 columns family。每个Strore又由一个memStore和0至多个StoreFile组成。memStore存储在内存中,StoreFile存储在HDFS上。 HBase基本架构 HBase构建在HDFS之上,其组件包括 Client、zookeeper、HDFS、Hmaster以及HRegionServer。Client包含访问HBase的接口,并维护cache来加快对HBase的访问。Zookeeper用来保证任何时候,集群中只有一个master,存贮所有Region的寻址入口以及实时监控Region server的上线和下线信息。并实时通知给Master存储HBase的schema和table元数据。HMaster负责为Region server分配region和Region server的负载均衡。如果发现失效的Region server并重新分配其上的region。同时,管理用户对table的增删改查操作。Region Server 负责维护region,处理对这些region的IO请求并且切分在运行过程中变得过大的region。HBase 依赖ZooKeeper,默认情况下,HBase 管理ZooKeeper 实例。比如, 启动或者停止ZooKeeper。Master与RegionServers 启动时会向ZooKeeper注册。因此,Zookeeper的引入使得 Master不再是单点故障。Client每次写数据库之前,都会首先血Hlog日志。记录写操作。如果不做日志记录,一旦发生故障,操作将不可恢复。HMaster一旦故障,Zookeeper将重新选择一个新的Master 。无Master过程中,数据读取仍照常进行。但是,无master过程中,region切分、负载均衡等无法进行。RegionServer出现故障的处理原理是定时向Zookeeper汇报心跳,如果一旦时 间内未出现心跳HMaster将该RegionServer上的Region重新分配到其他RegionServer上。失效服务器上“预写”日志由主服务器进行分割并派送给新的 RegionServer 。Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例。 寻找RegionServer定位的顺序是ZooKeeper --ROOT-(单Region) -.META. -用户表 。如上图所示。-ROOT- 表包含.META.表所在的region列表,该表只会有一 个Region。 Zookeeper中记录了-ROOT-表的location。 .META. 表包含所有的用户空间region列表,以及 RegionServer的服务器地址。 HBase应用举例 Hbase适合需对数据进行随机读操作或者随机写操作、大数据上高并发操作,比如每秒对PB级数据进行上千次操作以及读写访问均是非常简单的操作。 淘宝指数是Hbase在淘宝的一个典型应用。交易历史纪录查询很适合用Hbase作为底层数据库。
hbase是什么工具
将数据导入HBase中有如下几种方式:使用HBase的API中的Put方法使用HBase 的bulk load 工具使用定制的MapReduce Job方式 使用HBase的API中的Put是最直接的方法,用法也很容易学习。但针对大部分情况,它并非都是最高效的方式。当需要将海量数据在规定时间内载入HBase中时,效率问题体现得尤为明显。待处理的数据量一般都是巨大的,这也许是为何我们选择了HBase而不是其他数据库的原因。在项目开始之前,你就该思考如何将所有能够很好的将数据转移进HBase,否则之后可能面临严重的性能问题。 HBase有一个名为 bulk load的功能支持将海量数据高效地装载入HBase中。Bulk load是通过一个MapReduce Job来实现的,通过Job直接生成一个HBase的内部HFile格式文件来形成一个特殊的HBase数据表,然后直接将数据文件加载到运行的集群中。使用bulk load功能最简单的方式就是使用importtsv 工具。importtsv 是从TSV文件直接加载内容至HBase的一个内置工具。它通过运行一个MapReduce Job,将数据从TSV文件中直接写入HBase的表或者写入一个HBase的自有格式数据文件。尽管importtsv 工具在需要将文本数据导入HBase的时候十分有用,但是有一些情况,比如导入其他格式的数据,你会希望使用编程来生成数据,而MapReduce是处理海量数据最有效的方式。这可能也是HBase中加载海量数据唯一最可行的方法了。当然我们可以使用MapReduce向HBase导入数据,但海量的数据集会使得MapReduce Job也变得很繁重。若处理不当,则可能使得MapReduce的job运行时的吞吐量很小。在HBase中数据合并是一项频繁执行写操作任务,除非我们能够生成HBase的内部数据文件,并且直接加载。这样尽管HBase的写入速度一直很快,但是若合并过程没有合适的配置,也有可能造成写操作时常被阻塞。写操作很重的任务可能引起的另一个问题就是将数据写入了相同的族群服务器(region server),这种情况常出现在将海量数据导入到一个新建的HBase中。一旦数据集中在相同的服务器,整个集群就变得不平衡,并且写速度会显著的降低。我们将会在本文中致力于解决这些问题。我们将从一个简单的任务开始,使用API中的Put方法将MySQL中的数据导入HBase。接着我们会描述如何使用 importtsv 和 bulk load将TSV数据文件导入HBase。我们也会有一个MapReduce样例展示如何使用其他数据文件格式来导入数据。上述方式都包括将数据直接写入HBase中,以及在HDFS中直接写入HFile类型文件。本文中最后一节解释在向HBase导入数据之前如何构建好集群。本文代码均是以Java编写,我们假设您具有基本Java知识,所以我们将略过如何编译与打包文中的Java示例代码,但我们会在示例源码中进行注释。
hbase清理数据 用setTimeRange 方法怎么脚本实现
HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。 1. 简介 HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。 2. HBase的表结构 HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)。 Row Key column-family1 column-family2 column-family3 column1 column2 column1 column2 column3 column1 key1 key2 key3 如上图所示,key1,key2,key3是三条记录的唯一的row key值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由row key1和column-family1-column1唯一确定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不一样,分别是t1,t2, hbase会返回最新时间的值给请求者。这些名词的具体含义如下:(1) Row Key与nosql数据库们一样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:(1.1) 通过单个row key访问(1.2) 通过row key的range(1.3) 全表扫描Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)注意:字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。(2) 列族 column familyhbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。(3) 单元 CellHBase中通过row和columns确定的为一个存贮单元称为cell。由{row key, column( =《family》 + 《label》), version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。(4) 时间戳 timestamp每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。3. HBase shell的基本用法hbase提供了一个shell的终端给用户交互。使用命令hbase shell进入命令界面。通过执行 help可以看到命令的帮助信息。以网上的一个学生成绩表的例子来演示hbase的用法。name grad course math art Tom 5 97 87 Jim 4 89 80 这里grad对于表来说是一个只有它自己的列族,course对于表来说是一个有两个列的列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族。
HBase从入门到精通11:HBase数据保存过程和Region分裂
本节来介绍一下HBase的数据保存过程和Region分裂过程的相关知识。 HBase中表的数据是存储在RegionServer上的一个个Region中的,表的一个列族对应于一个Region。Region是按照数据行键Rowkey的字典序来存储数据的。假如我们有一张表Bigdata,该表有一个列族Info,该列族下有一个列Name,且为了便于说明,假设行键和Name相同,按照行键字典序保存数据的过程如下图所示: HBase保存数据的流程有以下几个步骤: HBase表的列族在创建之初只有一个Region,随着插入数据的增多Region变得越来越大。过大的Region使得查询效率降低,因此当Region的大小超过某一阈值时,HBase将执行Region的分裂操作:即将一个大Region拆分成两个相等规模的小Region。具体的Region分裂过程如下图所示: HBase的Region分裂过程需要注意以下几个问题: 虽然Region分裂后可以提高HBase的读写性能,但是Region分裂过程会对集群网络造成很大的压力,尤其是要分裂的Region尺寸过大、数目过多时,甚至可以使整个集群瘫痪。例如,当年京东的Region分裂事件,造成整个集群瘫痪9个小时以上,无法对外提供服务,经济损失可想而知。 因此,应该根据实际需求将Region分裂的阈值设置的合理一些,太小会频繁触发分裂,太大分裂时会对网络传输造成一定的压力。
hbase源代码 纯java开发的吗
这里我们用一个学生成绩表作为例子,对HBase的基本操作和基本概念进行讲解:下面是学生的成绩表:name grad course:math course:artTom 1 87 97Jerry 2 100 80 这里grad对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成:math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族. 有了上面的想法和需求,我们就可以在HBase中建立相应的数据表啦!1, 建立一个表格 scores 具有两个列族grad 和couresehbase(main):002:0》 create ’scores’, ’grade’, ’course’0 row(s) in 4.1610 seconds2,查看当先HBase中具有哪些表hbase(main):003:0》 listscores1 row(s) in 0.0210 seconds3,查看表的构造hbase(main):004:0》 describe ’scores’{NAME =》 ’scores’, IS_ROOT =》 ’false’, IS_META =》 ’false’, FAMILIES =》 }1 row(s) in 0.0130 seconds4, 加入一行数据,行名称为 Tom 列族grad的列名为”” 值位1hbase(main):005:0》 put ’scores’, ’Tom’, ’grade:’, ’1’0 row(s) in 0.0070 seconds5,给Tom这一行的数据的列族添加一列 《math,87》hbase(main):006:0》 put ’scores’, ’Tom’, ’course:math’, ’87’0 row(s) in 0.0040 seconds6,给Tom这一行的数据的列族添加一列 《art,97》hbase(main):007:0》 put ’scores’, ’Tom’, ’course:art’, ’97’0 row(s) in 0.0030 seconds7, 加入一行数据,行名称为 Jerry 列族grad的列名为”” 值位2hbase(main):008:0》 put ’scores’, ’Jerry’, ’grade:’, ’2’0 row(s) in 0.0040 seconds8,给Jerry这一行的数据的列族添加一列 《math,100》hbase(main):009:0》 put ’scores’, ’Jerry’, ’course:math’, ’100’0 row(s) in 0.0030 seconds9,给Jerry这一行的数据的列族添加一列 《art,80》hbase(main):010:0》 put ’scores’, ’Jerry’, ’course:art’, ’80’0 row(s) in 0.0050 seconds10,查看scores表中Tom的相关数据hbase(main):011:0》 get ’scores’, ’Tom’COLUMN CELLcourse:art timestamp=1224726394286, value=97course:math timestamp=1224726377027, value=87grade: timestamp=1224726360727, value=13 row(s) in 0.0070 seconds11,查看scores表中所有数据
hbase scan的startRow和endRow
举一个场景,安全领域的溯源分析,查询维度包括ip,时间戳,端口,协议,可能根据前两的维度的一个或者几个进行原始日志查询,我们可以把原始日志存储到hbase中,而前面提到的几个维度可以分别作为key的一部分。 首先我们应该考虑的是rowkey的设置,第一:散列或者反转,保证数据会随机分布到不同的region当中。第二:预分区,先对数据做一个基本的统计,比如我们预分十个区,我们可以统计一下每个区的startrow和endrow,这样保证每个区的数据相当,另外这样的好处是当我们根据rowkey查询的时候,可以保证直接定位到某个分区。我们线上的数据就是采用的第二种方式。 然后我们应该考虑rowkey的组成。分两种情况,第一种情况:维度不是特别多,我们完全可以把各个维度分别作为rowkey的一部分,比如上文提到的需求,就是采用的这种方式,因为一共四个维度,相对来说比较少。第二种情况:维度过多,如果都作为rowkey的一部分的话长度太大,此时建议考虑二级索引,举个例子:比如对于上面提到的四个维度,如果现在进行扩展,ip,端口,协议需要定位到源和目的,这样的话,整个维度提升到了七个,此时就建议采用二级索引。 目前我们已经确定了hbase存储,并且采用预分区的方式并且采用rowkey进行过滤查询,那么现在考虑rowkey的设计。从技术角度考虑,预分区的方式时间戳不能作为第一部分,这样一定会出现数据倾斜的现象;从业务角度考虑,我们定位日志的时候,首先需要定位ip,然后是端口,最后才是协议,也就是说我们的用户去定位日志的时候,如果定位到端口,那必须先定位ip,如果定位协议的话,必须先定位ip和端口。 综上所述,我们的rowkey设计为ip+timestamp+port+prot 设计搞定之后,我们再考虑查询的问题。我们知道对于hbase的查询,最快的方式就是get,这样的话,可以迅速定位到一条数据。而get查询其实就是scan的特殊情况,只是startRow和endRow一样。所以此时我们可以采用scan+startRow+endRow的方式进行操作。 e.g 这样的话就可以吧该范围的数据查出来,当然我们可以再在内存中进行过滤 当着startRow和endRow需要注意一些情况。 ***隐藏网址***
更多文章:
asp中session加密(ASP中的Session用法,请各位帮帮忙..)
2024年7月24日 06:41
tkinter漂亮gui界面模板(如何使用pyQT做pythonGUI界面)
2024年7月23日 13:41
pywinauto获取控件(python pywinauto能控制任意的.exe进程吗)
2024年7月28日 00:55
java哪个版本好(谁知道JAVA有几个版本,哪个版本好些现在JAVA最高的版本是怎么样的)
2024年5月29日 14:07
excel一维垂直数组(excel里面怎么把横向的数据变成竖向的,最好是用函数的)
2024年7月22日 02:04
sql inserted(sql server中的触发器问题:当批量增删数据时,inserted和deleted中的数据会多于一行吗)
2024年6月26日 15:31
电脑和手机的web互通吗(服服的app和web端有什么区别ipad能用吗)
2024年7月8日 17:38
smilemo(smile more,worry less.怎么读)
2024年7月22日 12:35