大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

大数据
后台-插件-广告管理-内容页头部广告(手机)

《大数据和人工智能交流》头条号向广大初学者新增C 、Java 、Python 、Scala、javascript 等目前流行的计算机、大数据编程语言,希望大家以后关注本头条号更多的内容。《大数据和人工智能》头条号方便有基础读者的同时照顾广大没入门的初学者。

和大数据相关文章的链接:

1、Linux操作系统课程详细整理(命令、shell编程、软件安装等)

2、大数据的采集与预处理(Sqoop/Flume/Kafka)详细总结

3、hadoop分布式计算MapReduce详细总结

4、大数据内存计算Spark框架原理详细整理

5、大数据内存计算框架SparkSQL详细整理

6、大数据框架Spark的流处理SparkStreaming详细总结

(一)大数据存储概述

(1)建立存储的大数据模型

这个可以通俗的称做数据格式。

这个存储不能是杂乱无章的存储,必须建立数据模型,以前信息不发达的时候很多数据都是杂乱无章的以文本文件、word等格式存储,那么数据杂乱无章分析起来就无从下手,这对一个国家发展信息化、数据化乃至智能化只能是有害无益的和重复建设的工作。我们这个例子是金融风险分析那么就涉及到征信的分析和决策,试想政务部门、水电等各个部门数据杂乱无章是不是得重新确定数据格式?

(2)大数据共享

数据不能共享,各个部门各自为政每个部门都有自己的格式,目前这个问题还很多。数据孤岛严重,这样会导致重复建设资源浪费。我们这个例子是金融风险分析那么就涉及到征信的分析和决策,试想政务部门、水电等各个部门如果各自为政那是不是成天为数据来源问题扯皮?

(3)大数据安全

在实现大数据集中后,如何确保网络数据的完整性、可用性和保密性,不受到信息泄漏和非法篡改的安全威胁影响,已成为政府机构、事业单位信息化健康发展所要考虑的核心问题。

大数据安全的防护技术有:数据资产梳理(敏感数据、数据库等进行梳理)、数据库加密(核心数据存储加密)、数据库安全运维(防运维人员恶意和高危操作)、数据脱敏(敏感数据匿名化)、数据库漏扫(数据安全脆弱性检测)等。

(二)大数据存储面临的挑战

1、系统的问题

面对大数据的爆炸式增长,且具有大数据量、异构性、高时效性的需求时,数据的存储不仅仅有存储容量的压力,还给系统的存储性能、数据管理乃至大数据的应用方面带来了挑战。

2、管理问题

这些大量的数据结构复杂,种类繁多,如何对分布、多态、异构的大数据进行管理的问题已经不期而至,传统的数据存储方式面对大数据的猛烈增长已不能满足需求,需要开展分布式存储的研究。

目前存储管理有三种技术:

(1)存储资源管理方法

为了解决集群存储环境下的存储资源管理问题,采用存储资源映射方法通过在物理资源和虚拟存储资源请求之间建立合理的映射关系,来进行有效的存储资源管理。

(2)支持多用户的资源使用和存储环境隔离机制

当用户数量增多,有限的存储资源已经不能满足用户对该类资源的需求时,用户与资源的矛盾就会凸显出来。解决这种矛盾的最有效的方法就是采取有效资源共享机制,将有限数量的资源按需求动态共享给多个用户使用。任何单体存储阵列所创建的物理卷的容量都是有限制的,而多个异构的存储系统联合在一起就可以创建出一个更大的逻辑卷。

(3)基于Hadoop的大数据存储机制

大数据的各类描述方式的多样性,存在着结构化数据、半结构化数据和非结构化数据需要进行处理。对于结构化数据,通常的处理方式仍是采用关系型数据知识库进行处理,对于半结构和非结构化的知识,Hadoop框架提供了很好的解决方案。

3、应用问题

随着数据量的爆炸式增长,不断刺激着计算机技术的发展,如何利用大数据为人们生活所用,即是大数据的应用问题。大数据的应用在人类活动中所涉及的范围越来越大,与我们已经密不可分。

数据存储系统能力的提升主要有三个方面,一是提升系统的存储容量,二是提升系统的吞吐量,三是系统的容错性。

(1)提升系统的存储容量

提升系统容量有两种方式:一种是提升单硬盘的容量,通过不断采用新的材质和新的读写技术,目前单个硬盘的容量已经进入TB时代。一种是在多硬盘的情况的下如何提升整体的存储容量。

现在主要通过云存储来提升系统的存储容量,云存储是指:通过网络技术、分布式文件系统、集群应用、服务器虚拟化等技术将网络中海量的不同类型的存储设备构成可扩展、低成本、低能耗的共享存储资源池,并提供数据存储访问、处理功能的系统服务。

(2)提升系统的吞吐量

