07_尚硅谷大数据之HBase优化

合集下载

大数据之HBase数据插入优化之多线程并行插入

大数据之HBase数据插入优化之多线程并行插入

大数据之HBase数据插入优化之多线程并行插入1import org.apache.hadoop.conf.Configuration;2import org.apache.hadoop.hbase.HBaseConfiguration;3import java.io.BufferedReader;4import java.io.File;5import java.io.FileNotFoundException;6import java.io.FileReader;7import java.io.IOException;8import java.util.ArrayList;9import java.util.List;10import java.util.Random;1112import org.apache.hadoop.conf.Configuration;13import org.apache.hadoop.hbase.HBaseConfiguration;14import org.apache.hadoop.hbase.client.HBaseAdmin;15import org.apache.hadoop.hbase.client.HTable;16import org.apache.hadoop.hbase.client.HTableInterface;17import org.apache.hadoop.hbase.client.HTablePool;18import org.apache.hadoop.hbase.client.Put;1920public class HBaseImportEx {21static Configuration hbaseConfig = null;22public static HTablePool pool = null;23public static String tableName = "T_TEST_1";24static{25//conf = HBaseConfiguration.create();26 Configuration HBASE_CONFIG = new Configuration();27 HBASE_CONFIG.set("hbase.master","192.168.230.133:60000");28 HBASE_CONFIG.set("hbase.zookeeper.quorum","192.168.230.133");29 HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181");30 hbaseConfig = HBaseConfiguration.create(HBASE_CONFIG); 3132 pool = new HTablePool(hbaseConfig, 1000);33 }34/*35 * Insert Test single thread36 * */37public static void SingleThreadInsert()throws IOException38 {39 System.out.println("---------开始SingleThreadInsert测试----------");40long start = System.currentTimeMillis();41//HTableInterface table = null;42 HTable table = null;43 table = (HTable)pool.getTable(tableName);44 table.setAutoFlush(false);45 table.setWriteBufferSize(24*1024*1024);46//构造测试数据47 List<Put> list = new ArrayList<Put>();48int count = 10000;49byte[] buffer = new byte[350];50 Random rand = new Random();51for(int i=0;i<count;i++)52 {53 Put put = newPut(String.format("row %d",i).getBytes());54 rand.nextBytes(buffer);55 put.add("f1".getBytes(), null, buffer);56//wal=false57 put.setWriteToWAL(false);58 list.add(put);59if(i%10000 == 0)60 {61 table.put(list);62 list.clear();63 table.flushCommits();64 }65 }66long stop = System.currentTimeMillis();67//System.out.println("WAL="+wal+",autoFlush="+autoFlush+",buffer="+wr iteBuffer+",count="+count);6869 System.out.println("插入数据:"+count+"共耗时:"+ (stop - start)*1.0/1000+"s");7071 System.out.println("---------结束SingleThreadInsert测试----------");72 }73/*74 * 多线程环境下线程插入函数76 * */77public static void InsertProcess()throws IOException78 {79long start = System.currentTimeMillis();80//HTableInterface table = null;81 HTable table = null;82 table = (HTable)pool.getTable(tableName);83 table.setAutoFlush(false);84 table.setWriteBufferSize(24*1024*1024);85//构造测试数据86 List<Put> list = new ArrayList<Put>();87int count = 10000;88byte[] buffer = new byte[256];89 Random rand = new Random();90for(int i=0;i<count;i++)91 {92 Put put = newPut(String.format("row %d",i).getBytes());93 rand.nextBytes(buffer);94 put.add("f1".getBytes(), null, buffer);95//wal=false96 put.setWriteToWAL(false);97 list.add(put);98if(i%10000 == 0)99 {100 table.put(list);101 list.clear();102 table.flushCommits();103 }104 }105long stop = System.currentTimeMillis();106//System.out.println("WAL="+wal+",autoFlush="+autoFlush+",buffer="+wr iteBuffer+",count="+count);107108 System.out.println("线程:"+Thread.currentThread().getId()+"插入数据:"+count+"共耗时:"+ (stop - start)*1.0/1000+"s");109 }110111112/*113 * Mutil thread insert test115public static void MultThreadInsert() throws InterruptedException116 {117 System.out.println("---------开始MultThreadInsert测试----------");118long start = System.currentTimeMillis();119int threadNumber = 10;120 Thread[] threads=new Thread[threadNumber];121for(int i=0;i<threads.length;i++)122 {123 threads[i]= new ImportThread();124 threads[i].start();125 }126for(int j=0;j< threads.length;j++)127 {128 (threads[j]).join();129 }130long stop = System.currentTimeMillis();131132 System.out.println("MultThreadInsert:"+threadNumber*10000+"共耗时:"+ (stop - start)*1.0/1000+"s"); 133 System.out.println("---------结束MultThreadInsert测试----------");134 }135136/**137 * @param args138*/139public static void main(String[] args) throws Exception{140// TODO Auto-generated method stub141//SingleThreadInsert();142 MultThreadInsert();143144145 }146147public static class ImportThread extends Thread{148public void HandleThread()149 {150//this.TableName = "T_TEST_1";151152153 }155public void run(){156try{157 InsertProcess();158 }159catch(IOException e){160 e.printStackTrace(); 161 }finally{162 System.gc();163 }164 }165 }166167 }。

01_尚硅谷大数据之HBase简介

01_尚硅谷大数据之HBase简介

第1章HBase简介1.1 什么是HBaseHBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE 技术可在廉价PC Server上搭建起大规模结构化存储集群。

HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。

HBASE是Google Bigtable的开源实现,但是也有很多不同之处。

比如:Google Bigtable 利用GFS作为其文件存储系统,HBASE利用Hadoop HDFS作为其文件存储系统;Google 运行MAPREDUCE来处理Bigtable中的海量数据,HBASE同样利用Hadoop MapReduce来处理HBASE中的海量数据;Google Bigtable利用Chubby作为协同服务,HBASE利用Zookeeper作为对应。

1.2 HBase中的角色1.2.1 HMaster功能:1) 监控RegionServer2) 处理RegionServer故障转移3) 处理元数据的变更4) 处理region的分配或移除5) 在空闲时间进行数据的负载均衡6) 通过Zookeeper发布自己的位置给客户端1.2.2 RegionServer功能:1) 负责存储HBase的实际数据2) 处理分配给它的Region3) 刷新缓存到HDFS4) 维护HLog5) 执行压缩6) 负责处理Region分片1.2.3 其他组件:1) Write-Ahead logsHBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。

