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

为什么说hbase是一个面向列的数据库,第1张

在说HBase之前,我想再唠叨几句。做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户就变多了,结果您的系统应付不过来了了,不干了,这岂不是咱哥几个的悲哀,说时髦点就叫“杯具啊”。\x0d\\x0d\其实说白了,这些就是事先没有认清楚互联网应用什么才是最重要的。从系统架构的角度来说,互联网应用更加看重系统性能以及伸缩性,而传统企业级应用都是比较看重数据完整性和数据安全性。那么我们就来说说互联网应用伸缩性这事儿对于伸缩性这事儿,哥们儿我也写了几篇博文,想看的兄弟可以参考我以前的博文,对于web server,app server的伸缩性,我在这里先不说了,因为这部分的伸缩性相对来说比较容易一点,我主要来回顾一些一个慢慢变大的互联网应用如何应对数据库这一层的伸缩。\x0d\\x0d\首先刚开始,人不多,压力也不大,搞一台数据库服务器就搞定了,此时所有的东东都塞进一个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了。\x0d\\x0d\综上所述,一般一个流行的web站点都会经历一个从单台DB,到主从复制,到垂直分区再到水平分区的痛苦的过程。其实数据库切分这事儿,看起来原理貌似很简单,如果真正做起来,我想凡是sharding过数据库的哥们儿都深受其苦啊。对于数据库伸缩的文章,哥们儿可以看看后面的参考资料介绍。\x0d\\x0d\好了,从上面的那一堆废话中,我们也发现数据库存储水平扩张scale out是多么痛苦的一件事情,不过幸好技术在进步,业界的其它弟兄也在努力,09年这一年出现了非常多的NoSQL数据库,更准确的应该说是No relation数据库,这些数据库多数都会对非结构化的数据提供透明的水平扩张能力,大大减轻了哥们儿设计时候的压力。下面我就拿Hbase这分布式列存储系统来说说。\x0d\\x0d\一 Hbase是个啥东东? \x0d\在说Hase是个啥家伙之前,首先我们来看看两个概念,面向行存储和面向列存储。面向行存储,我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的,面向行存储的数据库主要适合于事务性要求严格场合,或者说面向行存储的存储系统适合OLTP,但是根据CAP理论,传统的RDBMS,为了实现强一致性,通过严格的ACID事务来进行同步,这就造成了系统的可用性和伸缩性方面大大折扣,而目前的很多NoSQL产品,包括Hbase,它们都是一种最终一致性的系统,它们为了高的可用性牺牲了一部分的一致性。好像,我上面说了面向列存储,那么到底什么是面向列存储呢?Hbase,Casandra,Bigtable都属于面向列存储的分布式存储系统。看到这里,如果您不明白Hbase是个啥东东,不要紧,我再总结一下下:\x0d\\x0d\Hbase是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写 *** 作,同时Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。\x0d\\x0d\二 Hbase数据模型 \x0d\HBase,Cassandra的数据模型非常类似,他们的思想都是来源于Google的Bigtable,因此这三者的数据模型非常类似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我没发现。好了,废话少说,我们来看看Hbase的数据模型到底是个啥东东。\x0d\\x0d\在Hbase里面有以下两个主要的概念,Row key,Column Family,我们首先来看看Column family,Column family中文又名“列族”,Column family是在系统启动之前预先定义好的,每一个Column Family都可以根据“限定符”有多个column下面我们来举个例子就会非常的清晰了。\x0d\\x0d\假如系统中有一个User表,如果按照传统的RDBMS的话,User表中的列是固定的,比如schema 定义了name,age,sex等属性,User的属性是不能动态增加的。但是如果采用列存储系统,比如Hbase,那么我们可以定义User表,然后定义info 列族,User的数据可以分为:info:name = zhangsan,info:age=30,info:sex=male等,如果后来你又想增加另外的属性,这样很方便只需要info:newProperty就可以了。\x0d\\x0d\也许前面的这个例子还不够清晰,我们再举个例子来解释一下,熟悉SNS的朋友,应该都知道有好友Feed,一般设计Feed,我们都是按照“某人在某时做了标题为某某的事情”,但是同时一般我们也会预留一下关键字,比如有时候feed也许需要url,feed需要image属性等,这样来说,feed本身的属性是不确定的,因此如果采用传统的关系数据库将非常麻烦,况且关系数据库会造成一些为null的单元浪费,而列存储就不会出现这个问题,在Hbase里,如果每一个column 单元没有值,那么是占用空间的。下面我们通过两张图来形象的表示这种关系:\x0d\\x0d\上图是传统的RDBMS设计的Feed表,我们可以看出feed有多少列是固定的,不能增加,并且为null的列浪费了空间。但是我们再看看下图,下图为Hbase,Cassandra,Bigtable的数据模型图,从下图可以看出,Feed表的列可以动态的增加,并且为空的列是不存储的,这就大大节约了空间,关键是Feed这东西随着系统的运行,各种各样的Feed会出现,我们事先没办法预测有多少种Feed,那么我们也就没有办法确定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基于列存储的数据模型就非常适合此场景。说到这里,采用Hbase的这种方式,还有一个非常重要的好处就是Feed会自动切分,当Feed表中的数据超过某一个阀值以后,Hbase会自动为我们切分数据,这样的话,查询就具有了伸缩性,而再加上Hbase的弱事务性的特性,对Hbase的写入 *** 作也将变得非常快。\x0d\\x0d\上面说了Column family,那么我之前说的Row key是啥东东,其实你可以理解row key为RDBMS中的某一个行的主键,但是因为Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要根据你系统的查询需求来设计了额。我还拿刚才那个Feed的列子来说,我们一般是查询某个人最新的一些Feed,因此我们Feed的Row key可以有以下三个部分构成,这样以来当我们要查询某个人的最进的Feed就可以指定Start Rowkey为,End Rowkey为来查询了,同时因为Hbase中的记录是按照rowkey来排序的,这样就使得查询变得非常快。\x0d\\x0d\三 Hbase的优缺点 \x0d\1 列的可以动态增加,并且列为空就不存储数据,节省存储空间\x0d\\x0d\2 Hbase自动切分数据,使得数据存储自动具有水平scalability\x0d\\x0d\3 Hbase可以提供高并发读写 *** 作的支持\x0d\\x0d\Hbase的缺点:\x0d\\x0d\1 不能支持条件查询,只支持按照Row key来查询\x0d\\x0d\2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉\x0d\\x0d\四补充\x0d\1数据类型,HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。\x0d\2数据 *** 作:HBase只有很简单的插入、查询、删除、清空等 *** 作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接 *** 作。 \x0d\3存储模式:HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的。而传统的关系型数据库是基于表格结构和行模式保存的 \x0d\4数据维护,HBase的更新 *** 作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改\x0d\5可伸缩性,Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功能