对于单个硬盘,提升吞吐量的主要方法是提高硬盘转速、改进磁盘接口形式或增加读写缓存等。而要提升数据存储系统的整体吞吐量,比较典型的技术是早期的专用数据库机体系。

(3)提升系统的容错性

数据存储容错是指当系统中的部件或节点由于硬件或软件故障,导致数据、文件损坏或丢失时,系统能够自动将这些损坏或丢失的文件和数据恢复到故障发生前的状态,使系统能够维持正常运行的技术。

提升系统的容错性主要有三种形式:磁盘镜像和磁盘双工、基于RAID的磁盘容错、基于集群的数据容错。

磁盘镜像和磁盘双工是中小型网路系统中经常使用的容错技术。磁盘镜像是指将两个硬盘接在同一个硬盘控制卡上,用同一个硬盘控制卡来管理两个硬盘的数据读写,当系统向服务器写入数据时,该部分数据将同时写入两个硬盘。当出现一个硬盘损坏时,可以从另一个硬盘获得数据,确保系统正常运行。

冗余磁盘阵列(Redundant Arrays of Inexpensive Disks,RAID)技术的基本原理是采用多块价格较便宜的磁盘,组成一个容量巨大的磁盘阵列,配合数据分散存储设计,提升数据存储容错性。RAID技术分为多个等级,以数字编号。比较常见的等级有RAID0、RAID1、RAID3、RAID5。

基于集群的数据容错是构建在多台存储节点上的容错技术。集群容错的基本思想是将同一份数据在集群中的不同节点中进行冗余存储,确保部分节点的故障不会导致系统整体的正常运行。其数据存储容错可以采用两种方式:双机互援模式和双机热备模式。

(三)大数据存储的分类

1、云存储

云存储是伴随着云计算技术的发展而衍生出来的一种新兴的网络存储技术,它是云计算的重要组成部分,也是云计算的重要应用之一;它不仅是数据信息存储的新技术、新设备模型,也是一种服务的创新模型。

在互联网应用兴起的几年来,网络、数码产品、数字化解决方案在企业、政府、家庭中普及,数据存储需求呈现出了爆发性增长。采用传统的存储方式已不能满足当今庞大的数据存储市场需求。同时,分布式计算、网格计算、效用计算、虚拟化技术等相关技术的出现使云存储技术应运而生。对于云平台下的存储,亚马逊首先推出了Amazon S3 (Amazon Simple StorageService)服务,自此不断推出云的块服务、云的文件服务,并取得了巨大的成功。从2006年亚马逊发布AWS ( Amazon Web Services) 后,世界各大IT公司都发布了云平台服务,以Amazon、Microsoft、Google和阿里等公司为代表的互联网公有云应用,让用户可以像使用水、电、气等基础设施那样使用IT技术,极大地简化了客户安装、部署、运维等工作,让IT应用可以快速、便捷地为客户提供服务。当前云存储已经成为存储领域的一股颠覆性力量,为存储的使用和消费提供了全新模式。

云存储技术具有以下特点:

(1)可靠性

云存储通过增加冗余度提高存储的可靠性。但是增加可靠性受到可靠性原理、成本及性能等方面的制约,因此在在保证可靠性的同时,提高系统的整体运行效率是当前一个亟待解决问题。

(2)可用性

企业需要全天候地为世界不同地区的用户提供服务支持,因此可用性至关重要。对于云存储平台,冗余的架构部分可以减少停机风险。同时,多路径、控制器、不同的光纤网、RAID技术、端到端的架构控制/监控和成熟的变更管理过程等方案均可提高云存储可用性。

(3)安全性

先前可以通过保证不允许未经授权内访问来保证周边安全, 而在虚拟的IT服务中已经没有了物理的边界,所有的传输数据都存在被截取的隐患。因此,当服务通过云交付时,数据分片混淆存储和数据加密传输成为了实现用户数据私密性和保证安全性的重要手段。

(4)规范化

