当前位置:首页 » 服务存储 » hbase存储模型
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

hbase存储模型

发布时间: 2022-04-29 17:47:59

① hbase存储物理模型中有哪些

1、 从通常是单因素的简单逻辑思维到多因素的复杂逻辑思维(包括判断、推理、假设、归纳、分析演绎等)的过度是第三个原因。

初中生进入高一以后普遍不会解题,要么就乱套公式,瞎做一气。其中一个重要的原因就是缺乏较为复杂的逻辑思维能力。不善于判断和推理,不会联想,缺乏分析、归纳、演绎的能力。在这一点上,学生与学生之间存在的个体差异也是很大的。

1、 从通常是单因素的简单逻辑思维到多因素的复杂逻辑思维(包括判断、推理、假设、归纳、分析演绎等)的过度是第三个原因。

初中生进入高一以后普遍不会解题,要么就乱套公式,瞎做一气。其中一个重要的原因就是缺乏较为复杂的逻辑思维能力。不善于判断和推理,不会联想,缺乏分析、归纳、演绎的能力。在这一点上,学生与学生之间存在的个体差异也是很大的。

② 1.Hbase的数据模型是什么,通过哪些元素定义

HBASE是列式存储,主要有表名,列族,rowkey,列,timestamp定义

③ 大数据专业需要学习什么样的知识

第一阶段:大数据技术入门
1大数据入门:介绍当前流行大数据技术,数据技术原理,并介绍其思想,介绍大数据技术培训课程,概要介绍。
2Linux大数据必备:介绍Lniux常见版本,VMware虚拟机安装Linux系统,虚拟机网络配置,文件基本命令操作,远程连接工具使用,用户和组创建,删除,更改和授权,文件/目录创建,删除,移动,拷贝重命名,编辑器基本使用,文件常用操作,磁盘基本管理命令,内存使用监控命令,软件安装方式,介绍LinuxShell的变量,控制,循环基本语法,LinuxCrontab定时任务使用,对Lniux基础知识,进行阶段性实战训练,这个过程需要动手操作,将理论付诸实践。
3CM&CDHHadoop的Cloudera版:包含Hadoop,HBase,Hiva,Spark,Flume等,介绍CM的安装,CDH的安装,配置,等等。
第二阶段:海量数据高级分析语言
Scala是一门多范式的编程语言,类似于java,设计的初衷是实现可伸缩的语言,并集成面向对象编程和函数式编程的多种特性,介绍其优略势,基础语句,语法和用法, 介绍Scala的函数,函数按名称调用,使用命名参数函数,函数使用可变参数,递归函数,默认参数值,高阶函数,嵌套函数,匿名函数,部分应用函数,柯里函数,闭包,需要进行动手的操作。
第三阶段:海量数据存储分布式存储
1HadoopHDFS分布式存储:HDFS是Hadoop的分布式文件存储系统,是一个高度容错性的系统,适合部署在廉价的机器上,HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用,介绍其的入门基础知识,深入剖析。
2HBase分布式存储:HBase-HadoopDatabase是一个高可靠性,高性能,面向列,可伸缩的分布式存储系统,利用HBase技术可在廉价PC上搭建起大规模结构化存储集群,介绍其入门的基础知识,以及设计原则,需实际操作才能熟练。
第四阶段:海量数据分析分布式计算
1HadoopMapRece分布式计算:是一种编程模型,用于打过莫数据集的并行运算。
2Hiva数据挖掘:对其进行概要性简介,数据定义,创建,修改,删除等操作。
3Spare分布式计算:Spare是类MapRece的通用并行框架。
第五阶段:考试
1技术前瞻:对全球最新的大数据技术进行简介。
2考前辅导:自主选择报考工信部考试,对通过者发放工信部大数据技能认证书。
上面的内容包含了大数据学习的所有的课程,所以,如果有想学大数据的可以从这方面下手,慢慢的了解大数据。

④ 大数据都需要学什么软件

学习大数据一般分为以下几个阶段:

第一阶段:大数据基础

Java基础——Java语法基础。掌握JAVA的开发环境搭建以及基础知识等.能够熟练使用逻辑语法进行代码编写

数据结构——数组、链表、栈、队列、排序、二分查找、散列表、哈希表、二叉树,红黑树、递归树,堆和栈。继续提升大家的计算机素养,掌握算法初步。

Mysql基础——mysql安装、基本SQL语句、SQL优化。掌握数据库的基本应用。

Javaweb——tomacat、servlet、JSP 、MVC。掌握web开发的相关内容,理解数据来源

高级java——面向对象、网络编程、反射、多线程。理解分布式程序运行原理,为以后阅读大数据框架打下基础。

linux基础——虚拟机安装、常用linux命令、shell脚本。学会使用linux操作系统,为部署大数据集群做准备。

第二阶段:大数据框架

Hadoop——分布式存储、分布式计算、公共通用接口。掌握部署大数据集群,熟练编写map-rece程序。

Zookeeper——Zookeeper协调机制、选举机制。搭建高可用集群。

Hive——数据仓库搭建、数据导入和分析。初步掌握数据仓库的概念,为后续企业级数仓做准备。

Hbase——Hbase集群搭建、大数据数据库工作原理、列式存储、高吞吐量应用开发。掌握大数据数据库Hbase的应用,科学的行键设计,热点数据处理。

Kafka——理解消息队列、Kafka集群部署、高并发高可用数据采集框架搭建。掌握高可以高并发数据队列系统设计、能处理峰值问题。

Scala——Scala语法基础、常用算子、异步通信。掌握优秀的数据处理语言Scala

Spark——Spark集群搭建、离线数据处理、实时数据处理、机器学习、图计算。掌握一栈式解决方案Spark,它是大数据的核心模块。

常用辅助框架——Sqoop、Flume、Presto、impala、Phoenix、oozie、ElasticSearch、kylin、MongoDB、Redi、Druid。掌握常用工具和与大数据紧密相关的框架,提高工作效率,拓展框架功能。

