基于python的web应用开发实战-flask web开发基于python的web应用开发实战
大家好,我是你们的好朋友Strones。 今天讲一下基于hadoop的大数据开发实战和spark_hadoop的简单应用实例,希望大家的编程造诣更上一层楼。
类别:《大数据与云计算》总目录
海量数据的存储问题由来已久,部分行业或部门由于历史积累,数据量已经达到一定程度。 很久以前,当一台计算机无法存储如此庞大的数据时,采用的解决方案是使用NFS(网络文件系统)将数据单独存储。 但这种方法不能充分利用多台计算机同时分析数据。
实际需求场景:日志分析
日志分析就是对日志中每个用户的流量进行汇总和求和。对于一个日志文件,如果只有几行数据,我们一般采用这种处理方式
读取一行日志,提取手机号和流量字段,加入到HashMap中,遍历输出结果
如果数据量变大,比如一个日志文件有好几GB的数据,还是一行一行的读取,那么效率就太低了,速度会因为系统的IO瓶颈而变慢磁盘。 如果一次性加载到内存中,由于单台计算机内存空间有限,会造成内存溢出。 如果所有的中间结果都缓存在HashMap中,也会因为单机内存空间有限而导致内存溢出。 你可以选择使用多线程处理,但仍然无法改变资源瓶颈的现实,因为一台计算机的CPU资源、内存资源、磁盘IO瓶颈是固定的,不管创建多少线程,这个现实不能改变。
方案一:纵向扩张
升级硬件,提高单机性能(增加内存,增强CPU,使用更高性能的磁盘(如固态硬盘)),比如购买IBM的高端服务器。这种方法简单易行,但扩展空间大单台电脑是有限的,CPU、内存、磁盘再怎么扩容,也不能无限扩容,另外,成本高,高端服务器往往很贵,动辄上百万或即便是几千万的服务器,普通的小公司也负担不起这么高的成本。
方案二:横向扩展:
使用多个节点进行分布式集群处理,通过增加节点数量来提高处理能力。 这里所说的节点是指一台计算机。 它的思想是任务共享,通过协作实现单个节点无法完成的任务基于python的web应用开发实战,成本相对较低(普通机器即可),易于线性扩展。 然而,系统的复杂性增加了。 我们需要在每个节点上部署我们的web应用,当多个节点协同工作时,我们必须考虑:如何调度资源,如何监控任务,如何调度中间结果,系统如何容错,如何实现许多节点之间的协调和其他问题。
Hadoop
Hadoop是一个开源的分布式文件系统和运行处理基础设施,可以运行在大规模集群上。 它专注于在廉价机器上构建的集群上存储和离线处理海量数据(结构化和非结构化)。 Hadoop是一种用于处理大数据的技术,用于解决上述分布式计算中的五个技术问题。
Hadoop 于 2005 年秋季由 Apache 软件基金会正式引入,作为 Lucene 的子项目 Nutch 的一部分。 它的灵感来自 MapReduce 和谷歌文件系统,最初由谷歌实验室开发。 2006 年 3 月,MapReduce 和 Nutch 分布式文件系统(NDFS)分别被合并到一个名为 Hadoop 的项目中。 Hadoop 是最流行的用于在 Internet 上针对搜索关键字对内容进行分类的工具,但它也可以解决许多需要极高可扩展性的问题。 例如,如果你想 grep 一个巨大的 10TB 文件会发生什么? 在传统系统上,这将花费很长时间。 但是Hadoop在设计时就考虑到了这些问题,所以它可以大大提高效率。
Hadoop的生态环境
Hadoop是一个能够分布式处理大量数据的软件框架。 它可靠、高效且可扩展。 Hadoop的核心是HDFS和Mapreduce,Hadoop2.0还包含了YARN。
HDFS(Hadoop 分布式文件系统)
HDFS(Hadoop Distributed File System)起源于Google的GFS论文,发表于2003年10月,HDFS是GFS的克隆。 它是Hadoop系统中数据存储管理的基础。 它是一个高度容错的系统,能够检测和响应硬件故障,设计用于在低成本通用硬件上运行。 HDFS简化了文件的一致性模型,通过流式数据访问提供高吞吐量的应用数据访问功能,适用于大数据集的应用。
YARN(又一个资源谈判者)
YARN 是一个 Hadoop 资源管理器。 是一个通用的资源管理系统,可以为上层应用提供统一的资源管理和调度。 益处。
#####Hadoop YARN生成背景
直接源于 MRv1 在几个方面的缺陷:
此外,多个计算框架各自为政,数据共享困难重重。 例如:MapReduce(离线计算框架)、Storm(实时计算框架)、Spark(内存计算框架)。
#####Hadoop YARN 基本架构
节点管理器
应用大师
Hadoop YARN 调度框架
Hadoop YARN 使用两层调度框架。 首先,RM为AM分配资源。 其次,AM进一步为每个Task分配资源。 YARN 不同于“全有或全无”策略 (Apache Mesos)。 它遵循基于资源预留的调度策略。 当资源不够时,会为Task预留,直到资源充足为止。
运行在 YARN 上的计算框架 MapReduce(分布式计算框架)
Hadoop MapReduce 是 google MapReduce 的克隆。
MapReduce 是一种用于计算大量数据的计算模型。 其中,Map对数据集上的独立元素进行指定操作,以键值对的形式产生中间结果。 Reduce 将中间结果中同一个“键”的所有“值”进行减法,得到最终结果。 MapReduce等功能划分非常适用于由大量计算机组成的分布式并行环境中的数据处理。
Hive(基于Hadoop的数据仓库)
Hive由facebook开源,最初用于解决海量结构化日志数据统计问题。 Hive 定义了一种类 SQL 查询语言(HQL),将 SQL 转换为 MapReduce 任务并在 Hadoop 上执行,通常用于离线分析。
HBase(分布式列存储数据库)
Hbae起源于Google的Bigtable论文,发表于2006年11月。HBase是Google Bigtable的克隆。 HBase 是一个可扩展、高可靠、高性能、分布式和面向列的结构化数据动态模式数据库。 与传统关系型数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中key由行关键字、列关键字和时间戳组成。 HBase 提供对大规模数据的随机、实时读写访问。 同时,存储在HBase中的数据可以使用MapReduce进行处理,将数据存储与并行计算完美结合。
HBase和Hive在大数据架构中处于不同的位置。 HBase主要解决实时数据查询问题,而Hive主要解决数据处理计算问题,一般配合使用。
Zookeeper(分布式协作服务)
来自 Google 的 Chubby 论文,发表于 2006 年 11 月,Zookeeper 是 Chubby 的克隆
解决分布式环境下的数据管理问题:统一命名、状态同步、集群管理、配置同步等。
Sqoop(数据同步工具)
Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之间的数据传输。 数据的导入导出本质上是一个Mapreduce程序,充分利用了MR的并行性和容错性。
Pig(基于 Hadoop 的数据流系统)
由 yahoo! 开源,设计动机是提供一个基于 MapReduce 的 ad-hoc(计算发生在查询中)数据分析工具。 它定义了一种数据流语言——Pig Latin,将脚本转换为MapReduce任务并在Hadoop上执行,通常用于离线分析。
火花
Spark是UC Berkeley AMPLab开发的计算框架,分布式资源的工作交给集群管理软件(Mesos、YARN)。
###Spark 功能
高效易用 提供整体解决方案 与Hadoop Spark整体架构无缝对接
Spark提供了多种高级工具,例如:用于Ad-hoc查询的Shark SQL、用于流式计算的Spark Streaming、用于机器学习的MLlib、用于图形处理的GraphX。 Spark也可以基于内置的独立集群管理器独立运行,也可以部署运行在Apache Mesos、Hadoop YARN等集群管理器上。 Spark 可以访问存储在 HDFS、Hbase、Cassandra、Amazon S3、本地文件系统等中的数据。Spark 支持文本文件、序列文件和任何 Hadoop InputFormat。
Spark 核心概念
Spark 任务提供了多层分解的概念。 Spark组件将用户应用分解为内部执行任务,并提供执行容器。 资源管理为spark组件提供资源管理和调度。
Spark任务Spark组件Executor资源管理组件Standalone(Spark自带):Master/Slave结构Spark端到端流程
Spark的Driver Program(简称Driver)包含用户的应用程序,Driver完成任务的解析和生成。
Driver向Cluster Manager(集群资源管理器)申请运行任务所需的资源。 集群资源管理器为任务分配满足要求的节点,并根据要求在节点上创建Executor。 创建的Executor向Driver注册。 Driver将Spark应用程序的代码和文件传递给指定的ExecutorExecutor运行任务,执行完成后将结果返回给Driver或写入HDFS或其他介质。
Spark ProcessSpark on Standalone
Master和Worker是Standalone的角色,Driver和Executor是Spark的角色。 Master负责分配资源,分配Driver和Executor,让Worker启动Driver和Executor。 它只管理到Executor层,不涉及任务。 Driver负责生成任务并与Executor通信,在不涉及资源的情况下调度任务和跟踪结果。
Driver 在 Worker 上运行
客户端将作业发布给 Master。 Master 要求 Worker 启动 Driver,并将工作推送给 Driver。 Driver 进程生成一系列任务。 Driver 向 Master 请求资源。 Master 让预定的 Worker 启动 Exector。 Exeuctor启动后,向Driver注册。 Driver将任务分派给Exeuctor执行。 Executor执行结果写入文件或返回DriverDriver在Client上运行
client启动后直接运行用户程序,启动DriverDriver进程生成一系列taskDriver向Master申请资源。 Master 让预定的 Worker 启动 Exector。 Exeuctor启动后,向Driver注册。 Driver将任务分派给Exeuctor执行。 Executor执行结果写入文件或返回DriverSpark核心组件
Spark的核心组件包括四个部分:RDD、Scheduler、Storage、Shuffle:
RDD(弹性分布式数据集)
RDD 是一种弹性分布式数据集,它是分区记录的只读集合。 每个 RDD 有 5 个主要属性:
作用于RDD的Operation分为transformation(转换)和action(action)。 Spark 中的所有“转换”都是惰性的。 当执行“转换”操作时基于python的web应用开发实战,不会提交作业。 只有在执行“action”操作时,所有的操作才会提交到集群真正执行。 这样可以大大提高系统性能。
RDD的操作比MR多,不仅包括Map和Reduce操作,还有右边的filter、sort、join、save、count等操作,所以Spark比MR更容易、更方便地完成更复杂的任务。
RDD持久化
默认情况下,每个转换后的 RDD 都会在对其执行操作时重新计算。 如果 RDD 只使用一次或很少使用,则不需要持久化。 持久化只有在 RDD 被重用或者计算开销大的情况下才会考虑。 另外,shuffle后产生的RDD要尽可能持久化,因为shuffle的成本太高了。 RDD被缓存后,Spark会在集群中保存相关的元数据。 下次查询该RDD时,无需计算,访问速度会更快。如果持久化了不必要的RDD,会浪费内存(或硬盘)空间,但会降低系统整体性能
RDD依赖
RDD 只能基于对稳定物理存储中的数据集和其他现有 RDD 执行的确定性操作来创建。 之所以可以通过确定操作从其他RDD创建新的RDD,是因为RDD包含从其他RDD派生(即计算)的相关信息(即Lineage)。 Dependency表示RDD之间的依赖关系,即lineage,分为narrow dependencies和wide dependencies:
Spark根据不同的RDD依赖关系,将每个作业划分为不同的阶段,阶段与阶段之间的依赖关系形成DAG图。 对于窄依赖,Spark尽可能将它们划分到同一个stage,因为它们可以进行流水线计算,而宽依赖往往意味着shuffle操作,这也是Spark的stage划分的主要边界。
wide/narrow dependency 的概念不仅用于阶段划分,而且对于容错也很有用。 如果Transformation操作中间有一次计算失败,如果操作是窄依赖的,只需要重新计算丢失的父RDD分区,不存在对其他节点的依赖,可以大大加快场景还原的代价。 但是,如果操作是宽依赖的,则需要父RDD的所有分区都存在,重新计算的成本很高。 当Lineage特别长或者依赖范围很广时,会主动调用checkpoint将当前数据作为checkpoint写入稳定存储。
调度器
Scheduler模块作为Spark的核心模块之一,充分体现了Spark与MapReduce的区别,体现了Spark DAG思想的精妙和设计的优雅。 Scheduler模块分为两个主要部分,DAGScheduler和TaskScheduler。
DAGScheduler将一个spark job转化为stage DAG(Directed Acyclic Graph),根据RDD与stage的关系找到开销最小的调度方式,然后将stage以TaskSet的形式提交给TaskScheduler。 TaskScheduler模块用于与DAGScheduler交互,负责任务的具体调度和运行。 任务调度模块基于两个特征:TaskScheduler 和 SchedulerBackend。
贮存
Storage模块主要分为两层:
Storage模块提供了一个统一的操作类BlockManager,外部类需要调用BlockManager的相应接口来处理存储模块。 访问Storage模块的最小单位是数据块(Block),Block对应RDD中的Partition,所以所有的转换或者action操作最终都是在Block上进行的。
洗牌
Shuffle中Map任务产生的结果会按照设定的partitioner算法填充到当前执行该任务的机器的各个bucket中。 Reduce任务启动时,会根据任务的ID、所依赖的Map任务的ID、MapStatus,从远程或本地的BlockManager获取相应的数据作为输入进行处理。 Shuffle数据必须持久化到磁盘,不能缓存到内存中。
在 Spark 之上提供了四个应用程序库:
以上是对Hadoop和Spark的一些简单介绍。 事实上,解决与大数据处理相关的问题往往需要数据采集(Flume、Kafka、Sqoop)、数据存储(HDFS、HBase)、资源管理(YARN)、计算(MapReduce、Spark)、数据分析(Pandas、NumPy、 R)、数据可视化(Echart、Tableau)等。每个环节都有对应的工具。 Hadoop和Spark是大数据处理过程中非常常用的两个框架。