当前,行业组织都在积极跟进云存储标准的制定。2010 年4月,全球网络存储工业协会(Storage Networking Industry Association,SNIA)发布了云存储数据管理接口(Cloud Data Management Iterice CDMD标准,中国标准组织以及行业组织也纷纷发布云存储相关的国标和行标。

(5)低成本

云存储可以降低企业级存储成本,包括购置存储的成本、驱动存储的成本、修复存储的成本及管理存储的成本

2、分布式存储

分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。

分布式存储的特点:

(1)一致性

分布式存储系统需要使用多台服务器共同存储数据,而随着服务器数量的增加,服务器出现故障的概率也在不断增加。为了保证在有服务器出现故障的情况下系统仍然可用。一般做法是把一个数据分成多份存储在不同的服务器中。但是由于故障和并行存储等情况的存在,同一个数据的多个副本之间可能存在不一致的情况。这里称保证多个副本的数据完全一致的性质为一致性。

(2)可用性

分布式存储系统需要多台服务器同时工作。当服务器数量增多时,其中的一些服务器出现故障是在所难免的。我们希望这样的情况不会对整个系统造成太大的影响。在系统中的一部分节点出现故障之后,系统的整体不影响客服端的读/写请求称为可用性。

(3)分区容错性

分布式存储系统中的多台服务器通过网络进行连接。但是我们无法保证网络是一直通畅的,分布式系统需要具有一定的容错性来处理网络故障带来的问题。一个令人满意的情况是,当一个网络因为故障而分解为多个部分的时候,分布式存储系统仍然能够工作。

3、非关系型数据库NoSQL存储

NoSQL是Not Only SQL的缩写,而不是Not SQL,它不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。相比传统数据库,叫它分布式数据管理系统更贴切,数据存储被简化更灵活,重点被放在了分布式数据管理上。

NoSQL数据库是非关系型数据存储的广义定义,它不同于符合ACID理论的关系型数据库,数据存储不需要固定的表结构,通常也不存在连接操作。NoSQL数据库不使用传统的关系数据库模型,而是使用如键值存储数据库、列存储数据库、文档型数据库、图形数据库等方式存储数据模型。

NoSQL数据库的特点:

(1)不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式,当插入数据时,并不需要预先定义它们的模式。

(2)快速读写:相对于将所有数据存储的存储区域网络中的全共享架构,NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。

(3)可扩展性强:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。

(4)分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。

(5)事务处理能力弱:事物处理是传统关系型数据库的优势,所以在考虑系统架构时候可以考虑和关系型数据库一起使用。

传统的关系数据库具有不错的性能,高稳定性,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献

在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。

到了最近2000年左右年,网站开始快速发展。火爆的论坛、博客、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大

后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品

Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端

由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了

随着web2.0的继续高速发展,在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证

在互联网,大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式

MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小

关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。

关系型数据库面临的问题:

(1)扩展困难:由于存在类似Join这样多表查询机制,使得数据库在扩展方面很艰难。

(2)读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重.

(3)成本高:企业级数据库的License价格很惊人,并且随着系统的规模,而不断上升;

有限的支撑容量:现有关系型解决方案还无法支撑Google这样海量的数据存储。

随着非结构化数据的剧增,对数据读写出现了新的需求:

(1)低延迟的读写速度:应用快速地反应能极大地提升用户的满意度。

(2)支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别以上的数据和能应对百万级以上的流量。

(3)大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理。

(4)庞大运营成本的考量:IT经理们希望在硬件成本、软件成本和人力成本能够有大幅度地降低。

NoSQL数据库处理关系型数据库不能处理的问题:

(1)假设失效是必然发生的

NOSQL实现都建立在硬盘、机器和网络都会失效这些假设之上,我们不能彻底阻止这些失效,我们需要让我们的系统能够在即使非常极端的条件下也能应付这些失效。

(2)对数据进行分区

最小化了失效带来的影响,也将读写操作的负载分布到了不同的机器上。

(3)保存同一数据的多个副本

大部分 NOSQL 实现都基于数据副本的热备份来保证连续的高可用性,一些实现提供了 API,可以控制副本的复制,也就是说,当你存储一个对象的时候,你可以在对象级指定你希望保存的副本数

(4)查询支持

在这个方面,不同的实现有相当 本质的区别。不同实现的一个共性在于哈希表中的 key/value 匹配

常见的非关系型数据库有:

分布式列存储数据库:例如HBase、Cassandra等。

分布式Key-value键值存储数据库:例如MongoDB、Redis等。

4、数据仓库存储

企业的数据处理大致分为两类:一类是操作型处理,也称为联机事务处理,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。另一类是分析型处理,一般针对某些主题的历史数据进行分析,支持管理决策。

数据仓库系统以数据仓库为核心,将各种应用系统集成在一起,为统一的历史数据分析提供坚实的平台,通过数据分析与报表模块的查询和分析工具OLAP(联机分析处理)、决策分析、数据挖掘完成对信息的提取,以满足决策的需要。数据仓库系统通常是指一个数据库环境,而不是指一件产品。数据仓库系统的体系结构分为源数据层、数据存储与管理层、OLAP服务器层和前端分析工具层。

数据仓库的数据处理一般步骤如下:

(1)数据抽取

数据抽取是将数据从各种原始的业务数据中读取出来,这是所有工作的前提。

(2)数据转换

数据转换是按照预先设计好的规则将抽取的数据进行转换,在转化过程中,我们需要对数据进行清洗、整理和集成,即发现数据中的错误数据并进行相应的改正,将原来不同规则的数据整理集成为统一的规则。

(3)数据装载

数据装载是把经过转换的数据按计划增量或全部导入到数据仓库中去。一般情况下,数据装载应该在系统完成了更新之后进行。如果在数据仓库中的数据来自多个相互关联的企业系统,则应该保证在这些系统同步工作时移动数据。数据装载包括基本装载、追加装载、破坏性合并和建设性合并等方式。

(四)CAP理论

CAP理论是设计关系型数据库和非关系型数据库的理论依据,其中:

C:代表数据一致性Consistency

主要是指传统关系型数据库的优势,要求数据库的事务处理能力非常强。

A: 代表可能性Availability

集群中某一个节点发生故障,集群的整体是否还能继续响应客户端的请求。

P: 数据分区容忍性Partition Tolerance

集群中的某些节点在无法联系后,集群整体是否还能继续服务?

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

在分布式系统中,这三个要素最多只能同时实现两点,不可能三者兼顾。对于分布式数据系统,分区容忍性是基本要求。对于大多数web应用,牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向, 例如:

(1)这些数据库对于分区容忍性方面比较不是主要强项,主要采用复制(Replication)这种方式来保证数据的安全性,常见的CA系统有:传统关系型数据库,比如Postgres和MySQL等

(2)关注一致性和分区容忍性的(CP)

这种系统将数据分布在多个网络分区的节点上,并保证这些数据的一致性,但是对于可用性的支持方面有问题,比如当集群出现问题的话,节点有可能因无法确保数据是一致性的而拒绝提供服务,主要的CP系统有:BigTable (Column-oriented)、Hypertable (Column-oriented)、HBase (Column-oriented)、MongoDB (Document)、Redis (Key-value)、MemcacheDB (Key-value)

(3)关于可用性和分区容忍性的(AP)

这类系统主要以实现“最终一致性(Eventual Consistency)”来确保可用性和分区容忍性,AP的系统有: Dynamo (Key-value)、Voldemort (Key-value)、Tokyo Cabinet (Key-value)

KAI (Key-value)、Cassandra (Column-oriented)、CouchDB (Document-oriented)、SimpleDB (Document-oriented)、Riak (Document-oriented)

对比关系型数据库和非关系型数据库:

(1)关系数据库

关系型数据库中强调的ACID分别是:原子性(Atomicity)、 一致性(Consistency)、 隔离性(Isolation)、持久性(Durability)。ACID的目的就是通过事务支持,保证数据的完整性和正确性

(2)NoSQL数据库

对于许多互联网应用来说,对于一致性要求可以降低,而可用性(Availability)的要求则更为明显,从而产生了弱一致性的理论BASE

表6-1关系型数据库与NoSQL对比

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

(五)分布式存储系统HDFS

1、hadoop简介

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

Hadoop的生态系统如下图所示:

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

下面对生态圈的主要组成部分进行说明:

(1)HDFS

HDFS是hadoop分布式文件系统,是hadoop体系中数据存储管理的基础。它是一个高度容错的系统。

(2)mapreduce

mapreduce是分布式计算框架,用于处理分布式大数据量的计算。

(3)hive

hive是基于hadoop的数据仓库,由Facebook开源,最初用于解决海量结构化的日志数据统计问题。hive定于了一种类似sql的查询语言(hql)将sql转化为mapreduce任务在hadoop上执行。

(4)hbase

Hbase是分布式列存储数据库,hbase是一个针对结构化数据的可伸缩,高可靠,高性能,分布式和面向列的动态模式数据库。

(5)zookeeper

Zookeeper是分布式协作服务框架,解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。

(6)Sqoop

Sqoop是数据同步工具,是sql-to-hadoop的缩写,主要用于传统数据库和hadoop之间传输数据。数据的导入和导出本质上是mapreduce程序,充分利用了MR的并行化和容错性。

(7)pig

Pig是基于hadoop的数据流系统,定义了一种数据流语言-pig latin,将脚本转换为mapreduce任务在hadoop上执行。通常用于离线分析。

(8)mahout

Mahout框架是一些可扩展的机器学习领域经典算法的实现。

(9)flume

Flume 是日志采集工具,cloudera开源的日志收集系统,具有分布式,高可靠,高容错,易于定制和扩展的特点。

(10)资源管理器

资源统一管理与调度平台,典型的代表是mesos和yarn。

2、hadoop的优缺点

hadoop的优点为:

(1)扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

(2)成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

(3)高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

(4)可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。

hadoop的缺点为:

(1)低延迟数据访问问题

比如毫秒级、低延迟与高吞吐率。

(2)小文件存取慢

小文件会占用NameNode 大量内存。

(3)HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。

3、分布式存储HDFS

首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS分布式存储系统的结构如下图所示:

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

(1)HDFS集群分为两大角色:NameNode、DataNode。

(2)NameNode负责管理整个文件系统的元数据。

(3)DataNode 负责管理用户的文件数据块。

(4)文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上。

(5)每一个文件块可以有多个副本,并存放在不同的datanode上。

(6)Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量。

(7)HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行。

HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,版本中是64M。在底层最终按字节存储,文件被切割成一个个block块,block分布存储在集群节点中,单一文件Block大小一致,文件与文件可以不一致。HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,例如:hdfs://namenode:port/dir1/dir2/file.log。

目录结构及文件分块信息(元数据)的管理由namenode节点管理,即namenode是HDFS集群主节点,负责维护整个hdfs文件系统,以及每一个路径(文件)所对应的block块信息。

文件的各个block的存储管理由datanode节点负责,datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication),block可以设置副本数,副本无序分散在不同节点中,副本数的设置不要超过节点数量。HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。