第三阶段:机器学习

python基础——python基础语法、面向对象、Numpy。掌握python基础语法和机器学习相关的基础框架。

数学基础——线性代数、微积分、概率、凸优化。本部分内容理解即可,对优化模型很重要。

常用算法——回归、KNN、决策树、聚类、集成学习、SVM、多分类、贝叶斯、EM、隐马模型、深度学习。掌握常用计算器学习算法的原理,能够根据数据特性选择合适的模型,训练泛化能力强的模型。

第四阶段:项目实操

云和数据有大数据专业,可以详细了解一下,看看这个专业的职业发展。

⑤ Hadoop有哪几个组成部分-ITJOB

1、Hadoop Common :Hadoop体系最底层的一个模块,为Hadoop各子项目提供各种工具,如:配置文件和日志操作等。
2、HDFS:分布式文件系统,提供高吞吐量的应用程序数据访问,对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS内部提供元数据服务;DataNode,它为 HDFS提供存储块。由于仅存在一个 NameNode,因此这是 HDFS的一个缺点(单点失败)。
存储在 HDFS中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode可以控制所有文件操作。HDFS内部的所有通信都基于标准的 TCP/IP协议。
3、MapRece :一个分布式海量数据处理的软件框架集计算集群。
4、Avro :doug cutting主持的RPC项目,主要负责数据的序列化。有点类似Google的protobuf和Facebook的thrift。avro用来做以后hadoop的RPC,使hadoop的RPC模块通信速度更快、数据结构更紧凑。
5、Hive :类似CloudBase,也是基于hadoop分布式计算平台上的提供data warehouse的sql功能的一套软件。使得存储在hadoop里面的海量数据的汇总,即席查询简单化。hive提供了一套QL的查询语言,以sql为基础,使用起来很方便。
6、HBase :基于Hadoop Distributed File System,是一个开源的,基于列存储模型的可扩展的分布式数据库,支持大型表的存储结构化数据。
7、Pig :是一个并行计算的高级的数据流语言和执行框架 ,SQL-like语言,是在MapRece上构建的一种高级查询语言,把一些运算编译进MapRece模型的Map和Rece中,并且用户可以定义自己的功能。
8、ZooKeeper :Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
9、Chukwa :一个管理大型分布式系统的数据采集系统由yahoo贡献。
10、Cassandra :无单点故障的可扩展的多主数据库。
11、Mahout :一个可扩展的机器学习和数据挖掘库。

⑥ 为什么说hbase是一个面向列的数据库

在说HBase之前,我想再唠叨几句。做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户就变多了,结果您的系统应付不过来了了,不干了,这岂不是咱哥几个的悲哀,说时髦点就叫“杯具啊”。

其实说白了,这些就是事先没有认清楚互联网应用什么才是最重要的。从系统架构的角度来说,互联网应用更加看重系统性能以及伸缩性,而传统企业级应用都是比较看重数据完整性和数据安全性。那么我们就来说说互联网应用伸缩性这事儿.对于伸缩性这事儿,哥们儿我也写了几篇博文,想看的兄弟可以参考我以前的博文,对于web server,app server的伸缩性,我在这里先不说了,因为这部分的伸缩性相对来说比较容易一点,我主要来回顾一些一个慢慢变大的互联网应用如何应对数据库这一层的伸缩。

首先刚开始,人不多,压力也不大,搞一台数据库服务器就搞定了,此时所有的东东都塞进一个Server里,包括web server,app server,db server,但是随着人越来越多,系统压力越来越多,这个时候可能你把web server,app server和db server分离了,好歹这样可以应付一阵子,但是随着用户量的不断增加,你会发现,数据库这哥们不行了,速度老慢了,有时候还会宕掉,所以这个时候,你得给数据库这哥们找几个伴,这个时候Master-Salve就出现了,这个时候有一个Master Server专门负责接收写操作,另外的几个Salve Server专门进行读取,这样Master这哥们终于不抱怨了,总算读写分离了,压力总算轻点了,这个时候其实主要是对读取操作进行了水平扩张,通过增加多个Salve来克服查询时CPU瓶颈。一般这样下来,你的系统可以应付一定的压力,但是随着用户数量的增多,压力的不断增加,你会发现Master server这哥们的写压力还是变的太大,没办法,这个时候怎么办呢?你就得切分啊,俗话说“只有切分了,才会有伸缩性嘛”,所以啊,这个时候只能分库了,这也是我们常说的数据库“垂直切分”,比如将一些不关联的数据存放到不同的库中,分开部署,这样终于可以带走一部分的读取和写入压力了,Master又可以轻松一点了,但是随着数据的不断增多,你的数据库表中的数据又变的非常的大,这样查询效率非常低,这个时候就需要进行“水平分区”了,比如通过将User表中的数据按照10W来划分,这样每张表不会超过10W了。

综上所述,一般一个流行的web站点都会经历一个从单台DB,到主从复制,到垂直分区再到水平分区的痛苦的过程。其实数据库切分这事儿,看起来原理貌似很简单,如果真正做起来,我想凡是sharding过数据库的哥们儿都深受其苦啊。对于数据库伸缩的文章,哥们儿可以看看后面的参考资料介绍。

好了,从上面的那一堆废话中,我们也发现数据库存储水平扩张scale out是多么痛苦的一件事情,不过幸好技术在进步,业界的其它弟兄也在努力,09年这一年出现了非常多的NoSQL数据库,更准确的应该说是No relation数据库,这些数据库多数都会对非结构化的数据提供透明的水平扩张能力,大大减轻了哥们儿设计时候的压力。下面我就拿Hbase这分布式列存储系统来说说。

