-->

后端面试38讲_34_31_大数据架构大数据技术架构的思想和原理是什么

你好,我是李智慧。

我在开篇时讲到,任何新技术都不是凭空产生的,都是在技术技术的基础之上,进行了一些创新性的组合扩展,应用到一些合适的场景之中,然后爆发出来巨大的生产力。

后面几篇我要讲的大数据技术,区块链技术都是如此。

大数据技术呢其实是分布式技术在数据处理领域的创新性应用本质和我们前面提到的分布式技术思路一脉相承,用更多的计算机组成一个集群,提供更多的计算资源,从而满足更大的计算压力。

要求前面我们讨论的各种分布式缓存、负载均衡、分布式存储的都是讲如何在高并发的访问压力下,利用更多的计算机满足用户的访问压力。

而在大数据技术讨论的是如何利用更多的计算机满足大规模的数据计算要求。

大数据就是将各种数据统一收集起来,进行计算,发掘其中的价值。

这些数据既包括数据库的数据,也包括日志数据,还包括专门采集的用户行为数题。

既包括企业内部自己产生的数据,也包括从第三方采购的数据,还包括使用网络爬虫获取的各种互联网公开数据。

面对如此庞大的数据,如何重储,如何利用大规模的服务器集群处理计算。

大量的数据就是大数据技术的核心关键。

既规模数据计算,首先要解决的呢就是大规模数据的重储问题。

如何将数本t数百p的数据重储起来通过一个文件系统统一管理,这本身就是一个极大的挑战。

我曾在专栏第五篇讲到过分布式文件系统HTFS的架构HTFS可以将数千台服务器组成一个统一的文件重储系统。

其中name node服务器充当文件控制块的角色,进行文件源数据管理及记录、文件名访问权限、数据存储地址等信息。

而真正的文件数据则存储在DATN de的服务器上。

Data node以块儿为单位存储数据,所有的块信息、如如块、ID块所在的服务器、IP地址等都记录在name node,而具体的块数据则存储在data node上。

理论上,name node可以将所有data node服务器上的所有数据块都分配给一个计算。

也就是说,一个文件件以使用所有服务器器硬硬盘储储间间达到数百p的大响。

此HHDFS了了证证不会因硬硬或者服务器损坏而导致文件损坏,还会对数据块进行复制。

每个数据据块会会存储多台台、务器器上,甚至多计架上上据存储在HDFS上的最终目标,还是为了计算进行数据分析或者机器学习,从而获得有益的结果。

但于如果像传统的应用程序那样,此HHDFS当普普通文件,从文读读取数据进行计算。

于一个需要一次计算数百t数据的大数据计算场景,就不知道要算到什么时候了。

大数据处理的经典计算框架是MARDUCEMAREDCE的核心思想,是对数据分片进行计算。

既然数据以块为单位分布存储在很多台服务器组成的集群上,那么能不能就在这些服务器上针对每个数据块进行分布式的计算呢?事实上,MAREDCE将一个计算程序启动在分布式集群的多台服务器上,每个服务器上的程序都读取本服务器上要处理的数据块进行计算。

因此大量的数据就可以同时进行计算的。

但是这样的话,每个数据块的数据都是独立的。

如果这些数据块需要进行关联计算,怎么办呢? Maprdce将计算过程分成两个部分,一个是map过程,每个服务器上会启动多个map器程map优先读取本地数据进行计算,计算后输输出一个y value集合另一个rereduce程。

Mmpe duce在在在数据服务器上都会启动多个reduce进程,然后对map输出的k value集合进行h uf FL操作。

所谓的shaffer就是将相同的k发送到同一个reduce进程。

在reduce中完成数据的关联计算。

我们以经典的world count,也就是统计所有数据中相同单词的词频数据为例,看看map和reduce的处理过程。

假设原始数据有两个数据,块MAPRDDCE框架启动了两个map进程进行处理,分别读入数据map函数对读入的数据进行分词处理。

然后针对每个词输出词一这样的valrek value结果,然后MAREDX框架进行suffer操作。

相同的k发送给同一个reduce进reduduce的输入,就是k value列表。

这样的结果及相同k的value合并成一个value列表。

我在文稿中给了一个例子。

在这个例子中呢,这个value列表就是由很多个一组成的列表reduce.对这些一进行求和操作,就得到了每个单词的词频结果了。

同样的,你在这里看到具体的MARDUC,程程,同样讲述了和mamareduce进程合作,完成数据处理的过程。

那么,这些进程程如何在分布布式服务器集集群启启动呢?数据据如何流流动进成完成结算呢?同们rem MPRDUCE一为例,看一下这个过程。

Marduce一主要与job chicker和task chicker两种进程角色job chicker在MARDUCE集群中只有一个,而task chicker则和data node一起启动。

在集群的所有的服务器上MAP reducce应用程序job cllient启动后呢,会向job chicker提交作业。

Job chicker根据作业中的输入文件路径分析需要在哪些服务器上启动map进程,然后就向这些服务器上的task chicker发送任务命令tastic. Tker收到任务后,启动一个task runner进程,下载任务对应的程序,然后反射加载程序中的map函数读取任务分配的数据块进行map计算。

Map计算结束后,task个ker会对map输出进行操作,然后shaftasask runner加载,reduce函数进行后续的计算。