4、NameNode和DataNode

(1)NameNode

NameNode的组成:

fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。

edits:操作日志文件。

fstime:保存最近一次checkpoint的时间

由于edits文件写入的快但是恢复元数据信息慢,fsimage恢复元数据信息速度快但是写入慢所以会有2种格式

在内存中有一份完整的元数据(内存meta data),在磁盘有一个“准完整”的元数据镜像fsimage文件,还有

用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志edits文件,当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存

查看namenode内容:

bin/hdfs oev -i edits -o edits.xml

bin/hdfs oiv -i fsimage_0000000000000001 –p XML -o fsimage.xml

(2) SecondaryNameNode

SecondaryNameNode不是namenode的备份(但可以做备份),它的主要工作是帮助namenode合并edits 日志,减少namenode启动时间。 SecondaryNameNode执行合并时机是根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒和配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB

namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据

(3)DataNode

DataNode存储管理用户的文件块数据,通过心跳机制定期向namenode汇报自身所持有的block信息

<property>

<name>dfs.blockreport.intervalMsec</name>

<value>3600000</value>

<description>Determines block reporting interval in milliseconds.</description>

</property>

datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:

timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。

而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。所以,举个例子,如果heartbeat.recheck.interval设置为5000(毫秒),dfs.heartbeat.interval设置为3(秒,默认),则总的超时时间为40秒。