一 Hbase是个啥东东?
在说Hase是个啥家伙之前,首先我们来看看两个概念,面向行存储和面向列存储。面向行存储,我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的,面向行存储的数据库主要适合于事务性要求严格场合,或者说面向行存储的存储系统适合OLTP,但是根据CAP理论,传统的RDBMS,为了实现强一致性,通过严格的ACID事务来进行同步,这就造成了系统的可用性和伸缩性方面大大折扣,而目前的很多NoSQL产品,包括Hbase,它们都是一种最终一致性的系统,它们为了高的可用性牺牲了一部分的一致性。好像,我上面说了面向列存储,那么到底什么是面向列存储呢?Hbase,Casandra,Bigtable都属于面向列存储的分布式存储系统。看到这里,如果您不明白Hbase是个啥东东,不要紧,我再总结一下下:

Hbase是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写操作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。

二 Hbase数据模型
HBase,Cassandra的数据模型非常类似,他们的思想都是来源于Google的Bigtable,因此这三者的数据模型非常类似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我没发现。好了,废话少说,我们来看看Hbase的数据模型到底是个啥东东。

在Hbase里面有以下两个主要的概念,Row key,Column Family,我们首先来看看Column family,Column family中文又名“列族”,Column family是在系统启动之前预先定义好的,每一个Column Family都可以根据“限定符”有多个column.下面我们来举个例子就会非常的清晰了。

假如系统中有一个User表,如果按照传统的RDBMS的话,User表中的列是固定的,比如schema 定义了name,age,sex等属性,User的属性是不能动态增加的。但是如果采用列存储系统,比如Hbase,那么我们可以定义User表,然后定义info 列族,User的数据可以分为:info:name = zhangsan,info:age=30,info:sex=male等,如果后来你又想增加另外的属性,这样很方便只需要info:newProperty就可以了。

也许前面的这个例子还不够清晰,我们再举个例子来解释一下,熟悉SNS的朋友,应该都知道有好友Feed,一般设计Feed,我们都是按照“某人在某时做了标题为某某的事情”,但是同时一般我们也会预留一下关键字,比如有时候feed也许需要url,feed需要image属性等,这样来说,feed本身的属性是不确定的,因此如果采用传统的关系数据库将非常麻烦,况且关系数据库会造成一些为null的单元浪费,而列存储就不会出现这个问题,在Hbase里,如果每一个column 单元没有值,那么是占用空间的。下面我们通过两张图来形象的表示这种关系:

上图是传统的RDBMS设计的Feed表,我们可以看出feed有多少列是固定的,不能增加,并且为null的列浪费了空间。但是我们再看看下图,下图为Hbase,Cassandra,Bigtable的数据模型图,从下图可以看出,Feed表的列可以动态的增加,并且为空的列是不存储的,这就大大节约了空间,关键是Feed这东西随着系统的运行,各种各样的Feed会出现,我们事先没办法预测有多少种Feed,那么我们也就没有办法确定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基于列存储的数据模型就非常适合此场景。说到这里,采用Hbase的这种方式,还有一个非常重要的好处就是Feed会自动切分,当Feed表中的数据超过某一个阀值以后,Hbase会自动为我们切分数据,这样的话,查询就具有了伸缩性,而再加上Hbase的弱事务性的特性,对Hbase的写入操作也将变得非常快。

上面说了Column family,那么我之前说的Row key是啥东东,其实你可以理解row key为RDBMS中的某一个行的主键,但是因为Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要根据你系统的查询需求来设计了额。我还拿刚才那个Feed的列子来说,我们一般是查询某个人最新的一些Feed,因此我们Feed的Row key可以有以下三个部分构成<userId><timestamp><feedId>,这样以来当我们要查询某个人的最进的Feed就可以指定Start Rowkey为<userId><0><0>,End Rowkey为<userId><Long.MAX_VALUE><Long.MAX_VALUE>来查询了,同时因为Hbase中的记录是按照rowkey来排序的,这样就使得查询变得非常快。

三 Hbase的优缺点
1 列的可以动态增加,并且列为空就不存储数据,节省存储空间.

2 Hbase自动切分数据,使得数据存储自动具有水平scalability.

3 Hbase可以提供高并发读写操作的支持

Hbase的缺点:

1 不能支持条件查询,只支持按照Row key来查询.

2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.

四.补充
1.数据类型,HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。
2.数据操作:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接操作。
3.存储模式:HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的。而传统的关系型数据库是基于表格结构和行模式保存的
4.数据维护,HBase的更新操作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改
5.可伸缩性,Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功能

⑦ mysql怎样高效率随机获取n条数据

数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表。另外,一般大企业面试往往会从单机数据库问起,一步一步问到分库分表,中间会穿插很多数据库优化的问题。本文试图描述单机数据库优化的一些实践,数据库基于mysql,如有不合理的地方,欢迎指正。

1、表结构优化

在开始做一个应用的时候,数据库的表结构设计往往会影响应用后期的性能,特别是用户量上来了以后的性能。因此,表结构优化是一个很重要的步骤。

1.1、字符集

一般来说尽量选择UTF-8,虽然在存中午的时候GBK比UTF-8使用的存储空间少,但是UTF-8兼容各国语言,其实我们不必为了这点存储空间而牺牲了扩展性。事实上,后期如果要从GBK转为UTF-8所要付出的代价是很高的,需要进行数据迁移,而存储空间完全可以用花钱扩充硬盘来解决。

1.2、主键

在使用mysql的innodb的时候,innodb的底层存储模型是B+树,它使用主键作为聚簇索引,使用插入的数据作为叶子节点,通过主键可以很快找到叶子节点,从而快速获取记录。因此在设计表的时候需要增加一个主键,而且最好要自增。因为自增主键可以让插入的数据按主键顺序插入到底层的B+树的叶子节点中,由于是按序的,这种插入几乎不需要去移动已有的其它数据,所以插入效率很高。如果主键不是自增的,那么每次主键的值近似随机,这时候就有可能需要移动大量数据来保证B+树的特性,增加了不必要的开销。

1.3、字段

1.3.1、建了索引的字段必须加上not null约束,并且设置default值

1.3.2、不建议使用float、double来存小数,防止精度损失,建议使用decimal