与关系型数据库RDBMS的大厂商垄断不同,NoSQL在发展之初就可谓是百家争鸣、百花齐放,无论目前如日中天的MongoDB,还是刚刚发布最新版本的Redis;无论是面向文本的CouchDB,还是基于KV的Cassandra,都有着各自的特点和应用场景。

首先是不适合数据量大(PB级别)而增删改查又很简单的应用例如社交网络很多用的是NoSQL,BigTable这类非关系型数据库其次应该是不适合数据仓储,那需要进行反规范化(denormalize),即把拆得很细的,符合各种范式的表重新归并成大表

不过一般关系数据库还是使用最普遍的

大数据的概念

概念:难以用常规的数据库工具获取、存储、管理、分析的数据集合。

特征:

1、数据量大:起始单位是PB级的。

1KB=1024B

1MB=1024KB

1GB=1024MB

1TB=1024GB

1PB=1024TB

1EB=1024PB

1ZB=1024EB

2、类型多:

结构化、板结构化、非结构化:网诺日志、音频、视频、、地理位置等信息混杂。

3、价值密度低:

获取数据的价值就像是淘金一般。

4、速度快时效高:

数据呈指数倍增长,时效性要求高,比如搜索引擎要求几分钟前的新闻能够被用户查询到,个性化推荐算法尽可能的完成实时推荐。

5、永远在线:

大数据时代的数据是永远在线的,随时应用计算,这也是区别于传统的数据的最大特征。

大数据从哪来

1、搜索引擎服务

百度数据量1000PB,每天响应138个国家数十亿次请求,每日新增10TB

2、电子商务

3、社交网络

QQ:85亿用户,用4400台服务器存储用户产生的信息,压缩后的数据100PB,每天新增200~300TB

4、音视频在线服务

5、个人数据业务

6、地理信息数据

7、传统企业

8、公共机构

智慧城市:摄像头拍摄的,1080P高清网络摄像机一月产生18TB数据,大点的城市50万个摄像头,一个月3PB的数据量。