<property>

<name>heartbeat.recheck.interval</name>

<value>2000</value>

</property>

<property>

<name>dfs.heartbeat.interval</name>

<value>1</value>

</property>

在每一台datanode机器上的这个目录中能找到文件的切块:

/usr/local/hadoop/hadoop-2.5.6/tmp/dfs/data/current/BP-193442119-192.168.1.100-1432452333866/current/finalized

5、hadoop的伪分布安装

Hadoop在Centos和Ubuntu安装步骤大体相同,如下所示:

(1)安装jdk

tar -zxvf jdk-7u79-linux-x64.tar.gz

vi /etc/profile

export JAVA_HOME=/home/jdk1.7.0_79

export PATH=.:$JAVA_HOME/bin:$PATH

使配置文件生效:

source /etc/profile

验证:

java -version

(2)安装haoop

tar -zxvf hadoop-2.6.0.tar.gz

配置环境变量:

vi /etc/profile

export JAVA_HOME=/usr/local/jdk1.7.0_79

export HADOOP_HOME=/home/d1/hadoop-2.6.0

export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH

source /etc/profile

(3)修改hadoop配置文件

修改hadoop-env.sh:

export JAVA_HOME=/usr/local/jdk1.7.0_79/

修改core-site.xml:

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://hadoop0:9000</value>

<description>change your own hostname</description>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/usr/local/hadoop/tmp</value>

</property>

</configuration>

修改hdfs-site.xml:

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.permissions</name>

<value>false</value>

</property>

</configuration>

修改mapred-site.xml:

<configuration>

<property>

<name>mapred.job.tracker</name>

<value>hadoop0:9001</value>

<description>change your own hostname</description>

</property>

</configuration>

(4)格式化

hadoop namenode -format

(5)启动

start-all.sh

查看namenode和datanode:

http://192.168.1.100:50070/

查看yarn:

http://192.168.1.160:8088

6、HDFS的shell操作

(1)-ls命令

功能:

显示目录信息

示例:

hadoop fs -ls hdfs://node001:9000/home/

hadoop fs –lsr hdfs://node001:9000/home/ (递归显示)

简写:

hadoop fs -ls /home/ (下同)

(2)-mkdir命令

功能:

在hdfs上创建目录,-p参数位递归创建

示例:

hadoop fs -mkdir -p /home/d1/d2/d3

(3)-help命令

功能:

帮助命令

示例:查看ls命令的帮助

Hadoop fs -help ls

(4)-appendToFile命令

功能:

向文件追加内容

语法:

hdfs dfs -appendToFile 源位置 目的位置

示例:将1个源文件的内容追加到目的文件

hdfs dfs -appendToFile src_file_1 dest_file

示例:将多个源文件的内容追加到目的文件