但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。

所以在系统出现故障的时候,数据可以通过这个日志文件重建。

Hbase2.x新特性Hbase常见问题性优化小总结

Hbase2.x新特性Hbase常见问题性优化小总结

Hbase2.x新特性Hbase常见问题性优化⼩总结在很早之前,我曾经写过两篇关于Hbase的⽂章:如果你没有看过,推荐收藏看⼀看。

另外,在我的CSDN有专门的HBase专栏可以系统学习,参考:《Hbase专栏》本⽂在上⾯⽂章的基础上,新增了更多的内容,并且增加了Hbase2.x版本的新功能。

Hbase常见问题集合问: Hbase⼤量写⼊很慢,⼀个列族,每个200多列,⼀秒写30000条数据,使⽤mutate添加数据,clientbuffer缓存⼤⼩为10M,四台测试机,128G内存,分配60G给Hbase,该怎么优化?答:可以使⽤bulkload⽅式写⼊,通过mr程序⽣产hfile⽂件,直接⽤bulkload导⼊⽣成的hfile⽂件,速度⾮常快。

问: hbase⼤规模的丢数据,整个数据库系统都挂掉了,然后发错误⽇志,说Hdfs内部的配置⽂件,hbase.version,丢失了。

⼤家有遇到过类似的问题吗?⾃建的集群。

答:检查⼀下⼀些服务的端⼝有没有暴露到公⽹,是不是集群被攻击了。

⾃建还是有⼀些风险的。

然后检查下⾃⼰的hbase配置。

看看数据的备份情况。

问: start-hbase.sh中有这么⼀段:if [ "$distMode" == 'false' ]then"$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master $@else"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" $commandToRun zookeeper"$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \--hosts "${HBASE_REGIONSERVERS}" $commandToRun regionserver"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \--hosts "${HBASE_BACKUP_MASTERS}" $commandToRun master-backupfidistMode为false时表⽰单机,true时表⽰集群,看脚本好像是单机只启动master,是否是说单机环境下不需要zookeeper,regionserver这些的意思,可是⽹上搜了下⼜有⼈说单机环境下master和 zookeeper会运⾏在同⼀个jvm。

hbase参数配置说明

hbase参数配置说明

hbase参数配置及优化1)hbase.client.write.buffer描述:这个参数可以设置写入数据缓冲区的大小,当客户端和服务器端传输数据,服务器为了提高系统运行性能开辟一个写的缓冲区来处理它,这个参数设置如果设置的大了,将会对系统的内存有一定的要求,直接影响系统的性能。