医疗、中国的气象系统。

大数据的存储与计算模式

存储:

面临的问题:数据量大、类型复杂(结构化、非结构化、半结构化)

关键技术:

1、分布式文件系统(高效元数据管理技术、系统d性扩展技术、存储层级内的优化、针对应用和负载的存储优化技术、针对存储器件的优化技术)

2、分布式数据库

事务性数据库技术:NoSQL:(支持非关系数据库、具有多个节点分割和复制数据的能力、用最终一致性机制解决并发读 *** 作与控制问题、充分利用分布式索引及内存提高性能)代表有:BigTable、HBase、MongoDB、Dynamo。

分析型的数据库技术:Hive 、Impala

3、大数据索引和查询技术

4、实时流式大数据存储与处理技术

计算:

面临的问题:数据结构特征、并行计算(以分布式文件为基础的Hadoop\以分布式内存缓存为基础的Spark)、数据获取(批处理\流处理)、数据处理类型(传统查询\数据挖掘分析计算)、实时响应性能、迭代计算、数据关联性(先map一下再reduce一下)。

关键技术:

1、大数据查询分析计算模式与技术:HBase、Hive、Cassandra、Impala

2、批处理计算:Hadoop MapReduce、Spark

3、流式计算:Storm、Spark Steaming

4、图计算:Giraph、GraphX

5、内存计算:Spark、Hana(SAP公司全内存式分布式数据库系统)、Dremel

应用领域

1、智慧医疗(临床数据、公共卫生数据、移动医疗健康数据)(共享疾病案例,基因分类参考)

2、智慧农业(主要指依据商业需求进行农产品生产,降低菜残伤农概率)

3、金融行业:

精准的营销:根据可与习惯进行推销

风险管控:根据用户的交易流水实施反欺诈

决策支持:抵押贷款这一块,实施产业信贷的风险控制。

效率提升:加快内部数据处理。

产品设计:根据客户的投资行为设计满足客户需求的金融产品。

4、零售行业(对零售商来说:精准营销(降低营销成本,扩大营销额);对厂商:降低产品过剩)

5、电子商务行业

6、电子政务

希望对您有所帮助!~