1.3.3、不建议使用Text/blob来保存大量数据,因为对大文本的读写会造成比较大的I/O开销,同时占用mysql的缓存,高并发下会极大的降低数据库的吞吐量,建议将大文本数据保存在专门的文件存储系统中,mysql中只保存这个文件的访问地址,比如博客文章可以保存在文件中,mysql中只保存文件的相对地址。

1.3.4、varchar类型长度建议不要超过8K。

1.3.5、时间类型建议使用Datetime,不要使用timestamp,虽然Datetime占用8个字节,而timestamp只占用4个字节,但是后者要保证非空,而且后者是对时区敏感的。

1.3.6、建议表中增加gmt_create和gmt_modified两个字段,用来记录数据创建的修改时间。这两个字段建立的原因是方便查问题。

1.4、索引创建

1.4.1、这个阶段由于对业务并不了解,所以尽量不要盲目加索引,只为一些一定会用到索引的字段加普通索引。

1.4.2、创建innodb单列索引的长度不要超过767bytes,如果超过会用前255bytes作为前缀索引

1.4.3、创建innodb组合索引的各列索引长度不要超过767bytes,一共加起来不要超过3072bytes

2、SQL优化

一般来说sql就那么几种:基本的增删改查,分页查询,范围查询,模糊搜索,多表连接

2.1、基本查询

一般查询需要走索引,如果没有索引建议修改查询,把有索引的那个字段加上,如果由于业务场景没法使用这个字段,那么需要看这个查询调用量大不大,如果大,比如每天调用10W+,这就需要新增索引,如果不大,比如每天调用100+,则可以考虑保持原样。另外,select * 尽量少用,用到什么字段就在sql语句中加什么,不必要的字段就别查了,浪费I/O和内存空间。

2.2、高效分页

limit m,n其实质就是先执行limit m+n,然后从第m行取n行,这样当limit翻页越往后翻m越大,性能越低。比如

select * from A limit 100000,10,这种sql语句的性能是很差的,建议改成下面的版本:

selec id,name,age from A where id >=(select id from A limit 100000,1) limit 10

2.3、范围查询

范围查询包括between、大于、小于以及in。Mysql中的in查询的条件有数量的限制,若数量较小可以走索引查询,若数量较大,就成了全表扫描了。而between、大于、小于等,这些查询不会走索引,所以尽量放在走索引的查询条件之后。

2.4、模糊查询like

使用 like %name%这样的语句是不会走索引的,相当于全表扫描,数据量小的时候不会有太大的问题,数据量大了以后性能会下降的很厉害,建议数据量大了以后使用搜索引擎来代替这种模糊搜索,实在不行也要在模糊查询前加个能走索引的条件。

2.5、多表连接

子查询和join都可以实现在多张表之间取数据,但是子查询性能较差,建议将子查询改成join。对于mysql的join,它用的是Nested Loop Join算法,也就是通过前一个表查询的结果集去后一个表中查询,比如前一个表的结果集是100条数据,后一个表有10W数据,那么就需要在100*10W的数据集合中去过滤得到最终的结果集。因此,尽量用小结果集的表去和大表做join,同时在join的字段上建立索引,如果建不了索引,就需要设置足够大的join buffer size。如果以上的技巧都无法解决join所带来的性能下降的问题,那干脆就别用join了,将一次join查询拆分成两次简单查询。另外,多表连接尽量不要超过三张表,超过三张表一般来说性能会很差,建议拆分sql。

3、数据库连接池优化

数据库连接池本质上是一种缓存,它是一种抗高并发的手段。数据库连接池优化主要是对参数进行优化,一般我们使用DBCP连接池,它的具体参数如下:

3.1 initialSize

初始连接数,这里的初始指的是第一次getConnection的时候,而不是应用启动的时候。初始值可以设置为并发量的历史平均值

3.2、minIdle

最小保留的空闲连接数。DBCP会在后台开启一个回收空闲连接的线程,当该线程进行空闲连接回收的时候,会保留minIdle个连接数。一般设置为5,并发量实在很小可以设置为1.

3.3、maxIdle

最大保留的空闲连接数,按照业务并发高峰设置。比如并发高峰为20,那么当高峰过去后,这些连接不会马上被回收,如果过一小段时间又来一个高峰,那么连接池就可以复用这些空闲连接而不需要频繁创建和关闭连接。

3.4、maxActive

最大活跃连接数,按照可以接受的并发极值设置。比如单机并发量可接受的极值是100,那么这个maxActive设置成100后,就只能同时为100个请求服务,多余的请求会在最大等待时间之后被抛弃。这个值必须设置,可以防止恶意的并发攻击,保护数据库。

3.5、maxWait

获取连接的最大等待时间,建议设置的短一点,比如3s,这样可以让请求快速失败,因为一个请求在等待获取连接的时候,线程是不可以被释放的,而单机的线程并发量是有限的,如果这个时间设置的过长,比如网上建议的60s,那么这个线程在这60s内是无法被释放的,只要这种请求一多,应用的可用线程就少了,服务就变得不可用了。

3.6、minEvictableIdleTimeMillis

连接保持空闲而不被回收的时间,默认30分钟。

3.7、validationQuery

用于检测连接是否有效的sql语句,一般是一条简单的sql,建议设置

3.8、testOnBorrow

申请连接的时候对连接进行检测,不建议开启,严重影响性能

3.9、testOnReturn

归还连接的时候对连接进行检测,不建议开启,严重影响性能

3.10、testWhileIdle

开启了以后,后台清理连接的线程会没隔一段时间对空闲连接进行validateObject,如果连接失效则会进行清除,不影响性能,建议开启

3.11、numTestsPerEvictionRun

代表每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接。

3.12、预热连接池

对于连接池,建议在启动应用的时候进行预热,在还未对外提供访问之前进行简单的sql查询,让连接池充满必要的连接数。

4、索引优化

当数据量增加到一定程度后,靠sql优化已经无法提升性能了,这时候就需要祭出大招:索引。索引有三级,一般来说掌握这三级就足够了,另外,对于建立索引的字段,需要考虑其选择性。

