补充内容:

Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数、Executor数、core数目的关系


spark 并行度设置 spark并发度_机器学习

输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block。默认情况下,一个block最大为128M。


当Spark读取这些文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般是将若干个Block合并成一个输入分片,称为 InputSplit,注意InputSplit不能跨越文件。随后将为这些输入分片生成具体的 Task。InputSplit与Task是 一一对应的关系。随后这些具体的Task每个都会被分配到集群上的某个节点的某个 Executor去执行。

  • 每个节点可以起一个或多个Executor。
  • 每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
  • 每个Task执行的结果就是生成了目标RDD的一个partiton



注意: 这里的core是虚拟的core而不是机器的物理CPU核,可以理解为就是Executor的一个工作线程。

而 Task被执行的并发度 = Executor数目 * 每个Executor核数。

至于partition的数目:


  • 对于数据读入阶段,例如sc.textFile,输入文件被划分为多少InputSplit就会需要多少初始Task。
  • 在Map阶段partition数目保持不变。
  • 在Reduce阶段,RDD的聚合会触发shuffle操作,聚合后的RDD的partition数目跟具体操作有关,例如repartition操作会聚合成指定分区数,还有一些算子是可配置的。

Spark插拨式资源管理



Spark支持Yarn,Mesos,Standalone三种集群部署模式,它们的共同点:Master服务(Yarn ResourceManager,Mesos master,Spark standalone)来决定哪些应用可以运行以及在哪什么时候运行,Slave服务(Yarn NodeManger)运行在每个节点上,节点上实际运行着Executor进程,此外还监控着它们的运行状态以及资源的消耗



Spark On Yarn的优势



1. Spark支持资源动态共享,运行于Yarn的框架都共享一个集中配置好的资源池



2. 可以很方便的利用Yarn的资源调度特性来做分类·,隔离以及优先级控制负载,拥有更灵活的调度策略



3.Yarn可以自由地选择executor数量



4.Yarn是唯一支持Spark安全的集群管理器,使用Yarn,Spark可以运行于Kerberized Hadoop之上,在它们进程之间进行安全认证 


        当在Spark On Yarn模式下,每个Spark Executor作为一个Yarn container在运行,同时支持多个任务在同一个container中运行,极大地节省了任务的启动时间。




        在Yarn中,每个application都有一个Application Master进程,它是Appliaction启动的第一个容器,它负责从ResourceManager中申请资源,分配资源,同时通知NodeManager来为Application启动container,Application Master避免了需要一个活动的client来维持,启动Applicatin的client可以随时退出,而由Yarn管理的进程继续在集群中运行。



        在Yarn-cluster模式下,driver运行在Appliaction Master上,Appliaction Master进程同时负责驱动Application和从Yarn中申请资源,该进程运行在Yarn container内,所以启动Application Master的client可以立即关闭而不必持续到Application的生命周期



Yarn-cluster模式下作业执行流程:



1. 客户端生成作业信息提交给ResourceManager(RM)



2. RM在某一个NodeManager(由Yarn决定)启动container并将Application Master(AM)分配给该NodeManager(NM)



3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver



4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor



5. Executor向NM上的Application Master注册汇报并完成相应的任务


        在 Yarn-client 中,Application Master仅仅从Yarn中申请资源给Executor,之后client会跟container通信进行作业的调度



Yarn-client模式下作业执行流程:



1. 客户端生成作业信息提交给ResourceManager(RM)



2. RM在本地NodeManager启动container并将Application Master(AM)分配给该NodeManager(NM)



3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver



4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor



5. Executor向本地启动的Application Master注册汇报并完成相应的任务





RDD:Resilient Distributed Dataset,弹性分布式数据集。一个RDD代表一系列的“记录”(严格来说,某种类型的对象)。这些记录被分配或分区到一个集群的多个节点上。Spark中的RDD具有容错性,即当某个节点或任务失败时,RDD会在余下的节点上自动重建,以便任务能最终完成。



  • 分布在集群中的只读对象集合(由多个Partition构成)
  • 可以存储在磁盘或内存中(多种存储级别)
  • 通过并行“转换”操作构造
  • 失效后自动重构

Spark编程模型