hdfs dfs -appendToFile src_file_1 src_file_2 dest_file

(5)-cat命令

语法:

hdfs dfs -cat 文件

示例:

hdfs dfs -cat /etc/profile

(6)使用-text命令

功能:

以字符形式打印一个文件的内容

示例:

hadoop fs -text /home/hello.txt

(7)copyFromLocal命令

功能:

从本地文件系统中拷贝文件到hdfs路径去

示例:

hadoop fs -copyFromLocal ./jdk-8u91-linux-x64.tar.gz /home/jdk_dir

(8)cp命令

功能:

从hdfs的一个路径拷贝hdfs的另一个路径

示例:

hadoop fs -cp /home/jdk-8u91-linux-x64.tar.gz /usr/local

(9)-count命令

功能:

统计文件及文件夹数目

示例:

hdfs dfs –count /user/

(10)-du命令

功能:

统计文件夹的大小信息

示例:

hadoop fs -du -s -h /usr/local/jdk8

(11)-df命令

功能:

统计文件系统的可用空间信息

示例:

hadoop fs -df -h /

(12)-get命令

功能:

等同于copyToLocal,从hdfs下载文件到本地

示例:

hadoop fs -get /home/jdk-8u91-linux-x64.tar.gz

(13)-put命令

功能:

等同于copyFromLocal,将文件上传hdfs

示例:

hadoop fs -put ./jdk-8u91-linux-x64.tar.gz /jdk8

(14)-moveFromLocal命令

功能:

剪切文件到hdfs

语法:

hdfs dfs -moveFromLocal <localsrc> <dst>

示例:

hdfs dfs –moveFromLocal ./hello.txt /dir1/

(15)-moveToLocal命令

功能:

剪切文件到本地

语法:

hdfs dfs -moveToLocal [-crc] <src> <dst>

示例:

hdfs dfs –moveToLocal /user/test/test.txt /test

(16)-mv命令

功能:

剪切hdfs文件

示例:

hdfs dfs –mv txt /dir1/test.txt /dir2/test.txt

(17)rm命令

功能:

删除文件或文件夹

示例:

hadoop fs -rm -r /aaa/bbb/

(18)-rmdir命令

功能:

删除空目录

示例:

hadoop fs -rmdir /aaa/bbb/ccc

(六)分布式列存储数据库HBase

1、hbase概述

Hadoop Database。高可靠、高性能、面向列存储的、横向和纵向可伸缩的分布式存储系统,在廉价pc机上可以搭建大规模的集群,google就是利用廉价pc机的能手。

Hbase操作分布式文件系统HDFS的数据,利用zookeeper来协调资源,hbase自带zookeeper。能够处理非常庞大的表,比如处理10亿条数据的表。

2、HBase的体系结构

HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion服务器(HRegion Service)群和HBase Master服务器(HBase Master Server)构成。Hbase Master服务器负责管理所有的HRegion服务器,而Hbase中所有的服务器是通过Zookeeper来进行协调,并处理HBase服务器运行期间可能遇到的错误的。

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

下面分别对上图的主要对象做分别的介绍:

(1)Client

使用HBase RPC机制与HMaster和HRegionServer进行通信,Client与HMaster进行管理类操作,Client与HRegionServer进行数据读写类操作。

(2)Zookeeper

Zookeeper Quorum存储-ROOT-表地址、HMaster地址,HRegionServer把自己注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况,Zookeeper可以避免HMaster单点问题。

客户端首先联系ZooKeeper子集群(quorum)(一个由ZooKeeper节点组成的单独集群)查找行健。上述过程是通过ZooKeeper获取含有-ROOT-的region服务器名(主机名)来完成的。通过含有-ROOT-的region服务器可以查询到含有.META.表中对应的region服务器名,其中包含请求的行健信息。这两处的主要内容都被缓存下来了,并且都只查询一次。最终,通过查询.META服务器来获取客户端查询的行健数据所在region的服务器名。一旦知道了数据的实际位置,即region的位置,HBase会缓存这次查询的信息,同时直接联系管理实际数据的HRegionServer。所以,之后客户端可以通过缓存信息很好地定位所需的数据位置,而不用再次查找.META.表。

(3)HBase Master

每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每台HRegion服务器它要维护哪些HRegion.当一台新的HRegion服务器登录到HMaster服务器时,HMaster会告诉它先等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它分配到其他HRegion服务器中。

(4)HregionServer

  HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

HRegionServer管理一些列HRegion对象;每个HRegion对应Table中一个Region,HRegion由多个HStore组成;每个HStore对应Table中一个Column Family的存储;  Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。

(5)HRegion

