浅谈云计算和大数据技术

浅谈云计算和大数据技术
背景:
随着计算机技术的发展,数据量日益增长,现有技术也很难满足业务的发展需求,在代码的层层迭代和优化之后,还是很难满足数据的增长需求,迫切需要一项新的技术来从事数据计算,因为就产生了云计算和大数据这些技术,那么在此背景下,简单介绍一下我对云计算和大数据技术的理解。
1. 云计算
1.1云计算的概念
能通过网络访问可扩展的、灵活的、可共享的物理或虚拟资源池,并按需自助获取和管理这些资源的模式。其中资源实例包括服务器、操作系统、网络、软件、应用和存储设备等。
1.1.1 Iaas
Iaas: Infrastructure as a Service,基础设施即服务。这里的基础设施包括:
服务器:IBM小型机等
网络:带宽、IP、路由等
存储设备:CPU、内存、磁盘
以前这些资源都是我们的固有资源,但是云计算以后,云的服务商可以通过云的方式提供给我们这些资源。例如:360云盘、百度云盘、新浪云盘等
1.1.2 Paas
Paas: Platform as a service,平台即服务。这里的平台包括:
Web服务器:Tomcat,Jboss,jetty
数据库服务器:Oracle,MySql等
软件应用平台:Struts2,Hibernate,Spring等
云盘必须给用户提供一个界面,用户通过该界面能够上传文件、上传视频、上传图片、创建网络相册等等。而这个界面实际上就是一个平台,用户可以借助该平台完成各种操作。
1.1.3 Saas
Saas:Software as a service,软件即服务。这里的软件包括:
应用软件:视频播放器、文本编辑器
行业软件: ERP、OA等
云盘可以提供用户在线播放视频的功能,也可以通过云盘查看word文档。因为云盘给用户提供了视频软件服务、文件查看服务。
1.1.4 一切都是服务
不管Iaas,Paas,Saas,有一个共同的特点,不管是基于设备、平台还是软件,都是提供服务的。所以说:云计算就是提供服务的。
1.1.5 资源池化
资源池化就是把Iaas,Paas,Saas层的资源(CPU、存储、网络等)放入到资源池中(云服务器)。云服务器进行集中管理。所以云计算里所有的服务都是通过资源池里的资源而提供的。
1.1.6 云服务的特征
1. 多租用
一个云服务器可以给多个人共享,共享资源池中的内容,云盘肯定是可以给很多用户所用的,而且大家了解的用户也不少,多租用有如下的特点:
资源隔离:每个用户都有自己的云盘,在自己的云盘上存放自己的内容,这些内容对于别人来说是不可见的
资源共享:如果一个用户需要另外一个用户的资源,这个用户可以通过短连接的方式提供给另外一个用户。
互操作性:在不同的平台下相互操作相同的软件。你在Android系统下把手机的联系人备份到云盘中,然后你换手机了,Ios的操作系统,同样利用云盘中的恢复功能可以把手机的联系人恢复。这样在Android和Ios两个操作系统之间实现了互操作性。
2. 快速伸缩和弹性
无状态化服务(与数据无关):云服务器端不记录用户的行为,这样可以大大减少服务之间的耦合性。只需要利用服务的框架直接调用就可以了。
快速供应:云服务器可以对Iaas,Paas,Saas层的资源做到快速供应。只要用户需要,并且有时候支付一定的费用,就能供应。阿里云就是一个很好的例子.
灵活、可伸缩:云服务器可以动态的给用户分配磁盘空间,按照用户的需求量的大小分配,所以是非常灵活和可伸缩的。包括Iaas,Paas,Saas层的各种资源都可以做到灵活可伸缩。
分布式拓扑:一个云服务器必定是一个分布式拓扑结构的服务器。
动态可发现:云服务器可以对用户使用CPU、内存、磁盘等资源的情况做监控,所以当一个用户的某些资源情况出现了不足,服务器是可以动态发现的。
3. 按需自助服务
灵活的负载分配:服务器可以根据你使用的情况很灵活的做到负载均衡。这样一个公司的运维人员做的事情就可以变得简单。
标准服务提供:百度、腾讯、阿里都有自己的API开放出来,这样例如我们开发一个系统,要用到交通的拥堵情况,可以调用百度的API把数据提取出来。这样的服务现在已经标准化了。
服务快速启动和自动化:在没有云的时代,运维的共组是很麻烦的,需要在客户那里启动服务,并且进行调试,但是现在有了云服务器,很多工作就可以让云来做。
增量部署和测试:当你在云服务器申请的节点不够用时,可以利用云服务器做增量部署,让云服务器帮你自动部署和测试。这些工作都可以放在云端来做。
4、广泛的网络访问
访问云服务的终端可以是多种多样的,pad、手机、电脑等
5、可计量的服务
云服务器通过用户使用资源池中的内容以及上述的一些列特征,可以做到
监控、计量、计费、报表的服务。
2. 大数据
2.1 数据划分
现有数据按照结构划分,可以分为结构化数据和非结构化数据。
2.1.1 结构化数据
结构化数据就是我们在工作中经常用到的mysql、oracle、db2、sybase等这些数据库
所以结构化数据的特征是:逻辑严谨、数据不能破坏、格式一致。
2.1.2 非结构化数据
如图示例为电信格式的数据
这里写图片描述
上述的数据是用户用手机上网的各种统计。这样的数据称为非结构化数据。非结构化数据没有特别严谨的逻辑结构。是由一些字段和值组成,字段之间以约定分隔符分隔。说明一种行为方式。这样的数据特点为:结构不严谨、数据量很大、允许数据丢失。
2.2 大数据场景
上述的非结构化数据,要按照指定规则进行统计,那么就需要用到大数据来进行计算。
在品牌业务中,我们会根据日志去统计效果数据,平均每个日志文件大小也在上百兆或者GB之上,如果采用java算法,则计算就比较困难,采用大数据计算,计算比较简单,同时也节省了系统资源。
下面分别介绍一下传统数据库和分布式文件系统的特点
2.2.1 传统数据库方式
这里写图片描述
说明:
1) 把上述的大量的数据分开到几个数据库中进行存储。
2) 数据通过网络从数据库服务器传输到Web服务器
3) 对Web服务器中的数据进行统计
缺点:
1) 如果数据量很大,集群的数量就会很大,这样数据库服务器本身维护起来就比较困难
2) 大量的数据通过数据库传输到Web服务器端,这样会导致大量的数据在网络上传输,影响性能。
所以这种从数据到计算的方式当数据量大到一定程度以后就会有瓶颈了。
2.2.2 分布式文件系统
基于以上应用的特点,关系型数据库是不能给出特别好的解决方案的
这里写图片描述
说明
1) 上述有三种节点
data2,data3,data4为基础数据节点,称为datanode,文件可以分别存储到这三个节上,replication为每一个节点的备份节点,如果data2节点宕机,那么replication节点将起作用(可以通过设置数据的备份份数)。data1为汇聚节点,称为namenode,保存data2,data3,data4的元数据信息
2) data2,data3,data4节点的功能有两个:存储数据、进行计算
3) data2,data3,data4把计算的结果通过网络传递给data1节点
4) 在data1节点上进行总的计算
好处:因为在data2,data3,data4节点上已经进行了计算,所以在网络上传输的数据量大大减少了,提高了数据传输效率。
2.2.3 分布式文件系统特点
这里写图片描述
上图比3.2.2的图多了一个管理节点。
1) client:客户端利用程序访问需要获取的数据。
2) 管理节点:记录了数据的元数据信息(位置信息)
管理节点和数据节点必须保持通信,通过心跳机制来保证数据节点的存活,如果管理节点知道data2宕机了,就可以把请求转发给replication节点
当增加数据节点的时候,管理节点也必须增加该数据节点的元数据信息
3) 数据节点::数据节点记录了大量的数据信息,数据节点可以进行计算,数据节点定时以心跳的方式保持与管理节点的联系如果数据节点宕机,replication节点立刻起作用。
这样的处理方式是可以处理大量的非结构化数据的。
整体的流程可以比喻为:仓库和管理员,当用户想获取仓库的物品时,首先需要和管理员打招呼,通过管理员可以获取仓库物品,同理,当向仓库放物品时,首先就需要和管理员登记,然后将物品放到登记的指定位置,方便物品的存取。
3. HDFS
3.1 Hdfs的优点
3.1.1 支持超大文件
支持超大文件。超大文件在这里指的是几百MB、 GB甚至TB大小的文件。一般来说hadoop的文件系统会存储TB级别或者PB级别的数据。
3.1.2 检测和快速应对硬件故障
在集群的环境中,硬件故障是常见的问题。因为有多台服务器连接在一起,这样会导致高故障率。因此故障检测和自动恢复是hdfs文件系统的一个设计目标。
3.1.3 流式数据访问
Hdfs的数据处理规模比较大,应用一次需要访问大量的数据,同时这些应用一般都是批量处理,而不是用户交互式处理。应用程序能以流的形式访问数据集。主要的是数据的吞吐量,而不是访问速度。
3.1.4 简化的一致性模型
大部分hdfs操作文件时,需要一次写入,多次读取。所以一个文件一旦经过创建、写入、关闭后,一般就不需要修改了。这样简单的一致性模型,有利于提高吞吐量。
3.2 Hdfs的缺点
3.2.1 低延迟数据访问
低延迟数据。需要实时获取的数据,需要数据在毫秒或秒的范围内得到响应。由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟来说,不适合用hadoop来做。
3.2.2 大量的小文件
Hdfs支持超大的文件,是通过数据分布在数据节点,数据的元数据保存在名字节点(namenode)上。名字节点的内存大小,决定了hdfs文件系统可保存的文件数量。虽然现在的系统内存都比较大,但大量的小文件还是会影响名字节点的性能。
3.2.3 不支持超强的事务
没有像关系型数据库那样,对事务有强有力的支持。
3.3 Hdfs的体系结构
这里写图片描述
从上图可以看出
NameNode节点:在Hadoop1.x的版本中,NameNode节点只有一个,所以NameNode节点为非HA的(不是高可用的,后面会详细讨论)。在Hadoop2.X的版本中,NameNode节点可以有很多个。所以在Hadoop2.x的版本中,NameNode节点是HA的(高可用的)。该节点主要负责管理文件系统命名空间、集群配置和数据块的复制等(可以理解为存储元数据信息)
DataNode节点:是文件存储的基本单元,它以数据块的形式保存了hdfs中文件的内容和数据块的数据校验信息。
SecondaryNameNode节点:配合NameNode节点管理元数据
3.4 数据块
在HDFS中,一个特别重要的概念:数据块(Block)。前面介绍到,在HDFS中存储的文件都是超大数据的文件,我们可以把这个超大规模的文件以一个标准切分成几块,分别存储到不同的磁盘上。这个标准就称为Block。(Hadoop1.x默认Block大小为64MB,Hadoop2.x为128MB)。这样做有以下几点好处:
1、 文件块可以保存在不同的磁盘上。在HDFS系统中,一个文件可以分成不同的Block存储在不同的磁盘上。
2、 简化存储系统。这样不需要管理文件,而是管理文件块就可以了。
3、 在HDFS系统中,(dfs.replication属性配置)默认会复制3份。
3.5 NameNode
这里写图片描述
如图为NameNode做的事情:维护着整个文件系统的文件目录树
这里写图片描述
从上图可以看出,NameNode维护两层关系。第一关系为文件/目录的元信息和文件的数据块的关系,/txt/exec/a.txt分为三个数据块存储b1,b2,b3。/word/exec/b.doc分为两个数据块存储b4,b5。第二关系为数据块信息与数据节点之间的关系。从图中也可以看出来b1在DataNode1,DataNode2,DataNode3节点都有。b2在DataNode1,DataNode2,DataNoden节点。依次类推。以上的信息以两种形式存储在本地文件系统中。一种是命名空间镜像(File System Image,FSImage,也称为文件系统镜像),另一种是命名空间镜像的编辑日志(Edit Log)。
在HDFS运行的过程中,NameNode节点还能获取HDFS整体运行的状态信息。如系统的可用空间、已经使用的空间、各数据节点的当前状态等。
3.5.1 命名空间镜像FSImage
命名空间镜像保存着某一特定时刻HDFS的目录树、元信息和数据块索引信息。
3.5.2 编辑日志EditLog
当在HDFS中,后续对FSImage的改动则放在编辑日志中。FSImage与EditLog共同提供了一个完整的NameNode的第一关系。
3.5.3 注意事项
NameNode中与DataNode相关的信息不保留在NameNode的FSImage和EditLog中。NameNode每次启动时,都会动态的重新创建这些信息,这些信息成为了NameNode的第二关系(数据块与datanode之间的关系)。运行时,客户端通过NameNode节点获取上述的信息,然后和DataNode节点进行交互,读写文件数据。所以NameNode中的DataNode的信息是保留在内存中的,每次启动的时候动态的创建。因为用户在HDFS的客户端操作文件的时候,有可能会增加文件、删除文件,这样可能会导致block的变化,从而导致DataNode的变化。可以说NameNode上与DataNode相关的位置信息是实时更新的,所以每次启动NameNode的时候需要重新加载一次。
3.5.4 SecondaryNameNode
用户定期合并FSImage和EditLog。在大规模集群的情况下,SecondaryNameNode是单独一台机器的。该节点根据集群配置的时间间隔,不停地获取HDFS某一个时间点的FSImage和EditLog,合并得到一个新的FSImage。这个新的FSImage会上传到NameNode节点上,替换原来的NameNode上的FSImage,并清空上述日志。这种机制称为Checkpoint机制。这样避免了EditLog过大,导致NameNode启动时间过长的问题。但是如果NameNode出现故障,SecondaryNameNode是不能帮助NameNode进行自动恢复的。
这里写图片描述
DataNode
1)
上图为在secondarynamenode中发生的事情:
1、 SecondaryNameNode通过RPC技术远程调用NameNode中的getEditLogSize方法,获取到NameNode节点上编辑日志的大小
2、 如果编辑日志很小,SecondaryNameNode就不需要合并元数据镜像和编辑日志。
3、 继续通过RPC技术远程调用rollEditLog方法,启动一次checkpoint过程
4、 NameNode在调用rollEditLog方法之前,需要创建一个新的编辑日志文件edit.new。后续对文件系统元数据的改动,都会记录到edit.new文件中。
5、 SecondaryNameNode通过RPC技术把NameNode中的fsimage和edit文件读取过来,在内存中进行合并(3,4)
6、 在SecondaryNameNode中,在内存中合并的文件为fsimage.ckpt。
7、 NameNode通过RPC技术把fsimage.ckpt下载到本地,把fsimage.ckpt覆盖掉原来的fsimage,形成新的fsimage,把原来的edit.new改成edit。
3.6 DataNode
在数据节点上,hdfs文件块以Linux文件系统上的普通文件进行保存。客户端进行文件内容操作时,先由NameNode节点告诉客户端每个数据块驻留在哪个数据节点,然后客户端直接与数据节点进行通信,处理与数据块对应的本地文件。同时,数据节点会和其他数据节点进行通信,复制数据块,保证数据的冗余性。
DataNode节点会不断向NameNode节点报告。初始化时,每个数据节点将当前存储的数据块告知NameNode节点。后续DataNode节点在工作的过程中,数据节点仍会不断的更新 NameNode节点与之对应的元数据信息,并接受来自NameNode节点的指令,创建、移动或者删除本地磁盘上的数据块。
3.7 Hdfs的操作
3.7.1 创建目录
这里写图片描述
客户端调用HDFS的FileSystem实例,也就是DistributedFileSystem的mkdir方法,该对象通过远程调用NameNode节点上的远程方法mkdir ,让NameNode执行具体的创建子目录操作。在目录树数据结构上的对应位置创建新的目录节点,同时记录这个操作并持久化到日志中。在整个操作期间,客户端和NameNode都不需要和DataNode节点交互。
3.7.2 删除文件
这里写图片描述
同以上的步骤,先在NameNode上执行节点名字的删除,但是DataNode上存放的数据块也必须删除。当NameNode执行delete方法时,它只标记操作涉及的需要被删除的数据块,而不会主动联系这些数据块所在的DataNode节点。当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,在心跳应答里,NameNode节点会向DataNode发出指令,从而把数据删除掉。所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。
3.7.3 读文件
这里写图片描述
客户端通过FileSystem.open()打开文件,在打开文件的时候,实际上创建了一个DFSInputStream输入流,返回给了客户端,客户端使用这个输入流读取数据,在输入流中会通过ClientProtocol.getBlockLocations方法来确定NameNode节点上标识的文件数据块的保存位置(在DataNode节点上)。完成上述步骤,客户端就知道了要读取的文件在哪个DataNode节点上,在哪个数据块中。当执行FSDataInputStream的read方法时,客户端的FSDataInputStream会和最近的数据节点建立联系。
3.7.4 写文件
这里写图片描述
客户端调用FileSystem的create方法创建文件,这个时候会远程调用NameNode,在文件系统的命名空间中创建一个新的文件,NameNode创建新文件时需要执行各种各样的检查,如NameNode是否正常工作,被创建的文件已经存在,客户端是否有在父目录中创建文件的权限等。这些检查都通过以后,NameNode会创建一个新的文件,并记录创建操作到编辑日志edit中。当创建完成一个新的空文件以后,客户端需要向NameNode节点申请数据块,执行addBlock方法。该方法执行成功以后,会返回一个LocatedBlock对象,该对象包含了新数据块的数据块标识和版本号。根据该LocatedBlock对象,客户端就可以和对应的DataNode联系,然后通过写操作,把一个一个Block写入到DataNode中。当写完一个数据包以后,DataNode节点通过调用NameNode节点的DatanodeProtocol远程接口的blockReceived方法,向NameNode提交数据块信息。当把所有的数据写完以后,就会调用close方法关闭流。
3.7.5 DataNode的启动和心跳
这里写图片描述
从上图可以看出,当DataNode启动的时候
1、 检查版本号:
检查本地的版本号和NameNode中的版本号是否一致
2、 把DataNode节点注册到NameNode中
3、 DataNode需要向NameNode报告其数据节点的blocks信息
4、 之后DataNode会一直向NameNode发出心跳信息
4. Mapreduce
4.1 Mapreduce计算框架
Mapreduce执行分为map和reduce函数,Map函数为分支函数,根据key值,按照一定的功能进行分拣。reduce函数为聚合函数,根据key值,按照一定的功能进行聚合。
4.2 Mapreduce特点
mapreduce的计算框架要完成的事情如下:
1、 处理特别大量的数据。
2、 Map函数的节点部署,包括为所有节点分配cpu资源、内存资源、磁盘资源等。
3、 当很多map函数在进行计算的时候,如果有一个节点宕机了,整个计算框架必须得知道哪一个map函数所在的节点宕机。
4、 当map函数计算完毕以后,把结果就传递给reduce函数,reduce函数需要知道map函数计算完毕。
5、 数据量过大,分配到不同map执行节点执行。
3,4,5步骤可以称为资源的调度。
所以mapreduce除了计算以外,还有资源分配和资源调度的事情。集群节点过多对于计算来说就比较难了。所以框架既要完成计算,又要完成资源分配和资源调度任务。
4.3 Mapreduce的运行结构图
这里写图片描述
从5.3的分析可以看出,整个mapreduce计算框架可以分为资源分配、资源调度、计算三方面的内容。其中,资源分配是由mapreduce计算框架内部完成的,资源调度也是由mapreduce计算框架内部完成的。而计算的部分,用户只参与了map阶段和reduce阶段的计算。从运行结构图可以看出,步骤大致应该是这样的:
1、 mapreduce计算框架先从hdfs系统中,把文件提取出来
2、 用InputFormat进行适度的分割
3、 把分割完成的每一行送入到用户提前写好的map函数中进行分拣,所以用户写的map函数是由InputFormat调用的
4、 重复调用map函数,直到文件所有的内容都被处理了
5、 把map运算完毕后的结果送入到程序员写好的reduce函数
6、 Reduce函数进行规约处理(聚合运算)
7、 把reduce函数运算后的结果送入到OutputFormat中
8、 由OutputFormat把运算结果按照指定的格式输出到hdfs中
从上面的顺序可以看出,程序员只要写两部分内容即可:map和reduce。
4.4 Wordcount
给定指定的一个文件,例如aa.txt文件,计算该文件中相同的单词出现的数量
1、 思路
这里写图片描述
根据需求可以得到:
Map中,key值为单词,value为1即可
从图中可以看出,map函数得到的是一个为1的集合
2、 map函数
这里写图片描述
说明:
1、 MyMapper继承了一个类Mapper,从上述代码可以看出Mapper是一个泛型类,定义了四个泛型KEYIN为输入的key,VALUEIN为输入的value,KEYOUT为输出的key,VALUEOUT为输出的value。
2、 MyMapper中的四个泛型参数给出的定义为:输入key:LongWritable(偏移量),输入value:Text,输出key为Text(当前行文本),输出value为LongWritable。
3、 LongWritable类型为实现了对象序列化接口的一个long型,因为要在网络上传输,所以必须实现对象的序列化。
4、 Text类型实现了对象序列化接口的一个文本类型。
3、 Reduce函数
这里写图片描述
说明:
map函数的输出的key,value就是reduce函数的输入的key,value。
reduce函数输出的不是直接落地(在hdfs系统中形成文件),输出的也是一个key,value,由OutputFormat负责落地
4.5 Mapreduce详解
在mapreduce中,不管是map算法还是reduce算法实际上都称为task,即map task和reduce task。
4.5.1 Map task
这里写图片描述
说明:
1、 要处理的文件存储在hdfs中,是以block的形式存储的。
2、 Maptask会把文件的块block送入到InputFormat中
3、 InputFormat的功能有两个
1、 数据切分
按照一定的策略,将输入数据切分成若干个split,以便确定Map Task
的数目。
2、 为Mapper提供输入数据
给定某个split,能将其解析成一个个key/value对。
4.5.2 InputFormat
InputFormat主要用户描述输入数据的格式,它提供以下两个功能
1. 数据切分:按照某个策略将输入数据切分成若干个split,以便确定Map Task的数量。
2. 为 Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对。
4.5.3 OutputFormat
OutputFormat主要用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件。

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值