2)hbase.master.meta.thread.rescanfrequency描述:多长时间HMaster对系统表root 和meta 扫描一次,这个参数可以设置的长一些,降低系统的能耗。

3)hbase.regionserver.handler.count描述:由于HBase/Hadoop的Server是采用Multiplexed, non-blocking I/O方式而设计的,所以它可以透过一个Thread来完成处理,但是由于处理Client端所呼叫的方法是Blocking I/O,所以它的设计会将Client所传递过来的物件先放置在Queue,并在启动Server时就先产生一堆Handler(Thread),该Handler会透过Polling的方式来取得该物件并执行对应的方法,默认为25,根据实际场景可以设置大一些。

如调到调到100~200之间,提高regionserver性能。

4) hbase.regionserver.thread.splitcompactcheckfrequency描述:这个参数是表示多久去RegionServer服务器运行一次split/compaction的时间间隔,当然split之前会先进行一个compact操作.这个compact操作可能是minor compact也可能是major pact后,会从所有的Store下的所有StoreFile文件最大的那个取midkey.这个midkey可能并不处于全部数据的mid中.一个row-key的下面的数据可能会跨不同的HRegion。

尚硅谷大数据技术之 Hadoop(生产调优手册)说明书

尚硅谷大数据技术之 Hadoop(生产调优手册)说明书

尚硅谷大数据技术之Hadoop(生产调优手册)(作者:尚硅谷大数据研发部)版本:V3.3第1章HDFS—核心参数1.1 NameNode内存生产配置1)NameNode内存计算每个文件块大概占用150byte,一台服务器128G内存为例,能存储多少文件块呢?128 * 1024 * 1024 * 1024 / 150Byte ≈9.1亿G MB KB Byte2)Hadoop2.x系列,配置NameNode内存NameNode内存默认2000m,如果服务器内存4G,NameNode内存可以配置3g。

在hadoop-env.sh文件中配置如下。

HADOOP_NAMENODE_OPTS=-Xmx3072m3)Hadoop3.x系列,配置NameNode内存(1)hadoop-env.sh中描述Hadoop的内存是动态分配的# The maximum amount of heap to use (Java -Xmx). If no unit # is provided, it will be converted to MB. Daemons will# prefer any Xmx setting in their respective _OPT variable.# There is no default; the JVM will autoscale based upon machine # memory size.# export HADOOP_HEAPSIZE_MAX=# The minimum amount of heap to use (Java -Xms). If no unit # is provided, it will be converted to MB. Daemons will# prefer any Xms setting in their respective _OPT variable.# There is no default; the JVM will autoscale based upon machine # memory size.# export HADOOP_HEAPSIZE_MIN=HADOOP_NAMENODE_OPTS=-Xmx102400m(2)查看NameNode占用内存[atguigu@hadoop102 ~]$ jps3088 NodeManager2611 NameNode3271 JobHistoryServer2744 DataNode3579 Jps[atguigu@hadoop102 ~]$ jmap -heap 2611Heap Configuration:MaxHeapSize = 1031798784 (984.0MB)(3)查看DataNode占用内存[atguigu@hadoop102 ~]$ jmap -heap 2744Heap Configuration:MaxHeapSize = 1031798784 (984.0MB)查看发现hadoop102上的NameNode和DataNode占用内存都是自动分配的,且相等。

好程序员大数据培训 大数据hbasede的调优设置课后小结

好程序员大数据培训 大数据hbasede的调优设置课后小结

好程序员大数据培训大数据hbase的调优设置课后小结学习是个枯燥乏味的过程,需要苦中作乐。

而人生的路途,职业的规划,让我毫不犹豫地选择了这种方式,重归课堂,坐在好程序大数据高端班的教室中,重新接受知无穷无尽的知识的洗礼,千锤百炼,脚下的步伐沉重却越发坚决。

通过三个月的学习,即将结束hadoop阶段的学习,进入spark的学习了。

对于Hadoop也有了自己的一些理解与体会,它不是一个软件,而是很多软件构成的一整个生态圈,有分布式文件系统hdfs,分布式计算框架MapReduce,数据流语言Pig,分布式、按列存储的数据仓库hive,分布式、按列存储的数据库Hbase,分布式、高可用的协调服务zookeeper,数据库与HDFS传输的工具sqoop等。