当你和成千上万的其他人同时提交搜索时,这个快照也正在不断地随着这些变化被更新着。与此同时,数据是由数以千计的独立服务器进程处理的,每个都各司其职,从计算出给你提供的相关联广告,到决定搜索结果的排列顺序。 支持谷歌搜索引擎的存储系统必须能够承受每天由运行于数以千计的服务器上的成千上万的独立进程所发出的数百万计的读写请求,几乎不能停机来备份或维护,还必须不断扩容以容纳由谷歌网页抓取机器人添加的日益扩大的众多页面。总体下来,谷歌每天要处理超过20PB。 这可不是谷歌可以从一个现成的存储架构就能完成的。而且对于运行超大规模的数据中心的其他网络和云计算巨头来说也是如此,比如亚马逊和Facebook。虽然大多数数据中心已经通过在一个存储区网络添加更多硬盘容量来解决扩充存储的问题,更多的存储服务器,通常是更多的数据库服务器,因为云环境的性能限制,这些方法却失效了。在云环境下,任何时候都可能有成千上万的活跃用户的数据,而且数据的读写在任何时刻都能达到数千TB。 这不仅仅是一个关于磁盘读写速度的简单问题。以这些卷上的数据流来讲,主要的问题是存储网络的吞吐量;即使有最好的交换机和存储服务器,传统的SAN架构也能成为数据处理的性能瓶颈。 接下来就是老生常谈的扩大存储的成本问题。超大规模网络公司增加容量的频率(举个例子,亚马逊现在每天为其数据中心增加的容量相当于整个公司在2001年全年的容量,根据亚马逊副总裁杰姆斯·汉密尔顿的说法),用大多数数据中心的同样做法来摆平所需的存储,依照所需的管理,硬件和软件成本,花费将是巨大的。这种花费在关系数据库被添加到混合数据库时甚至更高,这取决于一个组织对它们的分割和复制如何处理。 对于这种不断扩展和持久存储的需求,驱使互联网巨头——谷歌,亚马逊,Facebook,微软等等——采取一种不同的存储解决方案:基于对象存储的分布式文件系统。这些系统至少都部分受到其他分布式集群文件系统的启发,如Red Hat的全局文件系统和IBM的通用并行文件系统。 这些云巨头的分布式文件系统的架构把元数据(关于内容的数据)从它存储的数据中分开。这能通过多个副本对数据进行大量并行读写 *** 作,并且抛掉了像“文件锁定”这样的概念。 这些分布式文件系统的影响远远超出了它们为超大规模数据中心而创建的范畴——它们会直接影响那些使用公共云服务的公司(比如亚马逊的EC2,谷歌的AppEngine和微软的Azure)如何开发和部署程序。公司,大学和政府机构寻找一种快速存储和提供大量数据访问的方法正日益变成受云巨头们启发的数据存储系统的新阶段。因此有必要了解一下它们的发展史和过程中所做的工程折衷方案。谷歌文件系统 谷歌是最早面对存储容量问题的主流网络公司中的一家。在2003年,谷歌工程师们找到了问题的答案,就是建立一个可为谷歌数据中心战略定制的分布式文件系统——谷歌文件系统(GFS)。 谷歌文件系统几乎是所有公司云服务的基础。它能够处理数据存储,包括公司的BigTable数据库和为谷歌的AppEngine“平台即服务”的数 据储存,并且为谷歌搜索引擎和其他程序提供数据。谷歌创建谷歌文件系统的设计决定推动了大量云架构下的软件工程技术,反之亦然。谷歌往往把程序数据储存在 大量的文件里,并把文件作为“生产者-消费者队列”使用,数以百计的机器收集的数据可能被写入同一个文件。这个文件可能会由另一个合并或分析数据的应用程 序处理——或许甚至是在数据正被写入的时候。 “这当中的某些服务器一定会出错——因此谷歌文件系统被设计为能够容忍这种错误,不会丢失(太多)数据”。 谷歌为自己保留了大量技术细节,原因很明显。但是由谷歌研究员Sanjay Ghemawat,首席工程师Howard Gobioff和高级工程师Shun-Tak Leung在2003首次发表的报告中提到,谷歌文件系统在设计上是带有一些非常具体的优先考虑的:谷歌想把大量便宜的服务器和硬盘驱动器变成一个可以储 存数百TB数据的能够在出错时自行管理可靠的数据存储。并且它需要被设计成按谷歌的方式收集和读取数据,允许多个应用程序同时把大批量数据添加到系统上, 且能以高速访问。 就像是一个RAID 5存储阵列通过多磁盘放置数据进行出错保护,谷歌文件系统把文件分成固定大小的块,复制到整个服务器集群。因为它们是用着廉价硬盘的电脑,其中一些服务器肯定会出错——因此谷歌文件系统被设计为能够容忍这种错误,不会丢失(太多)数据。 但是RAID和GFS的相同点就到此为止了,因为那些服务器可以分布于网络——既可以在第一个单独的物理数据中心也可以分散于不同的数据中心,取决 于数据的用途。GFS设计主要用于批量处理大量数据。重点是高速读取数据,而不是到文件中某个部分的访问速度,也不是数据写入到文件系统的速度。GFS提 供如此高输出是以牺牲更高密度的读写和更快速度的数据写入为代价的。正如Ghemawat和公司在文件中所说,“在文件中任意位置的小的写入是支持的,但 不一定非要高效。” 这种分布式的性质,随着GFS处理数据量的庞大——数百万的文件,当中很多都超过100MB而且通常都会变成GB——需要一些取舍,以便让GFS和 你通常安装在一台服务器上的文件系统有很大的不同。因为成百上千的独立进程可能同时对一个文件进行写入和读取,GFS需要支持“原子性”数据——在不影响 其他程序的情况下回滚出错的写入。而且它需要以非常低的同步开销保持数据的完整性以避免拖垮性能。 GFS由三层组成:GFS客户端,处理程序数据请求;管理服务器,用内存中的索引追踪数据文件名和所在区块的位置;还有数据存储服务器本身。最初, 为简单起见,GFS为每个集群使用一个单独的管理服务器,因此系统被设计成让管理服务器尽可能避开数据访问。谷歌已经发开出了一个分布式管理服务器系统, 可以控制数百台管理服务器,每一台都能处理大约1亿个文件。 当GFS客户端收到一个特定数据文件的请求,它需要从管理服务器请求数据的位置。管理服务器提供其中一个副本的位置,之后客户端就可以直接与存储服务器进行沟通,用来读写剩下的其他部分。管理服务器就不再参与其中了,除非有错误发生。 为确保数据是高度可用的,GFS舍弃了其他一些东西——比如各副本间的一致性。GFS确实坚持数据的原子性——如果写入失败,它将返回一个错误,然 后将写入回滚到元数据,并产生一个旧数据的副本。但是管理服务器在数据写入上的介入缺失意味着当数据写入到系统时,它不能立刻让副本遍布整个GFS集群。 在处理对数据同时访问和网络限制的必要性之外,该系统遵循谷歌所谓的“宽松一致性模型”。 这意味着GFS对于在必要时从旧的副本提供陈旧的数据完全不在乎——只要数据最终得以更新。管理服务器的追踪变化,或“突变”,当变化发生时,区块中的数据会用版本号来指示。由于一些副本被留下了(或变“旧了”),GFS管理服务器会确保这些区块在更新前不会送至客户端。 但这并不一定发生在已经连接到那些区块的部分。元数据的变更在管理服务器处理这些变更,并将它们反映在元数据前是不可见的。元数据也需要在多个位置 生成副本,以防管理服务器出错——那样的话整个文件系统就丢失了。而且如果在写入过程中管理服务器有错误发生,变更同样会消失。由于谷歌处理数据的方式, 这并不是一个大问题:程序使用的大部分的数据很少变化,而且当变化发生时,数据通常是扩充的而不是原地修改的。 当GFS在为2003年运行的谷歌应用设计出来时,离谷歌开始遭遇扩展性问题并不远。甚至是在公司收购YouTube之前,GFS开始碰壁——很大 原因是谷歌新添加的应用在64M文件大小下工作的不是很好。为了绕过它,谷歌转向了Bigtable,一种基于表格的数据存储,那依稀类似于数据库,位于 GFS之上。Bigtable大多是一次写入,因此变更被作为对表的扩展进行存储的——谷歌将其用于如对Google Docs进行版本控制的类似应用上。 如果你不是在谷歌工作,那上述内容太过于学术性了(虽然它可以帮助AppEngine,谷歌云存储和谷歌其他服务的用户更好地了解台面下是怎么事 儿)。虽然谷歌云存储通过一个网络接口提供了一个公开方式来储存和访问位于GFS上的文件,但是 *** 控GFS的真正接口和工具并不是公开的。但报告称GFS 引领了更广泛使用的分布式文件系统的发展,如:Hadoop分布式文件系统。Hadoop分布式文件系统(HDFS) Hadoop是用Java开发的,作为Apache基金会的一个开源项目,它在网络公司和其他有“大数据”问题的公司间已经有了如下的口碑,它被称 之为“二十一世界的瑞士军刀”。所有这些宣传意味着,你很可能会发现你迟早要以某种形式用Hadoop处理问题而不是用其他的分布式文件系统——特别是当 微软开始将其列入Windows Server的扩展中的时候。 Hadoop是由开发者Doug Cutting在他儿子给一只玩具大象起名后用它命名的,“灵感”来自于GFS和谷歌的MapReduce分布式计算环境。在2004年,Cutting 和其他工作于Apache Nutch搜索引擎项目的人试图寻求一种可以将抓取器和索引带向“网络规模”的方式,Cutting阅读了谷歌关于GFS和MapReduce的论文并开 始动手开发自己的项目。虽然对于Hadoop的大多数热情来自于它由MapReduce启发的分布式处理管理衍生出的分布式数据处理能力,但使用 Hadoop分布式文件系统还是因为它能对大量数据进行处理。 Hadoop是在Apache许可证下开发的,有许多商业和自由发行版可用。我用的版本来自Cloudera公司(Doug Cutting现在的东家)——Cloudera发行版包括了Apache Hadoop(CDH),Cloudera企业平台的开源版本,和Cloudera服务和配置特别版,它可免费支持50个节点。 HortonWorks,该公司与微软合作帮助后者把Hadoop移植到Azure和Windows Server,有其自己的基于Hadoop和HortonWorks数据平台,是一个受限的“技术预览版”。同样还有Apache Core的Debian包,和许多其他开源的或商业的基于Hadoop的某种形式的产品。 HDFS可被用于支持在大量廉价硬件和大数据下广泛的应用。但由于其架构,它不完全适合于通用数据存储,并且放弃了一定的灵活性。HDFS必须废除 某些经常与文件系统有关的事情,以确保它能更好地处理在分布着数百甚至数千台物理机器上的大量数据——如对数据交互访问这种事情。 虽然Hadoop运行于Java上,但是除了它的Java API之外还有许多种方式和HDFS进行交互。有一种C语言版本的API,通过Hadoop的命令行界面,文件可以通过>