4.1、一级索引

在where后面的条件上建立索引,单列可以建立普通索引,多列则建立组合索引。组合索引需要注意最左前缀原则。

4.2、二级索引

如果有被order by或者group by用到的字段,则可以考虑在这个字段上建索引,这样一来,由于索引天然有序,可以避免order by以及group by所带来的排序,从而提高性能。

4.3、三级索引

如果上面两招还不行,那么就把所查询的字段也加上索引,这时候就形成了所谓的索引覆盖,这样做可以减少一次I/O操作,因为mysql在查询数据的时候,是先查主键索引,然后根据主键索引去查普通索引,然后根据普通索引去查相对应的记录。如果我们所需要的记录在普通索引里都有,那就不需要第三步了。当然,这种建索引的方式比较极端,不适合一般场景。

4.4、索引的选择性

在建立索引的时候,尽量在选择性高的字段上建立。什么是选择性高呢?所谓选择性高就是通过这个字段查出来的数据量少,比如按照名字查一个人的信息,查出来的数据量一般会很少,而按照性别查则可能会把数据库一半的数据都查出来,所以,名字是一个选择性高的字段,而性别是个选择性低的字段。

5、历史数据归档

当数据量到了一年增加500W条的时候,索引也无能为力,这时候一般的思路都是考虑分库分表。如果业务没有爆发式增长,但是数据的确在缓慢增加,则可以不考虑分库分表这种复杂的技术手段,而是进行历史数据归档。我们针对生命周期已经完结的历史数据,比如6个月之前的数据,进行归档。我们可以使用quartz的调度任务在凌晨定时将6个月之前的数据查出来,然后存入远程的hbase服务器。当然,我们也需要提供历史数据的查询接口,以备不时之需。

以上就是对mysql 单机数据库的优化资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

⑧ 请教关于hbase的强一致模型的理解

说道HBase的强一致性模型,其实应该去理解事务。传统关系型数据库做到了跨行、跨表的事务,但是原生的HBase仅支持单行的事务,仅这一点,其实是可以得到HBase强一致性的结论。所以这篇帖中,有同学提到了这点,只是那时候我不太理解HBase怎么实现行的事务的,所以我直接飘过了。事务的ACID特征中的C其实讲的就是一致性,所以只要承认了HBase的行事务,也就说明了HBase的强一致性了。

⑨ 大数据学习需要哪些课程

01.Tableau全套课程免费下载

链接:https://pan..com/s/1UpiYkNZI3su99CQQYUmL9g

提取码:kc5i

01.Tableau全套课程|04.Tableau更新专区|03.Tableau实战|02.Tableau进阶|01.Tableau入门|03.Tableau基础教程视频(中文+英文) 8课|02.Tableau从零开始学习视频(中文+英文) 7课|01.Tableau8.0快速入门视频教程 10课|

⑩ 淘宝为什么使用HBase及如何优化的

1 前言
hbase是从hadoop中 分离出来的apache顶级开源项目。由于它很好地用java实现了google的bigtable系统大部分特性,因此在数据量猛增的今天非常受到欢 迎。对于淘宝而言,随着市场规模的扩大,产品与技术的发展,业务数据量越来越大,对海量数据的高效插入和读取变得越来越重要。由于淘宝拥有也许是国内最大 的单一hadoop集群(云梯),因此对hadoop系列的产品有比较深入的了解,也就自然希望使用hbase来做这样一种海量数据读写服务。本篇文章将 对淘宝最近一年来在online应用上使用和优化hbase的情况做一次小结。

2 原因
为什么要使用hbase?
淘宝在2011年之前所有的后端持久化存储基本上都是在mysql上进行的(不排除少量oracle/bdb/tair/mongdb等),mysql由于开源,并且生态系统良好,本身拥有分库分表等多种解决方案,因此很长一段时间内都满足淘宝大量业务的需求。

但是由于业务的多样化发展,有越来越多的业务系统的需求开始发生了变化。一般来说有以下几类变化:

a) 数据量变得越来越多,事实上现在淘宝几乎任何一个与用户相关的在线业务的数据量都在亿级别,每日系统调用次数从亿到百亿都有,且历史数据不能轻易删除。这需要有一个海量分布式文件系统,能对TB级甚至PB级别的数据提供在线服务
b) 数据量的增长很快且不一定能准确预计,大多数应用系统从上线起在一段时间内数据量都呈很快的上升趋势,因此从成本的角度考虑对系统水平扩展能力有比较强烈的需求,且不希望存在单点制约
c) 只需要简单的kv读取,没有复杂的join等需求。但对系统的并发能力以及吞吐量、响应延时有非常高的需求,并且希望系统能够保持强一致性
d) 通常系统的写入非常频繁,尤其是大量系统依赖于实时的日志分析
e) 希望能够快速读取批量数据
f ) schema灵活多变,可能经常更新列属性或新增列
g) 希望能够方便使用,有良好且语义清晰的java接口

以上需求综合在一起,我们认为hbase是一种比较适合的选择。首先它的数据由hdfs天然地做了数据冗余,云梯三年的稳定运行,数据100%可靠 己经证明了hdfs集群的安全性,以及服务于海量数据的能力。其次hbase本身的数据读写服务没有单点的限制,服务能力可以随服务器的增长而线性增长, 达到几十上百台的规模。LSM-Tree模式的设计让hbase的写入性能非常良好,单次写入通常在1-3ms内即可响应完成,且性能不随数据量的增长而 下降。

region(相当于数据库的分表)可以ms级动态的切分和移动,保证了负载均衡性。由于hbase上的数据模型是按rowkey排序存储的,而读 取时会一次读取连续的整块数据做为cache,因此良好的rowkey设计可以让批量读取变得十分容易,甚至只需要1次io就能获取几十上百条用户想要的 数据。最后,淘宝大部分工程师是java背景的同学,因此hbase的api对于他们来说非常容易上手,培训成本相对较低。