下面我总结一下hbase的调优设置:1.hbase.hregion.max.filesize应该设置多少合适:默认值:256M。

Maximum HStoreFile size. If any one of a column families' HStoreFiles has grown to exceed this value, the hosting HRegion is split in two. HStoreFile的最大值。

如果任何一个Column Family(或者说HStore)的HStoreFiles的大小超过这个值,那么,其所属的HRegion就会Split成两个。

调优:hbase中hfile的默认最大值(hbase.hregion.max.filesize)是256MB,而google的bigtable论文中对tablet的最大值也推荐为100-200MB,这个大小有什么秘密呢?众所周知hbase中数据一开始会写入memstore,当memstore满64MB以后,会flush到disk上而成为storefile。

当storefile数量超过3时,会启动compaction过程将它们合并为一个storefile。

Hbase性能调优(一)

Hbase性能调优(一)

Hbase性能调优(⼀)1、修改Linux配置Linux系统最⼤可打开⽂件数⼀般默认的参数值是1024,如果不进⾏修改,并发量上来的时候会出现“Too Many Open Files”的错误,导致整个Hbase不可运⾏:调优⽅法:使⽤ulimit -n命令进⾏修改,或者修改/etc/security/limits.conf和/proc/sys/fs/file-max的参数,具体如何修改可以去Google关键字“linux limits.conf”2、修改JVM配置修改hbase-env.sh⽂件中的配置参数HBASE_HEAPSIZE 4000 #Hbase使⽤的JVM堆的⼤⼩HBASE_OPTS "‐server ‐XX:+UseConcMarkSweepGC"JVM #GC 选项HBASE_MANAGES_ZK false #是否使⽤Zookeeper进⾏分布式管理3、修改HBase配置zookeeper.session.timeout=180000ms(默认值3分钟)说明:RegionServer与Zookeeper间的连接超时时间。

当超时时间到后,RegionServer会被Zookeeper从RS集群清单中移除,Hmaster收到移除通知后,会对这台server负责的regions重新balance,让其他存活的RegionServer接管。

调优⽅法:这个timeout决定了RegionServer是否能够及时的failover。

设置成1分钟或更低,可以减少因等待超时⽽被延长的failover时间。

但是,对于对于⼀些Online应⽤,RegionServer从宕机到恢复时间本⾝就很短的(⽐如:⽹络闪断,crash等故障),如果调低timeout时间,反⽽得不偿失。

因为当RegionServer被正式从RS集群中移除时,HMaster就开始做balance了(让其他RS根据故障机器记录的WAL⽇志进⾏恢复)。

HBase性能优化方法总结

HBase性能优化方法总结

HBase性能优化方法总结本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法。

1. 表的设计1.1 Pre-Creating Regions默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。

一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。