江湖传说永流传:谷歌技术有"三宝",GFS、MapReduce和大表(BigTable)!

谷歌在03到06年间连续发表了三篇很有影响力的文章,分别是03年SOSP的GFS,04年OSDI的MapReduce,和06年OSDI的BigTable。SOSP和OSDI都是 *** 作系统领域的顶级会议,在计算机学会推荐会议里属于A类。SOSP在单数年举办,而OSDI在双数年举办。

那么这篇博客就来介绍一下MapReduce。

1 MapReduce是干啥的

因为没找到谷歌的示意图,所以我想借用一张Hadoop项目的结构图来说明下MapReduce所处的位置,如下图。

Hadoop实际上就是谷歌三宝的开源实现,Hadoop MapReduce对应Google MapReduce,HBase对应BigTable,HDFS对应GFS。HDFS(或GFS)为上层提供高效的非结构化存储服务,HBase(或BigTable)是提供结构化数据服务的分布式数据库,Hadoop MapReduce(或Google MapReduce)是一种并行计算的编程模型,用于作业调度。

GFS和BigTable已经为我们提供了高性能、高并发的服务,但是并行编程可不是所有程序员都玩得转的活儿,如果我们的应用本身不能并发,那GFS、BigTable也都是没有意义的。MapReduce的伟大之处就在于让不熟悉并行编程的程序员也能充分发挥分布式系统的威力。