当然也必须指出,在大数据量的背景下银弹是不存在的,hbase本身也有不适合的场景。比如,索引只支持主索引(或看成主组合索引),又比如服务是 单点的,单台机器宕机后在master恢复它期间它所负责的部分数据将无法服务等。这就要求在选型上需要对自己的应用系统有足够了解。

3 应用情况
我们从2011年3月开始研究hbase如何用于在线服务。尽管之前在一淘搜索中己经有了几十节点的离线服务。这是因为hbase早期版本的目标就 是一个海量数据中的离线服务。2009年9月发布的0.20.0版本是一个里程碑,online应用正式成为了hbase的目标,为此hbase引入了 zookeeper来做为backupmaster以及regionserver的管理。2011年1月0.90.0版本是另一个里程碑,基本上我们今天 看到的各大网站,如facebook/ebay/yahoo内所使用于生产的hbase都是基于这一个版本(fb所采用的0.89版本结构与0.90.x 相近)。bloomfilter等诸多属性加入了进来,性能也有极大提升。基于此,淘宝也选用了0.90.x分支作为线上版本的基础。

第一个上线的应用是数据魔方中的prom。prom原先是基于redis构建的,因为数据量持续增大以及需求的变化,因此我们用hbase重构了它 的存储层。准确的说prom更适合0.92版本的hbase,因为它不仅需要高速的在线读写,更需要count/group by等复杂应用。但由于当时0.92版本尚未成熟,因此我们自己单独实现了coprocessor。prom的数据导入是来源于云梯,因此我们每天晚上花 半个小时将数据从云梯上写入hbase所在的hdfs,然后在web层做了一个client转发。经过一个月的数据比对,确认了速度比之redis并未有 明显下降,以及数据的准确性,因此得以顺利上线。

第二个上线的应用是TimeTunnel,TimeTunnel是一个高效的、可靠的、可扩展的实时数据传输平台,广泛应用于实时日志收集、数据实 时监控、广告效果实时反馈、数据库实时同步等领域。它与prom相比的特点是增加了在线写。动态的数据增加使hbase上compact/balance /split/recovery等诸多特性受到了极大的挑战。TT的写入量大约一天20TB,读的量约为此的1.5倍,我们为此准备了20台 regionserver的集群,当然底层的hdfs是公用的,数量更为庞大(下文会提到)。每天TT会为不同的业务在hbase上建不同的表,然后往该 表上写入数据,即使我们将region的大小上限设为1GB,最大的几个业务也会达到数千个region这样的规模,可以说每一分钟都会有数次 split。在TT的上线过程中,我们修复了hbase很多关于split方面的bug,有好几个commit到了hbase社区,同时也将社区一些最新 的patch打在了我们的版本上。split相关的bug应该说是hbase中会导致数据丢失最大的风险之一,这一点对于每个想使用hbase的开发者来 说必须牢记。hbase由于采用了LSM-Tree模型,从架构原理上来说数据几乎没有丢失的可能,但是在实际使用中不小心谨慎就有丢失风险。原因后面会 单独强调。TT在预发过程中我们分别因为Meta表损坏以及split方面的bug曾经丢失过数据,因此也单独写了meta表恢复工具,确保今后不发生类 似问题(hbase-0.90.5以后的版本都增加了类似工具)。另外,由于我们存放TT的机房并不稳定,发生过很多次宕机事故,甚至发生过假死现象。因 此我们也着手修改了一些patch,以提高宕机恢复时间,以及增强了监控的强度。

CTU以及会员中心项目是两个对在线要求比较高的项目,在这两个项目中我们特别对hbase的慢响应问题进行了研究。hbase的慢响应现在一般归 纳为四类原因:网络原因、gc问题、命中率以及client的反序列化问题。我们现在对它们做了一些解决方案(后面会有介绍),以更好地对慢响应有控制 力。

和Facebook类似,我们也使用了hbase做为实时计算类项目的存储层。目前对内部己经上线了部分实时项目,比如实时页面点击系 统,galaxy实时交易推荐以及直播间等内部项目,用户则是散布到公司内各部门的运营小二们。与facebook的puma不同的是淘宝使用了多种方式 做实时计算层,比如galaxy是使用类似affa的actor模式处理交易数据,同时关联商品表等维度表计算排行(TopN),而实时页面点击系统则是 基于twitter开源的storm进行开发,后台通过TT获取实时的日志数据,计算流将中间结果以及动态维表持久化到hbase上,比如我们将 rowkey设计为url+userid,并读出实时的数据,从而实现实时计算各个维度上的uv。

最后要特别提一下历史交易订单项目。这个项目实际上也是一个重构项目,目的是从以前的solr+bdb的方案上迁移到hbase上来。由于它关系到 己买到页面,用户使用频率非常高,重要程度接近核心应用,对数据丢失以及服务中断是零容忍。它对compact做了优化,避免大数据量的compact在 服务时间内发生。新增了定制的filter来实现分页查询,rowkey上对应用进行了巧妙的设计以避免了冗余数据的传输以及90%以上的读转化成了顺序 读。目前该集群存储了超过百亿的订单数据以及数千亿的索引数据,线上故障率为0。

随着业务的发展,目前我们定制的hbase集群己经应用到了线上超过二十个应用,数百台服务器上。包括淘宝首页的商品实时推荐、广泛用于卖家的实时量子统计等应用,并且还有继续增多以及向核心应用靠近的趋势。