有关预分区,详情参见:Table Creation: Pre-Creating Regions,下面是一个例子:[html]view plain copy1.public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)2.throws IOException {3. try {4. admin.createTable(table, splits);5. return true;6. } catch (TableExistsException e) {7. ("table " + table.getNameAsString() + " already exists");8. // the table already exists...9. return false;10. }11.}12.13.public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) {14. byte[][] splits = new byte[numRegions-1][];15. BigInteger lowestKey = new BigInteger(startKey, 16);16. BigInteger highestKey = new BigInteger(endKey, 16);17. BigInteger range = highestKey.subtract(lowestKey);18. BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));19.lowestKey = lowestKey.add(regionIncrement);20. for(int i=0; i <numRegions-1;i++) {21. BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));22. byte[] b = String.format("%016x", key).getBytes();23. splits[i] = b;24. }25. return splits;26.}1.2 Row KeyHBase中row key用来检索表中的记录,支持以下三种方式:•通过单个row key访问:即按照某个row key键值进行get操作;•通过row key的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描;•全表扫描:即直接扫描整张表中所有行记录。

HBase.Coprocessor优化与实验

HBase.Coprocessor优化与实验
– 每个 RS 对其管理的 Region 并行扫 描,扫描结果在 RS 节点先做一次
RS 级别结果汇聚
线程池管理
异步 IPC 调用 (走网络)
RegionServe r
HBase Coprocessor 优化与实验
1
HBase 简介
• HBase 是在 Hadoop 之上构建的非关系型、面向列存储的开源分布式结构化 数据存储系统
• HBase 表分区与索引管理
• 将 Table 中的数据根据 rowKey 字段划分为 多个 HRegion
• HRegion 分配给 RegionServer 管理
• WALObserver :提供 WAL 相关 操作钩子。
• MasterObserver :提供 DDL 类型
的操作钩子。如创建、删除、 修改数据表等。
• Endpoint :只适用于
该图参考了《 HBase Coprocessor 的分析》 /?p=77 5
Introduction,
https:///hbase/
entry/coprocessor_introduction
6
HBase Coprocessor Endpoint 示例
Client 通过 API 调用对某行 / 行范围的处理, CP 框架自动将行范围映射到 Region ,并将计算请求 发送给每个 Region 并行执行
动分片为多个并行的 RPC 调用) • 提供可构建分布式服务的灵活的编程模型 • 可以自动扩展,负载均衡等
– 与 Google Bigtable Coprocessor 相比
• Bigtable coprocessor 以独立的进程执行,可以更好的控制 CP 计算所需资源 • HBase coprocessor 是一个在 Master/RegionServer 进程内的框架,通过在运行时执行用户的

07_尚硅谷大数据之HBase优化

07_尚硅谷大数据之HBase优化

第7章HBase优化7.1 高可用在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。

所以HBase支持对Hmaster的高可用配置。

1)关闭HBase集群(如果没有开启则跳过此步)[atguigu@hadoop102 hbase]$ bin/stop-hbase.sh2)在conf目录下创建backup-masters文件[atguigu@hadoop102 hbase]$ touch conf/backup-masters3)在backup-masters文件中配置高可用HMaster节点[atguigu@hadoop102 hbase]$ echo hadoop103 > conf/backup-masters4)将整个conf目录scp到其他节点[atguigu@hadoop102 hbase]$ scp -r conf/ hadoop103:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/ [atguigu@hadoop102 hbase]$ scp -r conf/ hadoop104:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/ 5)打开页面测试查看0.98版本之前:http://hadooo102:600100.98版本及之后:http://hadooo102:160107.2 预分区每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey 范围,则该数据交给这个region维护。

那么依照这个原则,我们可以将数据索要投放的分区提前大致的规划好,以提高HBase性能。

1)手动设定预分区hbase> create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']2)生成16进制序列预分区create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}3)按照文件中设置的规则预分区创建splits.txt文件内容如下:create 'staff3','partition3',SPLITS_FILE => 'splits.txt'4)使用JavaAPI创建预分区7.3 RowKey设计一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计rowkey的主要目的,就是让数据均匀的分布于所有的region 中,在一定程度上防止数据倾斜。

基于Hbase的大数据查询优化

基于Hbase的大数据查询优化

基于Hbase的大数据查询优化作者:朱明王志瑞来源:《智能计算机与应用》2017年第04期摘要: Hbase有着先天的优势和先天的劣势,而劣势就是其较差的数据定位能力,也就是数据查询能力。

因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费资源较大,查询效率较低。

类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了研究,借助分布式计算框架Mapreduce在Hbase上构建了二级索引,就可以对表进行有针对性的定位和高效率的查找,同时也减轻zookeeper服务对资源调度的压力。

关键词: Hbase;大数据处理; Secondary Indexing中图分类号:TP311文献标志码:A文章编号:2095-2163(2017)04-0059-030引言随着企业在发展过程中积累数据的日益递增,关于大量业务数据的存储和处理即已成为关涉企业运营效率的热点研究问题之一,此时则需对自身的数据库作出调整。

而Google公司关于BigTable的开源实现,更为非传统型数据库探讨研发提供了高端设计可能。

作为非传统型数据库的优秀代表,Hbase就因具备的高可靠性、高性能、面向列、可伸缩的特点,已然成为企业在面临大量数据处理时的基础实效应用设计模式。

本文即针对这一内容展开如下研究论述。

1Hbase体系架构Hbase技术来源于 Fay Chang 所撰写的Google论文“Bigtable”关于一个结构化数据的“分布式存储系统”。

是和Hadoop分布式文件系统对应的一个分布式数据库的概念。

具体地,Hbase 是一个分布式、面向列开源数据库。

而且也不同于一般的关系数据库,Hbase是一个适合于非结构化数据存储的数据库。

进一步地,Hbase是基于列的而非基于行的模式,这就与传统型数据库呈现出显著差别。

Hbase是Apache的Hadoop项目的顶级项目。

hbase名词解释

hbase名词解释

HBase名词解释1. 什么是HBase?HBase是一个基于Hadoop的分布式、面向列的非关系型数据库。

它是Apache软件基金会的一个开源项目,被设计用于处理大规模数据集。