简单概括的说,MapReduce是将一个大作业拆分为多个小作业的框架(大作业和小作业应该本质是一样的,只是规模不同),用户需要做的就是决定拆成多少份,以及定义作业本身。

下面用一个贯穿全文的例子来解释MapReduce是如何工作的。

2 例子:统计词频

如果我想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那我收集好论文后,该怎么办呢?

方法一:我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了。

这种方法在数据集比较小时,是非常有效的,而且实现最简单,用来解决这个问题很合适。

方法二:写一个多线程程序,并发遍历论文。

这个问题理论上是可以高度并发的,因为统计一个文件时不会影响统计另一个文件。当我们的机器是多核或者多处理器,方法二肯定比方法一高效。但是写一个多线程程序要比方法一困难多了,我们必须自己同步共享数据,比如要防止两个线程重复统计文件。

方法三:把作业交给多个计算机去完成。

我们可以使用方法一的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业。这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序)。

方法四:让MapReduce来帮帮我们吧!

MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果这些都是框架定义好的。我们只要定义好这个任务(用户程序),其它都交给MapReduce。

在介绍MapReduce如何工作之前,先讲讲两个核心函数map和reduce以及MapReduce的伪代码。

3 map函数和reduce函数

map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。

map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。

reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

统计词频的MapReduce函数的核心代码非常简短,主要就是实现这两个函数。

[plain] view plaincopy

map(String key, String value):

// key: document name

// value: document contents

for each word w in value:

EmitIntermediate(w, "1");

reduce(String key, Iterator values):

// key: a word

// values: a list of counts

int result = 0;

for each v in values:

result += ParseInt(v);

Emit(AsString(result));

在统计词频的例子里,map函数接受的键是文件名,值是文件的内容,map逐个遍历单词,每遇到一个单词w,就产生一个中间键值对<w, "1">,这表示单词w咱又找到了一个;MapReduce将键相同(都是单词w)的键值对传给reduce函数,这样reduce函数接受的键就是单词w,值是一串"1"(最基本的实现是这样,但可以优化),个数等于键为w的键值对的个数,然后将这些“1”累加就得到单词w的出现次数。最后这些单词的出现次数会被写到用户定义的位置,存储在底层的分布式存储系统(GFS或HDFS)。

4 MapReduce是如何工作的

上图是论文里给出的流程图。一切都是从最上方的user program开始的,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数。图中执行的顺序都用数字标记了。

MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。

user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。

被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。

缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。

master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的。

reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。

当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。

所有执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。而且我们要注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。

我更喜欢把流程分为三个阶段。第一阶段是准备阶段,包括1、2,主角是MapReduce库,完成拆分作业和拷贝用户程序等任务;第二阶段是运行阶段,包括3、4、5、6,主角是用户定义的map和reduce函数,每个小作业都独立运行着;第三阶段是扫尾阶段,这时作业已经完成,作业结果被放在输出文件里,就看用户想怎么处理这些输出了。