Hdfs和MARRDCE都是hadoop的组成部分。

Mared cce虽然只有map和reduce两个函数,却几乎可以满足任何大数据分析和机器学习的应用场景。

不过,复杂的计算可能需要c个job才能够完成,这些job之间还需要根据其先后依赖关系进行作业编排。

因此,开发比较复杂。

数据分析传统上主要是利用circle进行分析,如果能根据circle自动生成MAPRDUCE,那么就可以极大的降低大数据技术在数据分析领域的应用场景。

High就是这样一个工具。

我们看一下,对于如下一条常见的circle语句high是如何将其转换成MAPRECE计算的。

这里有一条常见的circle统计分析语句,统计不同年龄的用户访问,不同网页的兴趣偏好,具体的数据的输入和执行结果。

你可以在文稿中看到我们看这个事例,就会发现这个计算场景和word count很像。

事实上呢也确实如此,我们可以MAPREDCE的计算过程。

完完这这s cl LL的计算map函数输入的k是表的行记录,value是一reduce函数,对相同的行记录,也就是相同的k的value集合进行求和计算,就得到了最终的circle输出结果了。

那么have ve要做的呢,就是把sql翻译成MARRDU的程序代码。

事实上啊have you内置了很多的operator,每个operator完成一个特定的计算过程。

Have you将这些operator构造成一个有向无环图deg?然后根据这些,operator之间是否存在否将其分装到shfmap,或者reduce函数就可以提交给MAPRUCE执行了。

我在文章中给出了operator组成的deg l这是一个包含了威尔查询条件的sql v尔,查询条件对应一个filter operator have的表数据存储在HDFS表的结构,比如表名字段、名字段之间的分割符等等。

存储在matter store用户通过client提交circle到java jjava,请求compiler将circle编译成。

我们前面提到的一dk执行计划,然后交给它都不执行。

Mayp reduce主要是使用硬盘存储计算过程中的数据,这样虽然可靠性比较高,但是性能呢其实比较差。

此外,MAPRDCE只能使用map和reduce函数进行编程。

虽然能够完成各种大数据计算,但是编程比较复杂,而且受到map和reduce编程模型简单的影响,复杂的计算必须组合多个MAPRUCE job,才能够完成编程难度进一步的增加。

Spark是在map er deduce基础上进行改进,主要使用内存进行中间计算,数据重储,加快了计算执行的时间。

在某些情况下,性能可以提升上百倍。

Spark的主要编程模型是RDD弹性数据集,在RDD上定义了许多常见的大数据计算函数,利用这些函数可以使用极少的代码,完成较为复杂的大数据计算。

前面举例的world count,如果使用spark编程,只需要三行代码。

你在文章中的这里可以看到这几行代码。

首先,从HDFS读取数据构建出一个RDD text file,然后在这个RDD上执行三个操作。

将输入数据的每一行文本,用空格拆分成单词,将每个单词进行转换。

Word转换成word一生成k value的结构相同的k进行统计,统计方式是对value求和最后将word count写入到HDFS,完成结果输出最面提到的代码中的flat map,最p reduce by k都是spark的RDD转换函数。

Spd d转换函数的计算结果还是RDD,属于上面三个函数,可以写在一行代码,最终得到的还是一个RDD. Spark会根据程序中的转换函数生成计算任务执行计划。

这个执行计划也是一个dag. Spark可以在一个作业中完成非常复杂的大数据计算。

此外,这里有一张spark deg的示意图。

如图所示,ACE是从HDFS上加载的。

Rdda经过group by分组统计转化函数后,得到RDDBC,经过map转化函数后,得到RDDDD和e经过union合并转化函数后,得到了RDDFB和f经过join连接转化函数后,得到了最终的结果。

Rddg spark虽然比MARDUCE快很多,但是在大多数的场景下,计算耗时依然是分钟级别的。

这种计算一般成为大数据批处理计算。

而在实际应用中,有些时候需要在毫秒级完成不断输入的海量数据的计算处理。

比如实时的对摄像头采集的数据进行监控分析。

这就是所谓的大数据流计算。

早期呢比较著名的流式大数据计算引擎是storm.后来,随着spark的火爆,spark上的流式计算引擎spark streaming也逐渐流行起来。

Spark streaming的架构原理是将实时流入的数据切分成小的一批一批的数据,然后将这些小的一批数据交给spark上执行。

由于数据量比较小,spark streaming由常驻系统不需要重新启动,因此可以毫秒级完成计算。

看起来啊就像是实时计算一样。

最近几年比较流行的大数据引擎flink,其架构原理其实和spark streaming很相似。

随着数据源的不同,根据数据量和计算场景的要求,可以灵活适用流计算和批处理计算。

大数据技术可以说是分布式技术的一个分支,都是面临大量的计算压力。

采用分布式服务器集群的方案,解决问题差别是大数据技术要处理的数据具有关联性,所以需要有一个中心服务器进行管理。

Name、 node、 job、 cheker都是这样中心服务吧,最后给你留一道思考题吧。

Circle生成MAP reduce计算的时候,如果遇到join这样的cirl l操作mac函数和reduce函函如何设计?你可以看一下cirl l和输输数数据。

以此为例,思考一下吧,欢迎你把这篇文章分享给您的朋友或者同事一交流进步一下吧。