HBase提供了高可靠性、高性能和高可扩展性,并且具有强大的数据模型。

2. HBase的特点2.1 列存储HBase以列族(Column Family)的形式存储数据,而不是以行的形式。

每个列族包含多个列限定符(Column Qualifier),这些列限定符可以动态地定义。

这种列存储的方式使得HBase能够高效地存储稀疏数据。

2.2 分布式HBase基于Hadoop的分布式文件系统(HDFS)进行数据存储,数据被分散存储在多个节点上,可以实现水平扩展,处理大规模数据集。

2.3 高可靠性HBase通过数据的冗余复制提供了高可靠性。

数据被复制到多个节点上,当某个节点出现故障时,可以从其他节点恢复数据。

2.4 高性能HBase通过将数据存储在内存中,并使用B树索引来提供高性能的数据访问。

此外,HBase还支持在列族级别进行数据压缩,减少了存储空间的占用。

2.5 强一致性HBase提供了强一致性的读写操作。

当数据被写入或读取时,HBase会确保数据的一致性,避免出现数据不一致的情况。

2.6 支持在线扩容HBase支持在线扩容,可以动态地添加或删除节点,以适应数据量的增长或减少。

这种扩容方式不会影响正在进行的读写操作。

2.7 支持复杂的查询HBase支持针对单行或范围的查询操作,可以根据行键(Row Key)或列限定符进行查询。

此外,HBase还支持过滤器(Filter)的使用,可以进行更复杂的查询。

3. HBase的数据模型HBase的数据模型是基于行的,每一行由一个唯一的行键标识。

行键是按照字典顺序进行排序的,可以使用任意的字节序列作为行键。

HBase的数据是以列族的形式进行组织的。

每个列族可以包含多个列限定符,列限定符是列族内的列的唯一标识。

HBase查询优化

HBase查询优化

HBase查询优化1.概述HBase是⼀个实时的⾮关系型数据库,⽤来存储海量数据。

但是,在实际使⽤场景中,在使⽤HBase API查询HBase中的数据时,有时会发现数据查询会很慢。

本篇博客将从客户端优化和服务端优化两个⽅⾯来介绍,如何提⾼查询HBase的效率。

2.内容这⾥,我们先给⼤家介绍如何从客户端优化查询速度。

2.1 客户端优化客户端查询HBase,均通过HBase API的来获取数据,如果在实现代码逻辑时使⽤API不当,也会造成读取耗时严重的情况。

2.1.1 Scan优化在使⽤HBase的Scan接⼝时,⼀次Scan会返回⼤量数据。

客户端向HBase发送⼀次Scan请求,实际上并不会将所有数据加载到本地,⽽是通过多次RPC请求进⾏加载。

这样设计的好处在于避免⼤量数据请求会导致⽹络带宽负载过⾼影响其他业务使⽤HBase,另外从客户端的⾓度来说可以避免数据量太⼤,从⽽本地机器发送OOM(内存溢出)。

默认情况下,HBase每次Scan会缓存100条,可以通过属性hbase.client.scanner.caching来设置。

另外,最⼤值默认为-1,表⽰没有限制,具体实现见源代码:/*** @return the maximum result size in bytes. See {@link #setMaxResultSize(long)}*/public long getMaxResultSize() {return maxResultSize;}/*** Set the maximum result size. The default is -1; this means that no specific* maximum result size will be set for this scan, and the global configured* value will be used instead. (Defaults to unlimited).** @param maxResultSize The maximum result size in bytes.*/public Scan setMaxResultSize(long maxResultSize) {this.maxResultSize = maxResultSize;return this;}⼀般情况下,默认缓存100就可以满⾜,如果数据量过⼤,可以适当增⼤缓存值,来减少RPC次数,从⽽降低Scan的总体耗时。

HBase 数据库检索性能优化策略大数据培训

HBase 数据库检索性能优化策略大数据培训

HBase 数据库检索性能优化策略兄弟连IT教育作为国内领先的培训机构,迄今已有10年的教育历史。

8大特色课程:PHP培训、安卓培训、JAVAEE+大数据、UI设计、HTML5培训、云计算架构师,虚拟现实VR培训,机器人教育培训,在目前IT市场特别火,每门课程都由名师牵头,以认认真真的态度做教育。

HBase 数据表介绍HBase 数据库是一个基于分布式的、面向列的、主要用于非结构化数据存储用途的开源数据库。

其设计思路来源于 Google 的非开源数据库”BigTable”。