当表的大小超过设置的值时,HBase会自动地将表划分为不同的区域,每个区域包含所有行的子集。从物理上讲,一张表被拆分成了多块,每一块儿就是一个Hregion。一个HRegion会保存一表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面。 每个Hregion由多个HStore组成,每个Hstore对应表中一个列族的存储。Hstore由两部分组成:MemStore和StoreFile,用户写入的数据首先放入MemStore,当MemStore满了之后再写入StoreFile,StoreFile是HBase的最小存储单元,底层由Hfile来实现,而Hfile是键值对数据的存储格式,其实质是HDFS的二进制格式文件。

HBase中不能直接更新和删除数据,所有的数据均通过追加的方式进行更新。当StoreFile的数量超过设定的阈值时将触发合并操作,将多个StoreFile合并为一个StoreFile,此时即可进行数据的更新和删除。

(6)HLog

  引入HLog原因:在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。

  每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

  HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:

第一种HFile ,HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile。

第二种HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File。

(1)HFile

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo,Trailer中指针指向其他数据块的起始点,FileInfo中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。

  Data Index和Meta Index块记录了每个Data块和Meta块的起始点。

  Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。

  每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。

  每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。

  HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

KeyLength和ValueLength:两个固定的长度,分别代表Key和Value的长度。

  Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey。

  Column Family Length是固定长度的数值,表示Family的长度。

  接着就是Column Family,再接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。

  Value部分没有这么复杂的结构,就是纯粹的二进制数据。

(2)HLog File

  HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是"写入时间",sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。  HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。  

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

3、HBase的数据模型

在HBase中,数据以表的方式存储,具体数据模型涉及到的术语如下:

(1)Table(表格)

一个HBase表格由多行组成。

(2)Row(行)

HBase中的行里面包含一个key和一个或者多个包含值的列。行按照行的key字母顺序存储在表格中。因为这个原因,行的key的设计就显得非常重要。数据的存储目标是相近的数据存储到一起。一个常用的行的key的格式是网站域名。如果你的行的key是域名,你应该将域名进行反转(org.apache.www, org.apache.mail, org.apache.jira)再存储。这样的话,所有Apache域名将会存储在一起,好过基于子域名的首字母分散在各处。

(3)Column(列)

HBase中的列包含用:分隔开的列族和列的限定符。

(4)Column Family(列族)

因为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储属性,例如值是否缓存在内存中,数据是否要压缩或者他的行key是否要加密等等。表格中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族中。

(5)Column Qualifier(列的限定符)

列的限定符是列族中数据的索引。例如给定了一个列族content,那么限定符可能是content:html,也可以是content:pdf。列族在创建表格时是确定的了,但是列的限定符是动态的并且行与行之间的差别也可能是非常大的。

(6)Cell(单元)

单元是由行、列族、列限定符、值和代表值版本的时间戳组成的。

(7)Timestamp(时间戳)

时间戳是写在值旁边的一个用于区分值的版本的数据。默认情况下,时间戳表示的是当数据写入时RegionSever的时间点,但你也可以在写入数据时指定一个不同的时间戳。

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

4、hbase集群的安装

在安装HBase之前需要先安装JDK、Hadoop,HBase集群的安装步骤如下:

(1)下载并解压jar

tar -zxvf hbase-1.2.6-bin.tar.gz

(2)写配置文件

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

各个节点配置介绍:

Regionservers:

192.168.1.61

192.168.1.62

192.168.1.63

backup-masters:

hadoop2

hadoop-env.sh:

export JAVA_HOME=/home/d1/jdk1.8.0_91

hbase-env.sh:

export HBASE_MANAGES_ZK=true

export JAVA_HOME=/home/d1/jdk1.8.0_91

export HBASE_LOG_DIR=/usr/local/hadoop_data/logs

hbase-site.xml:

<property >

<name>hbase.rootdir</name>

<value>hdfs://hadoop1:9000/hbase</value>

</property>

<property>

<name>hbase.tmp.dir</name>

<value>/usr/local/hadoop_data/tmp</value>

</property>

<property>

<name>hbase.cluster.distributed</name>

<value>true</value>

</property>

<property>

<name>hbase.zookeeper.quorum</name>

<value>hadoop1,hadoop2,hadoop3</value>

</property>

<property>

<name>hbase.zookeeper.property.dataDir</name>

<value>/usr/local/hadoop_data/hbase/zk</value>

</property>

<property>

<name>hbase.rpc.timeout</name>

<value>1440000</value>

</property>

<property>

<name>zookeeper.session.timeout</name>

<value>90000</value>

</property>

<property>

<name>hbase.zookeeper.property.tickTime</name>

<value>9000</value>

</property>

<property>

<name>hbase.regionserver.restart.on.zk.expire</name>

<value>true</value>

</property>

(3)将配置好的配置文件替换节点hadoop1,然后拷贝到其它2个节点

scp -r hbase-1.2.6 hadoop2:/home/d1

scp -r hbase-1.2.6 hadoop3:/home/d1