5 词频是怎么统计出来的

结合第四节,我们就可以知道第三节的代码是如何工作的了。假设咱们定义M=5,R=3,并且有6台机器,一台master。

这幅图描述了MapReduce如何处理词频统计。由于map worker数量不够,首先处理了分片1、3、4,并产生中间键值对;当所有中间值都准备好了,Reduce作业就开始读取对应分区,并输出统计结果。

6 用户的权利

用户最主要的任务是实现map和reduce接口,但还有一些有用的接口是向用户开放的。

an input reader。这个函数会将输入分为M个部分,并且定义了如何从数据中抽取最初的键值对,比如词频的例子中定义文件名和文件内容是键值对。

a partition function。这个函数用于将map函数产生的中间键值对映射到一个分区里去,最简单的实现就是将键求哈希再对R取模。

a compare function。这个函数用于Reduce作业排序,这个函数定义了键的大小关系。

an output writer。负责将结果写入底层分布式文件系统。

a combiner function。实际就是reduce函数,这是用于前面提到的优化的,比如统计词频时,如果每个<w, "1">要读一次,因为reduce和map通常不在一台机器,非常浪费时间,所以可以在map执行的地方先运行一次combiner,这样reduce只需要读一次<w, "n">了。

map和reduce函数就不多说了。

7 MapReduce的实现

目前MapReduce已经有多种实现,除了谷歌自己的实现外,还有著名的hadoop,区别是谷歌是c++,而hadoop是用java。另外斯坦福大学实现了一个在多核/多处理器、共享内存环境内运行的MapReduce,称为Phoenix(介绍),相关的论文发表在07年的HPCA,是当年的最佳论文哦!

目前数据分析行业有很大的人才缺口,未来3年内市场规模预计将达到2000亿,就业前景很好。但是入门门槛相对其他行业较高,专业性非常强,需要有过硬的技术来进行大量的数据处理,报培训班跟着专业的老师进行学习,可以更加系统掌握内容,少走弯路,同时老师也可以对你进行一个督促。

1、 数据分析要学多久?

每个人的学习能力和基础都不同,所以数据分析的学习周期也不同。如果是通过自学的方式,由于无专业老师指导及无法系统的学习,这个周期可能会很长。一般来讲,如果零基础的学习者进行系统的培训,最快也要将近三、四个月的时间。数据分析的学习应该首先从熟悉表以及表结构开始,它的原点一定是在首先了解熟悉Excel的基础上,在能够从数据库里提数的基础上再进行技能的升级。你的技能从能够从数据库里提数,并且用Excel和BI处理几万行的小数据量,到使用python批量化处理几十万甚至百万行中量级数据量,到最终使用大数据的相关组件,例如hadoop,spark,flume等组件处理千万级甚至是亿级大数据量。每一个阶段所需要的工具加方法论都是不一样的。一般而言,对于自学而成为能处理中量级数据量的分析师而言,得至少入门python的pandas,numpy等数据处理库。这个零自学的周期,也一般跟悟性和自律有关,悟性和自律性高的同学,可能在4个月能够掌握;如果悟性和自律性不高的同学,这个周期有可能就是半途而废,无法估量时间了。这里给大家推荐一下聚数学院的《数据分析实战就业班》(聚数学院),专注于培养数据分析师的数据处理能力、数据分析能力和数据挖掘能力,课程内容从数据库管理、统计理论方法、数据分析主流软件的应用到数据挖掘算法等,对一整套数据分析流程技术进行系统讲解并配以实战练习,学完之后,学习者可以直接达到数据分析师的水平。

2、 数据分析要学什么?

(1) Excel

说起Excel可能会有人觉得这个很简单,但是Excel确实是一个功能强大的利器。零基础学数据分析师一定要从Excel入门,因为Excel是处理小型数据量企业用的最多的工具,在基础数据分析师与数据运营岗位中具有极其重要的地位。作为数据分析师的核心工具,具体学习内容有Excel函数技巧(查找函数、统计函数、逻辑函数)、Excel快速处理技巧(格式调整、查找定位、快捷键技巧等)和Excel可视化技巧(组合图、条形图、数据气泡地图)等。

(2) Mysql