HDFS 为 HBase 提供底层存储支持,MapReduce 为其提供计算能力,ZooKeeper 为其提供协调服务和failover(失效转移的备份操作)机制。

Pig 和 Hive 为 HBase 提供了高层语言支持,使其可以进行数据统计(可实现多表 join 等),Sqoop 则为其提供 RDBMS 数据导入功能。

HBase 不能支持 where 条件、Order by 查询,只支持按照主键 Rowkey 和主键的 range 来查询,但是可以通过 HBase 提供的 API 进行条件过滤。

HBase 的 Rowkey 是数据行的唯一标识,必须通过它进行数据行访问,目前有三种方式,单行键访问、行键范围访问、全表扫描访问。

数据按行键的方式排序存储,依次按位比较,数值较大的排列在后,例如 int 方式的排序:1,10,100,11,12,2,20…,906,…。

ColumnFamily 是“列族”,属于 schema 表,在建表时定义,每个列属于一个列族,列名用列族作为前缀“ColumnFamily:qualifier”,访问控制、磁盘和内存的使用统计都是在列族层面进行的。

Cell 是通过行和列确定的一个存储单元,值以字节码存储,没有类型。

Timestamp 是区分不同版本 Cell 的索引,64 位整型。

不同版本的数据按照时间戳倒序排列,最新的数据版本排在最前面。

HBase(十)HBase性能调优总结

HBase(十)HBase性能调优总结

HBase(⼗)HBase性能调优总结⼀. HBase的通⽤优化1 ⾼可⽤在 HBase 中 Hmaster 负责监控 RegionServer 的⽣命周期,均衡 RegionServer 的负载,如果 Hmaster 挂掉了,那么整个 HBase 集群将陷⼊不健康的状态,并且此时的⼯作状态并不会维持太久。

所以 HBase ⽀持对 Hmaster 的⾼可⽤配置。

HBase的⾼可⽤集群搭建参考:2 Hadoop 的通⽤性优化1) NameNode 元数据备份使⽤ SSD2) 定时备份 NameNode 上的元数据每⼩时或者每天备份,如果数据极其重要,可以 5~10 分钟备份⼀次。

备份可以通过定时任务复制元数据⽬录即可。

3) 为 NameNode 指定多个元数据⽬录使⽤ .dir 或者 .dir 指定。

这样可以提供元数据的冗余和健壮性,以免发⽣故障。

4) NameNode 的 dir ⾃恢复设置 .dir.restore 为 true,允许尝试恢复之前失败的 .dir⽬录,在创建 checkpoint 时做此尝试,如果设置了多个磁盘,建议允许。

5) HDFS 保证 RPC 调⽤会有较多的线程数属性:node.handler.count解释:该属性是 NameNode 服务默认线程数,默认值是 10,根据机器的可⽤内存可以调整为 50~100属性:dfs.datanode.handler.count解释:该属性默认值为 10,是 DataNode 的处理线程数,如果 HDFS 客户端程序读写请求⽐较多,可以调⾼到 15~20,设置的值越⼤,内存消耗越多,不要调整的过⾼,⼀般业务中,5~10 即可。

hdfs-site.xml6) HDFS 副本数的调整属性:dfs.replication解释:如果数据量巨⼤,且不是⾮常之重要,可以调整为 2~3,如果数据⾮常之重要,可以调整为 3~5。

hdfs-site.xml7) HDFS ⽂件块⼤⼩的调整属性:dfs.blocksize解释:块⼤⼩定义,该属性应该根据存储的⼤量的单个⽂件⼤⼩来设置,如果⼤量的单个⽂件都⼩于 100M,建议设置成 64M 块⼤⼩,对于⼤于 100M 或者达到 GB 的这种情况,建议设置成 256M,⼀般设置范围波动在 64M~256M 之间。

高级数据库技术

高级数据库技术

浅析Hadoop集群下HBase数据库的性能优化摘要:随着大数据应用的程度不断开展,NOSQL也日益成为大家关注的焦点。

各种集群应用也不短涌现。

本通通过对HADOOP集群和HBASE集群的介绍及构建,深入分析了HBASE集群的性能优化。

得出HBase性能优化不要从程序和配置文件两方面入手,从而提高HBASE集群性能。

关键词:HBASE;HADOOP;集群;优化1Hadoop集群概述随着互联网的高速开展,各种各样的数据冲刺着我们的视野。