4 部署、运维和监控
Facebook之前曾经透露过Facebook的hbase架构,可以说是非常不错的。如他们将message服务的hbase集群按用户分为数 个集群,每个集群100台服务器,拥有一台namenode以及分为5个机架,每个机架上一台zookeeper。可以说对于大数据量的服务这是一种优良 的架构。对于淘宝来说,由于数据量远没有那么大,应用也没有那么核心,因此我们采用公用hdfs以及zookeeper集群的架构。每个hdfs集群尽量 不超过100台规模(这是为了尽量限制namenode单点问题)。在其上架设数个hbase集群,每个集群一个master以及一个 backupmaster。公用hdfs的好处是可以尽量减少compact的影响,以及均摊掉硬盘的成本,因为总有集群对磁盘空间要求高,也总有集群对 磁盘空间要求低,混合在一起用从成本上是比较合算的。zookeeper集群公用,每个hbase集群在zk上分属不同的根节点。通过zk的权限机制来保 证hbase集群的相互独立。zk的公用原因则仅仅是为了运维方便。

由于是在线应用,运维和监控就变得更加重要,由于之前的经验接近0,因此很难招到专门的hbase运维人员。我们的开发团队和运维团队从一开始就很重视该问题,很早就开始自行培养。以下讲一些我们的运维和监控经验。

我们定制的hbase很重要的一部分功能就是增加监控。hbase本身可以发送ganglia监控数据,只是监控项远远不够,并且ganglia的 展示方式并不直观和突出。因此一方面我们在代码中侵入式地增加了很多监控点,比如compact/split/balance/flush队列以及各个阶 段的耗时、读写各个阶段的响应时间、读写次数、region的open/close,以及具体到表和region级别的读写次数等等。仍然将它们通过 socket的方式发送到ganglia中,ganglia会把它们记录到rrd文件中,rrd文件的特点是历史数据的精度会越来越低,因此我们自己编写 程序从rrd中读出相应的数据并持久化到其它地方,然后自己用js实现了一套监控界面,将我们关心的数据以趋势图、饼图等各种方式重点汇总和显示出来,并 且可以无精度损失地查看任意历史数据。在显示的同时会把部分非常重要的数据,如读写次数、响应时间等写入数据库,实现波动报警等自定义的报警。经过以上措 施,保证了我们总是能先于用户发现集群的问题并及时修复。我们利用redis高效的排序算法实时地将每个region的读写次数进行排序,能够在高负载的 情况下找到具体请求次数排名较高的那些region,并把它们移到空闲的regionserver上去。在高峰期我们能对上百台机器的数十万个 region进行实时排序。

为了隔离应用的影响,我们在代码层面实现了可以检查不同client过来的连接,并且切断某些client的连接,以在发生故障时,将故障隔离在某个应用内部而不扩大化。maprece的应用也会控制在低峰期运行,比如在白天我们会关闭jobtracker等。

此外,为了保障服务从结果上的可用,我们也会定期跑读写测试、建表测试、hbck等命令。hbck是一个非常有用的工具,不过要注意它也是一个很重 的工操作,因此尽量减少hbck的调用次数,尽量不要并行运行hbck服务。在0.90.4以前的hbck会有一些机率使hbase宕机。另外为了确保 hdfs的安全性,需要定期运行fsck等以检查hdfs的状态,如block的replica数量等。

我们会每天根踪所有线上服务器的日志,将错误日志全部找出来并且邮件给开发人员,以查明每一次error以上的问题原因和fix。直至错误降低为0。另外 每一次的hbck结果如果有问题也会邮件给开发人员以处理掉。尽管并不是每一次error都会引发问题,甚至大部分error都只是分布式系统中的正常现 象,但明白它们问题的原因是非常重要的。

5 测试与发布
因为是未知的系统,我们从一开始就非常注重测试。测试从一开始就分为性能测试和功能测试。性能测试主要是注意基准测试,分很多场景,比如不同混合读 写比例,不同k/v大小,不同列族数,不同命中率,是否做presharding等等。每次运行都会持续数小时以得到准确的结果。因此我们写了一套自动化 系统,从web上选择不同的场景,后台会自动将测试参数传到各台服务器上去执行。由于是测试分布式系统,因此client也必须是分布式的。

我们判断测试是否准确的依据是同一个场景跑多次,是否数据,以及运行曲线达到99%以上的重合度,这个工作非常烦琐,以至于消耗了很多时间,但后来 的事实证明它非常有意义。因为我们对它建立了100%的信任,这非常重要,比如后期我们的改进哪怕只提高2%的性能也能被准确捕捉到,又比如某次代码修改 使compact队列曲线有了一些起伏而被我们看到,从而找出了程序的bug,等等。

功能测试上则主要是接口测试和异常测试。接口测试一般作用不是很明显,因为hbase本身的单元测试己经使这部分被覆盖到了。但异常测试非常重要, 我们绝大部分bug修改都是在异常测试中发现的,这帮助我们去掉了很多生产环境中可能存在的不稳定因素,我们也提交了十几个相应的patch到社区,并受 到了重视和commit。分布式系统设计的难点和复杂度都在异常处理上,我们必须认为系统在通讯的任何时候都是不可靠的。某些难以复现的问题我们会通过查 看代码大体定位到问题以后,在代码层面强行抛出异常来复现它。事实证明这非常有用。

为了方便和快速定位问题,我们设计了一套日志收集和处理的程序,以方便地从每台服务器上抓取相应的日志并按一定规律汇总。这非常重要,避免浪费大量的时间到登录不同的服务器以寻找一个bug的线索。

由于hbase社区在不停发展,以及线上或测试环境发现的新的bug,我们需要制定一套有规律的发布模式。它既要避免频繁的发布引起的不稳定,又要 避免长期不发布导致生产版本离开发版本越来越远或是隐藏的bug爆发。我们强行规定每两周从内部trunk上release一个版本,该版本必须通过所有 的测试包括回归测试,并且在release后在一个小型的集群上24小时不受甘扰不停地运行。每个月会有一次发布,发布时采用最新release的版本, 并且将现有的集群按重要性分级发布,以确保重要应用不受新版本的潜在bug影响。事实证明自从我们引入这套发布机制后,由发布带来的不稳定因素大大下降 了,并且线上版本也能保持不落后太多。