(4)启动hbase

cd bin

[root@hadoop1 bin]# ./start-hbase.sh

[root@hadoop1 bin]# jps

5538 HQuorumPeer

2711 DataNode

5721 HRegionServer

2618 NameNode

5596 HMaster

5773 Jps

2974 NodeManager

5、进入hbase管理页面

http://hadoop1:16010/master-status

6、进入hbase的shell

[root@hadoop1 bin]# ./hbase shell

[root@hadoop1 bin]# ./hbase shell

2017-09-15 00:38:53,466 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/home/d1/hbase-1.2.6/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/home/d1/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

HBase Shell; enter 'help<RETURN>' for list of supported commands.

Type "exit<RETURN>" to leave the HBase Shell

Version 1.2.6, rUnknown, Mon May 29 02:25:32 CDT 2017

hbase(main):001:0>

5、HBase的Shell操作

(1)创建简单的表

示例:建立表为t1,列族为f1的表

create 't1','f1'

(2)查看表的内容scan命令

示例:

scan ‘t1’

(3)查看所有表list命令

示例:

hbase(main):006:0> list

(4)查看表所有列族的详细信息describe

示例:

hbase(main):006:0> describe 't1'

(5)put命令

语法:

put '表名' , '行键' , '列键' , '值'

示例 :插入行键为r1、列族为f1、列为c1、时间戳为1、单元格内容为100

hbase(main):011:0> put 't1' , 'r1', 'f1:c1' , 1 , 100

hbase(main):006:0> scan 't1'

ROW COLUMN+CELL

r1 column=f1:c1, timestamp=100, value=1

1 row(s) in 0.1160 seconds

(6)scan命令

功能:

全表单元扫描

语法:

scan '表名' , { COLUMNS =>['列族名1','列族名2' ... ] ,参数名 =>参数值... }

scan '表名' , { COLUMN =>['列1','列2' ... ] ,参数名 =>参数值... }

示例-1:查询指定的某个列族(对某些列族不关心)

hbase(main):016:0> scan 't1' , {COLUMNS=>'f1'}

示例-2:扫描某列,使用LIMIT参数限制输出一个单元

hbase(main):016:0> scan 't1' , {COLUMN=>'f1:c1',LIMIT=>1}

(7)get命令

功能:

获取行的所有单元格或某个指定的单元

语法:

get '表名' ,'行键',{ COLUMNS=>['列族名1','列族名2' ... ] ,参数名 =>参数值... }

get '表名' ,'行键',{ COLUMN=>['列1','列2' ... ] ,参数名 =>参数值... }

示例-1:查找行键为“r1”的所有单元

hbase(main):016:0> get 't1','r1'

示例-2:查找行键为“r1”,列为“f1:c1”

hbase(main):016:0> get 't1','r1',{COLUMN=>'f1:c1'}

(8)统计一行有多少条记录:

hbase(main):001:0> count 't1'

1 row(s) in 1.1630 seconds

=> 1

(9)delete和deleteall命令

功能:

delete删除一个单元;delete删除一行

语法:

delete '表名称','行键','列'

示例:删除表“t1”,行键为“r1”,列为“f1:c1”

hbase(main):005:0> delete 't1' , 'r1' , 'f1:c1'

(10)drop命令

功能:

删除表

语法:

先“disabl”e然后删除

示例:

hbase(main):005:0> disable 't1'

0 row(s) in 2.8910 seconds

hbase(main):006:0> drop 't1'

0 row(s) in 4.4640 seconds

(11)alert命令

增加或者修改列族

语法:

disable '表名'

alter '表名' ,NAME='列族名',VERSIONS>='3' (3的意思为表的版本号修改的次数)

enable '表名'

示例:将表“t1”的列族“f1”的“VERSIONS”参数修改为3

alter 't1' ,NAME=>'f1', VERSIONS=>'3'

(12)同时增加或者修改多个列族

语法:

alter '表' ,{NAME=>'列族1',VERSIONS=>'值1'},{NAME=>'列族2',VERSIONS=>'值2'}

大数据存储详解(NoSQL/CAP理论/HDFS/HBase)

《大数据和人工智能交流》的宗旨

1、将大数据和人工智能的专业数学:概率数理统计、线性代数、决策论、优化论、博弈论等数学模型变得通俗易懂。

2、将大数据和人工智能的专业涉及到的数据结构和算法:分类、聚类 、回归算法、概率等算法变得通俗易懂。

3、最新的高科技动态:数据采集方面的智能传感器技术;医疗大数据智能决策分析;物联网智慧城市等等。

根据初学者需要会有C语言、Java语言、Python语言、Scala函数式等目前主流计算机语言。

根据读者的需要有和人工智能相关的计算机科学与技术、电子技术、芯片技术等基础学科通俗易懂的文章。

后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。