人们上传视频、照片、文章,更新论坛信息、点击广告留言等,这使得机器产生和保存的数据越来越多。

数据的指数级增长首先向谷歌、雅虎、亚马逊和微软等处于市场领导地位的公司提出了挑战。

他们需要遍历TB级和PB级数据来发现哪些更受欢送,哪些书有需求,哪种广告更吸引用户,现有技术处理这些数据已经显得吃力。

面对挑战及使命,谷歌率先发表了MapReduce数据处理算法相关的论文,同时,Doug Cutting受到MapReduce算法的启示,领导开发了开源版本的MapReduce,命名为Hadoop。

由于Hadoop生态系统的开源性、可持续性以及其高性能的处理能力,雅虎等公司纷纷响应,为其提供支持。

如今,Hadoop已经成为许多互联网公司根底计算平台的核心局部。

研究和分析Hadoop生态系统集群已经迫在眉睫。

Hadoop作为一个开源框架,可以编写和运行分布式应用,处理大规模数据。

分布式计算时一个广泛并且不断变化的领域,但Hadoop集群与分布式不同之处在于以下几点:方便。

Hadoop集群运行在由一般商用机器构成的大型集群上,或者如亚马逊弹性计算云(EC2)等云计算效劳之上;强健。

Hadoop集群致力于在一般商用硬件上运行其架构假设硬件会频繁地出现失效。

它可以沉着地处理大多数此类故障。

可扩展性。

Hadoop集群通过增加集群节点,可以线性地扩展,以便处理更大的数据集。

简单。

Hadoop允许用户快速编写高效的并行代码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第7章HBase优化
7.1 高可用
在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。

所以HBase支持对Hmaster的高可用配置。

1)关闭HBase集群(如果没有开启则跳过此步)
[atguigu@hadoop102 hbase]$ bin/stop-hbase.sh
2)在conf目录下创建backup-masters文件
[atguigu@hadoop102 hbase]$ touch conf/backup-masters
3)在backup-masters文件中配置高可用HMaster节点
[atguigu@hadoop102 hbase]$ echo hadoop103 > conf/backup-masters
4)将整个conf目录scp到其他节点
[atguigu@hadoop102 hbase]$ scp -r conf/ hadoop103:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/ [atguigu@hadoop102 hbase]$ scp -r conf/ hadoop104:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/ 5)打开页面测试查看
0.98版本之前:http://hadooo102:60010
0.98版本及之后:http://hadooo102:16010
7.2 预分区
每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey 范围,则该数据交给这个region维护。

那么依照这个原则,我们可以将数据索要投放的分区提前大致的规划好,以提高HBase性能。

1)手动设定预分区
hbase> create 'staff','info','partition1',SPLITS => ['1000','2000','3000','4000']
2)生成16进制序列预分区
create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
3)按照文件中设置的规则预分区
创建splits.txt文件内容如下:
create 'staff3','partition3',SPLITS_FILE => 'splits.txt'
4)使用JavaAPI创建预分区
7.3 RowKey设计
一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计rowkey的主要目的,就是让数据均匀的分布于所有的region 中,在一定程度上防止数据倾斜。

接下来我们就谈一谈rowkey常用的设计方案。

1)生成随机数、hash、散列值
2)字符串反转
这样也可以在一定程度上散列逐步put进来的数据。

3)字符串拼接
7.4 内存优化
HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,一般会分配整个可用内存的70%给HBase的Java堆。

但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般16~48G内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

7.5 基础优化
1)允许在HDFS的文件中追加内容
hdfs-site.xml、hbase-site.xml
2)优化DataNode允许的最大文件打开数
3)优化延迟高的数据操作的等待时间
4)优化数据的写入效率
5)优化DataNode存储
6)设置RPC监听数量
7)优化HStore文件大小
8)优化hbase客户端缓存
9)指定scan.next扫描HBase所获取的行数
10)flush、compact、split机制
当MemStore达到阈值,将Memstore中的数据Flush进Storefile;compact机制则是把flush 出来的小文件合并成大的Storefile文件。

split则是当Region达到阈值,会把过大的Region 一分为二。

涉及属性:
即:128M就是Memstore的默认阈值
即:这个参数的作用是当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。

RegionServer的flush是通过将请求添加一个队列,模拟生产消费模型来异步处理的。

那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。

即:当MemStore使用内存总量达到hbase.regionserver.global.memstore.upperLimit指定值时,将会有多个MemStores flush到文件中,MemStore flush 顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于lowerLimit。

相关文档
最新文档