6 改进和优化
Facebook是一家非常值得尊敬的公司,他们毫无保留地对外公布了对hbase的所有改造,并且将他们内部实际使用的版本开源到了社区。 facebook线上应用的一个重要特点是他们关闭了split,以降低split带来的风险。与facebook不同,淘宝的业务数据量相对没有如此庞 大,并且由于应用类型非常丰富,我们并们并没有要求用户强行选择关闭split,而是尽量去修改split中可能存在的bug。到目前为止,虽然我们并不 能说完全解决了这个问题,但是从0.90.2中暴露出来的诸多跟split以及宕机相关的可能引发的bug我们的测试环境上己经被修复到接近了0,也为社 区提交了10数个稳定性相关的patch,比较重要的有以下几个:

https://issues.apache.org/jira/browse/HBASE-4562
https://issues.apache.org/jira/browse/HBASE-4563
https://issues.apache.org/jira/browse/HBASE-5152
https://issues.apache.org/jira/browse/HBASE-5100
https://issues.apache.org/jira/browse/HBASE-4880
https://issues.apache.org/jira/browse/HBASE-4878
https://issues.apache.org/jira/browse/HBASE-4899

还有其它一些,我们主要将patch提交到0.92版本,社区会有commitor帮助我们backport回0.90版本。所以社区从 0.90.2一直到0.90.6一共发布了5个bugfix版本后,0.90.6版本其实己经比较稳定了。建议生产环境可以考虑这个版本。

split这是一个很重的事务,它有一个严重的问题就是会修改meta表(当然宕机恢复时也有这个问题)。如果在此期间发生异常,很有可能meta 表、rs内存、master内存以及hdfs上的文件会发生不一致,导致之后region重新分配时发生错误。其中一个错误就是有可能同一个region 被两个以上的regionserver所服务,那么就可能出现这一个region所服务的数据会随机分别写到多台rs上,读取的时候也会分别读取,导致数 据丢失。想要恢复原状,必须删除掉其中一个rs上的region,这就导致了不得不主动删掉数据,从而引发数据丢失。

前面说到慢响应的问题归纳为网络原因、gc问题、命中率以及client的反序列化问题。网络原因一般是网络不稳定引起的,不过也有可能是tcp参 数设置问题,必须保证尽量减少包的延迟,如nodelay需要设置为true等,这些问题我们通过tcpmp等一系列工具专门定位过,证明tcp参数 对包的组装确实会造成慢连接。gc要根据应用的类型来,一般在读比较多的应用中新生代不能设置得太小。命中率极大影响了响应的时间,我们会尽量将 version数设为1以增加缓存的容量,良好的balance也能帮助充分应用好每台机器的命中率。我们为此设计了表级别的balance。

由于hbase服务是单点的,即宕机一台,则该台机器所服务的数据在恢复前是无法读写的。宕机恢复速度决定了我们服务的可用率。为此主要做了几点优 化。首先是将zk的宕机发现时间尽量缩短到1分钟,其次改进了master恢复日志为并行恢复,大大提高了master恢复日志的速度,然后我们修改了 openhandler中可能出现的一些超时异常,以及死锁,去掉了日志中可能发生的open…too long等异常。原生的hbase在宕机恢复时有可能发生10几分钟甚至半小时无法重启的问题己经被修复掉了。另外,hdfs层面我们将 socket.timeout时间以及重试时间也缩短了,以降低datanode宕机引起的长时间block现象。

hbase本身读写层面的优化我们目前并没有做太多的工作,唯一打的patch是region增加时写性能严重下降的问题。因为由于hbase本身 良好的性能,我们通过大量测试找到了各种应用场景中比较优良的参数并应用于生产环境后,都基本满足需求。不过这是我们接下来的重要工作。

7 将来计划
我们目前维护着淘宝内基于社区0.90.x而定制的hbase版本。接下来除继续fix它的bug外,会维护基于0.92.x修改的版本。之所以这 样,是因为0.92.x和0.90.x的兼容性并不是非常好,而且0.92.x修改掉的代码非常多,粗略统计会超过30%。0.92中有我们非常看重的一 些特性。

0.92版本改进了hfile为hfileV2,v2版本的特点是将索引以及bloomfilter进行了大幅改造,以支持单个大hfile文 件。现有的HFile在文件大到一定程度时,index会占用大量的内存,并且加载文件的速度会因此下降非常多。而如果HFile不增大的 话,region就无法扩大,从而导致region数量非常多。这是我们想尽量避免的事。
0.92版本改进了通讯层协议,在通讯层中增加了length,这非常重要,它让我们可以写出nio的客户端,使反序列化不再成为影响client性能的地方。
0.92版本增加了coprocessor特性,这支持了少量想要在rs上进行count等的应用。
还有其它很多优化,比如改进了balance算法、改进了compact算法、改进了scan算法、compact变为CF级别、动态做ddl等等特性。

除了0.92版本外,0.94版本以及最新的trunk(0.96)也有很多不错的特性,0.94是一个性能优化版本。它做了很多革命性工作,比如去掉root表,比如HLog进行压缩,replication上支持多个slave集群,等等。

我们自己也有一些优化,比如自行实现的二级索引、backup策略等都会在内部版本上实现。
另外值得一提的是hdfs层面的优化也非常重要,hadoop-1.0.0以及cloudera-3u3的改进对hbase非常有帮助,比如本地化 读、checksum的改进、datanode的keepalive设置、namenode的HA策略等。我们有一支优秀的hdfs团队来支持我们的 hdfs层面工作,比如定位以及fix一些hdfs层面的bug,帮助提供一些hdfs上参数的建议,以及帮助实现namenode的HA等。最新的测试 表明,3u3的checksum+本地化读可以将随机读性能提升至少一倍。
我们正在做的一件有意义的事是实时监控和调整regionserver的负载,能够动态地将负载不足的集群上的服务器挪到负载较高的集群中,而整个过程对用户完全透明。

总的来说,我们的策略是尽量和社区合作,以推动hbase在整个apache生态链以及业界的发展,使其能更稳定地部署到更多的应用中去,以降低使用门槛以及使用成本。