spark 并行度设置 spark并发度_机器学习_02

    SparkContext类与SparkConf类:

    任何Spark程序的编写都是从SparkContext(或用Java编写时的JavaSparkContext)开始的。SparkContext的初始化需要一个SparkConf对象,后者包含了Spark集群配置的各种参数。初始化后,便可用SparkContext对象所包含的各种方法来创建和操作分布式数据集和共享变量。

    弹性分布式数据集RDD:

        RDD可从现有的集合创建,也可以基于Hadoop的输入源创建。基于Hadoop的RDD可以使用任何实现了Hadoop InputFormat接口的输入格式。

        在Spark编程模式下,所有的操作被分为转换(transformation)和执行(action)两种。一般来说,转换操作是对一个数据集里的所有记录执行某种函数,从而使记录发生改变;而执行通常是运行某些计算或聚合操作,并将结果返回运行SparkContext的那个驱动程序。

    Spark的操作通常采用函数式风格。Spark程序中最常用的转换操作便是map操作。该操作对一个RDD里的每一条记录都执行某个函数,从而将输入映射称为新的输出。“=>”是Scala下表示匿名函数的语法。匿名函数指那些没有指定函数名的函数。Spark的大多数操作都会返回一个新RDD,但多数的执行操作则是返回计算的结果,值的注意的是,Spark中的转换操作是延后的。也就是说,在RDD上调用一个转换操作并不会立即出发相应的计算。相反,这些转换操作会链接起来,并只在有执行操作被调用时才被高效地计算。

    RDD缓存策略

        Spark最为强大的功能之一便是能够把数据缓存在集群的内存里。这通过调用RDD的cache函数来实现:rddFromTextFile.cache。调用一个RDD的cache函数将会告诉Spark将这个RDD缓存在内存中。在RDD首次调用一个执行操作时,这个操作对应的计算会立即执行,数据会从数据源里读出来并保存到内存。因此,首次调用cache函数所需要的时间会部分取决于Spark从输入源读取数据所需要的时间。但是,当下一次访问数据集的时候,数据可以直接从内存中读出从而减少低效的I/O操作,加快计算。

                通过persist函数可以指定Spark的数据缓存策略。

    广播变量和累加器

        广播变量(broadcast variable)为只读变量,它由运行SparkContext的驱动程序创建后发送给会参与计算的节点。Spark下创建广播变量只需在SparkContext上调用一个方法即可:

                    val broadcastAList = sc.broadcast()

        广播变量也可以被非驱动程序所在的节点(即工作节点)访问,访问的方法是调用变量的value方法。

        通常只在需将结果返回到驱动程序所在的节点以供本地处理时,才调用collect函数。collect函数一般仅在的确需要将整个结果集返回驱动程序并进行后续处理时才有必要调用。

        累加器(accumulator)也是一种被广播到工作节点的变量。累加器与广播变量的关键不同,是后者只能读取而前者却可累加。但支持的累加操作有一定的限制。具体来说,这种累加必须是一种有关量的操作,即它得能保证在全局范围内累加起来的值能被正确地并行计算以及返回驱动程序。每一个工作节点只能访问和操作其自己本地的累加器,全局累加器则只允许驱动程序访问。累加器同样可以在Spark代码中通过value访问。

每个Spark程序都是有一个Driver和多个Executor构成的,它们实际上都是一个进程,Driver会把应用程序分解为多个Task,Task是一个线程。

正文:


设计机器学习系统

现代的大数据场景包含如下需求:

  1.     必须能与系统的其他组件整合,尤其是数据的收集和存储系统、分析和报告以及前端应用。
  2.     易于扩展且与其他组件相对独立。理想情况下,同时具备良好的水平和垂直可扩展性
  3.     支持高校完成所需类型的计算,即机器学习和迭代式分析应用
  4.     最好能同时支持批处理和实时处理。

个性化与推荐:

    推荐(recommendation)从根本上说是个性化的一种,常指向用户呈现一个他们可能感兴趣的物品列表。

    推荐通常专指向用户显式地呈现某些产品或内容,而个性化有时也偏向隐式。

目标影响和客户细分:

    一般来说,推荐和个性化的应用场景都是一对一,而客户细分则试图将用户分成不同的组。其分组根据用户的特征进行,并可能参考行为数据。

预测建模与分析

机器学习模型的种类:监督学习:使用已标记数据来学习;无监督学习:学习过程中不需要标记数据。

        数据获取与存储

            文件系统,如HDFS、Amazon S3等

            SQL数据库,如MySQL或PostgreSQL

            分布式NoSQL数据存储,如HBase、Cassandra和DynamoDB;

            搜索引擎,如Solr和Elasticsearch;

            流数据系统,如Kafka、Fluma和Amazon Kinesis。

        数据清理与转换:大多数机器学习模型所处理的都是特征(feature)。

            预处理过程可能包括:数据过滤,处理数据缺失、不完整或有缺陷,处理可能的异常、错误和异常值,合并多个数据源,数据汇总。

             数据转换和特征提取时常见的挑战有以下情况:

                将类别数据编码为对应的数值表示;

                从文本数据提取有用信息;

                处理图像或是音频数据;

                数值数据常被转换为类别数据以减少某个变量的可能值的数目,如数值分段;

                对数值特征进行转换,如对数值变量应用对数转换;

                对特征进行正则化、标准化,以保证同一模型的不同输入变量的值域相同;

                特征工程是对现有变量进行组合或转换以生成新特征的过程,如求平均值。

        模型训练与测试回路:当数据已转换为可用于模型的形式,便可开始模型的训练和测试。在训练数据集上运行模型并在测试数据集上测试其效果,这个过程一般相对直接,被称作交叉验证(cross-validation)。Spark内置的机器学习库MLlib能够胜任这一阶段的需求。

        模型部署与整合

        模型监控与反馈

            模型反馈(model feedback),指通过用户的行为来对模型的预测进行反馈的过程。

        批处理或实时方案的选择:

            Spark提供了实时流处理组件Spark Streaming    

    实践中还需要考虑的方面有:

        需要哪些数据源;数据格式应该如何;数据收集、处理、可能进行的汇总以及存储的频率;使用何种存储以保证可扩展性。

参考内容:

知乎:https://www.zhihu.com/question/33270495?sort=created

知乎:https://www.zhihu.com/question/33270495/answer/93424104,作者:王燚光

云栖社区:https://yq.aliyun.com/articles/368691