SQL同样是零基础学习数据分析的核心内容。因为作为数据分析师,你首先要解决的问题就是你要有数据来做分析。通常企业都会有自己的数据库,数据分析师首先得根据业务需要知道自己要从企业数据库中提取哪些数据。企业如果部署本地数据库,那么一定是SQL语言做提取数据的语言。SQL简单易懂,非常容易上手,并且是非学不可的。SQL语言从学习MySQL数据库开始,涉及对表结构数据的增删改查。真正在企业里面,数据分析师一般不会有增删改的权限,只会有查的权限。学员应该重点掌握查的各种句式。

(3) Python

Python的基础对于数据分析师而言是非常重要的。对于十万级或者百万级数据量而言,Excel和BI都会因为运行卡顿而变得完全无法使用。然而在实际企业运用中,一次性处理十万级以及百万级数据又是非常常见的。而Python则是处理这种中量级数据的利器。因为Python有很多的第三方强大的库,比如Numpy、Pandas、Matplotlib、Seaborn等。这些库能让数据分析师对百万数据进行数据清理和画图分析。Python不仅能数据清洗,画图,还能用sklearn进行大数据算法分析。虽然Python是数据分析的重要工具,但是不同的职业发展方向,Python掌握的程度也是不一样的。

(4) BI商业智能工具

BI可以理解成Excel图表透视表的高级版。BI是将表与表相连,然后得出很多指标图。它是一个大屏的看板,如下图:

BI看板图

企业销售指标,运营指标,物流指标等等。这些图可以表示企业在过去5个月的平均销售单价,过去24个月销售的物流发货量的变化曲线,甚至是现在实时的销售额,这些都是企业关心的问题。有了这个看板,领导层在监控企业业务方面就有了非常直观的数据,以供他们及时做出决策调整。现在市面上比较流行的BI软件,有FineBI,PowerBI等。而这些BI软件实际上都是非常类似的,学起来难度也不大。学习FineReport、FineBI由入门到精通,快速挖掘数据价值,将这些数据转化成有用的信息,让企业决策有数据依据,从而驱动企业决策和运营。

(5) 数理统计与数据运营

数理统计和数据运营方法论是数据分析师的理论基石。数理统计包括概率论,统计学,线性代数,以及基础的微积分理论。这些内容都不需要理解的很深,但是对它们的原理以及内涵都需要有所掌握。由于整个数据分析的源头其实就是脱胎于描述性统计分析的。描述性统计分析是对样本的总数、均值等指标做统计的;而数据分析后续涉及到的算法则是架构在统计学上更深一层次的建模。因此,掌握数理统计的相关知识对于入门数据分析师而言是基础且必要的。

那数据运营方法论是什么呢?数据运营方法论实际上是学习各个行业所运营的分析模型。例如,对电商而言,漏斗分析可以分析出来进入主页的人数PV1,到进入服装板块的人数PV2,PV2/PV1就可以得出一个进入服装板块的比率。还有很多通用的分析模型:相关分析,A/B test等。对于想往管理路线发展的数据分析师来讲,数据运营是必须要学习的知识。其实数据运营知识也不复杂,就是根据自身业务需求将指标拆解到最细,然后运用同比和环比两种数据分析方式。

(6) 机器学习

最后一个进阶要求数据分析师掌握对大量数据分析的能力。这种分析就不只是停留在描述统计分析和运用数据运营方法进行分析了,而是进行预测分析。预测分析的本质是利用已有的数据做出一套变量x,与预测最终值y之间的关系(也就是数学算法公式),然后利用这套算法,将更多的x输入算法中去得出一个预测的y值,这里听不懂没关系。总之,这个阶段的数据分析是利用大量的历史数据构建出一套数学公式(也就是算法),用这个数学公式去对未来进行预测。比如说:一个人大量地刷体育短视频,根据算法可以得出这个人可能对观看足球比赛的腾讯体育会员感兴趣。这类推断和预测对于商业世界是有着极大变现意义的。要想成为掌握算法的数据分析师,机器学习是不可跳过的入门。学员应该从简单的一元回归,多元回归,以及逻辑回归学习等,逐渐学习更多像决策树,随机森林,SVM等更高级的算法。

如果看到这里,你觉得自己心理上已经就入门数据分析师方向做好了准备,但是你是零基础实在不知道如何入行的话,欢迎私聊获取免费的数据分析师知识点大纲,并且免费做数据分析师的入门咨询。

以上就是关于为什么说hbase是一个面向列的数据库全部的内容,包括:为什么说hbase是一个面向列的数据库、与传统数据库系统比较,goodlebigtable有何新的特性及应用场景、关系型数据库的局限性有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10634910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存