想玩转工业界机器学习?先学Spark吧

为什么机器学习者需要学习spark?

关于大数据,有这样段话:

“Big data is like teenage sex,everyone talks about it,nobody really knows how to do it,everyone thinks everyone else is doing it,so everyone claims they are doing it.”

作为一名学生,如何还没听说过Spark这套计算框架,那么我觉得还是留在学术界的机器学习混吧,工业界现在也许还不适合你。

在学术界,数据一般都是别人处理好的公开数据集,而我们只是在上面实践学术界的算法,在工业界可没人给你把业务数据都给你准备好...

众所周知,机器学习和统计学技术是把大数据转化为行为知识的关键技术,此外,机器学习者常言道:你能掌控的数据量决定了你模型最终所能达到效果上限,不断优化的模型只是为了不断的接近这个上限而已。

数据和算法之间的关联,一个是血液,一个是心脏。

信息时代,大部分顶层的互联网公司都积累了海量的数据,能掌控的数据量是你模型最终能接近最好效果的很重要的一个要素之一,对于工业界的业机器学习算法工程师,除了明白学术界的机器学习原理、优化理论以及实现各种单机版小demo外…..要想真正的能解决实际的业务问题,那就必须具备处理、利用海量业务数据的能力,而Spark正是赋予我们掌控大数据能力的利器。

拥有的数据量,不等于你能掌控的数据量,学习Spark,赋予你掌控大数据的能力!

数据和算法之间的关联,一个是血液,一个是心脏。

看看相关职位的需求…..

工业界需要Spark

我曾经接触的两个公司的推荐部门都是基于scala(python)+spark+hadoop平台工作的,由此可见,Spark在机器学习的工业领域是非常重要的技能之一!

总之,想将来从事机器学习相关工作的朋友们,开始学Spark吧!

什么是spark?

Spark与大数据

Spark是继Hadoop之后的下一代分布式内存计算引擎,于2009年诞生于加州大学伯克利分校AMPLab实验室,现在主要由Databricks公司进行维护。是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台。

官方定义:spark是一个通用的大数据处理引擎,可以简单的理解为一个大数据分布式处理框架。

相比于传统的以hadoop为基础的第一代大数据技术生态体系来说,Spark性能更好(快速)、可扩展性更高(技术栈)。

Spark的特点

前辈hadoop

2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce。到现在的10个年头,这个单词代表的是“核心”(即Core Hadoop项目)以及与之相关的一个不断成长的生态系统。这个和Linux非常类似,都是由一个核心和一个生态系统组成。

Hadoop发展历程

现在Hadoop在一月发布了2.7.2的稳定版, 已经从传统的Hadoop三驾马车HDFS,MapReduce和HBase社区发展为60多个相关组件组成的庞大生态,其中包含在各大发行版中的组件就有25个以上,包括数据存储、执行引擎、编程和数据访问框架等。

Hadoop在2.0将资源管理从MapReduce中独立出来变成通用框架后,就从1.0的三层结构演变为了现在的四层架构:

Hadoop的框架

  • 底层——存储层,文件系统HDFS
  • 中间层——资源及数据管理层,YARN以及Sentry等
  • 上层——MapReduce、Impala、Spark等计算引擎
  • 顶层——基于MapReduce、Spark等计算引擎的高级封装及工具,如Hive、Pig、Mahout等等

有了Hadoop为什么还需要spark?

肯定Spark有比Hadoop的MR计算更好的优势,好在如下方面:

(1)为什么高效?

1、相对于Hadoop的MR计算,Spark支持DAG,能缓存中间数据,减少数据落盘次数;

2、使用多线程启动task,更轻量,任务启动快。计算速度理论上有10-100倍提升。(根据个人工作验证,计算效率相对Hadoop至少是3倍以上)

3、高度抽象API,代码比MR少2-5倍甚至更多,开发效率高

(2)为什么多框架整合?

相对于过去使用Hadoop + Hive + Mahout + Storm 解决批处理、SQL查询和实时处理和机器学习场景的大数据平台架构,其最大的问题在于不同框架语言不同,整合复杂,同时也需要更多维护成本。

而使用Spark在Spark core的批处理基础上,建立了Spark Sql、Spark Streaming,Spark Mllib,Spark GraphX来解决实时计算,机器学习和图计算场景,方便将不同组件功能进行整合,同时维护成本小。

Spark与Hadoop对比

因为传统的hadoop的MapReduce具有高延迟的致命缺点,无法处理高时效性的数据。hadoop本身的计算模型就决定了,hadoop上的所有工作都需要转换为Map、Shuffle、Reduce等核心阶段,由于每次计算都需要从磁盘读写数据,同时整个模型都需要网络传输,这就导致了不可改变的延迟。而spark的出现,让hadoop也没有时间、也没有必要再重构自己。当然hadoop作为一个技术体系,spark主要是替代其Map/Reduce的功能,hadoop的HDFS功能还是被与spark结合起来使用。

Spark的特点

spark的成本

Spark 和 Hadoop MapReduce 都是开源的,但是机器和人工的花费仍是不可避免的。

Spark与Hadoop的硬件差异

Spark 集群的内存至少要和需要处理的数据块一样大,因为只有数据块和内存大小合适才能发挥出其最优的性能。所以如果真的需要处理非常大的数据,Hadoop 是合适之选,毕竟硬盘的费用要远远低于内存的费用。

考虑到 Spark 的性能标准,在执行相同的任务的时候,需要的硬件更少而运行速度却更快,因此应该是更合算的,尤其是在云端的时候,此时只需要即用即付。

spark之于Hadoop

更准确地说,Spark是一个计算框架,而Hadoop中包含计算框架MapReduce和分布式文件系统HDFS,Hadoop更广泛地说还包括在其生态系统上的其他系统,如Hbase、Hive等。Spark是MapReduce的替代方案,而且兼容HDFS、Hive等分布式存储层,可融入Hadoop的生态系统,以弥补缺失MapReduce的不足。

Spark与Hadoop在数据中间数据处理区别:

Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。Master作为整个集群的控制器,负责整个集群的正常运行;Worker相当于是计算节点,接收主节点命令与进行状态汇报;Executor负责任务的执行;Client作为用户的客户端负责提交应用,Driver负责控制一个应用的执行。

Spark调度模块

Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,Driver和Worker是两个重要角色。Driver程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。

下面详细介绍Spark的架构中的基本组件。

1、ClusterManager:在Standalone模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器。

2、Worker:从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。

3、Driver:运行Application的main()函数并创建SparkContext。

4、Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。

5、SparkContext:整个应用的上下文,控制应用的生命周期。

6、RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph。

7、DAG Scheduler:根据作业(Job)构建基于Stage的DAG,并提交Stage给TaskScheduler。

8、TaskScheduler:将任务(Task)分发给Executor执行。

9、SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。SparkEnv内创建并包含如下一些重要组件的引用。

10、MapOutPutTracker:负责Shuffle元信息的存储。

11、BroadcastManager:负责广播变量的控制与元信息的存储。

12、BlockManager:负责存储管理、创建和查找块。

13、MetricsSystem:监控运行时性能指标信息。

14、SparkConf:负责存储配置信息。

Spark的整体流程为:Client提交应用,Master找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。

Spark作业层次划分

Application就是用户submit提交的整体代码,代码中又有很多action操作,action算子把Application划分为多个job,job根据宽依赖划分为不同Stage,Stage内划分为许多(数量由分区决定,一个分区的数据由一个task计算)功能相同的task,然后这些task提交给Executor进行计算执行,把结果返回给Driver汇总或存储。

4.1、统计数据集中词频的例子

下面看一下使用Spark解决一个HelloWord入门级别的Spark程序代码,比写Hadoop里面的Map/Reduce代码简单多了....

# 统计单词的词频 val rdd = sc.textFile("/home/scipio/README.md") val wordcount = rdd.flatMap(_.split(' ')).map((_,1)).reduceByKey(_+_) val wcsort = wordcount.map(x => (x._2,x._1)).sortByKey(false).map(x => (x._2,x._1)) wcsort.saveAsTextFile("/home/scipio/sort.txt")

Spark执行过程

上图是一个Spark的wordcount例子,根据上述stage划分原则,这个job划分为2个stage,有三行,分别是数据读取、计算和存储过程。

仅看代码,我们根本体会不到数据在背后是并行计算。从图中能看出数据分布在不同分区(集群上不同机器上),数据经过flapMap、map和reduceByKey算子在不同RDD的分区中流转。(这些算子就是上面所说对RDD进行计算的函数),后面有空再介绍一下自己总结的Spark常用的算子以及Scala函数(https://www.jianshu.com/p/addc95d9ebb9)。

推荐Spark官网中文翻译版入门学习资料:http://spark.apachecn.org/docs/cn/2.2.0/sql-programming-guide.html

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王亚昌的专栏

分布式消息队列浅析

队列作为一种比较抽象的数据结构,在程序世界中被广泛的应用,而实现方式和形态也各式各样,有使用进程内堆栈实现的,如stl库中的queue;有基于管道、Shmem实...

1203
来自专栏ImportSource

NoSQL Sharding 分片

翻译内容: NoSQL Distilled 第四章 Distribution Models 作者简介: ? 本节摘要: 各位周末好,今天我们主...

35112
来自专栏沃趣科技

容器化RDS|调度策略

导 语 前文数据库容器化|未来已来我们介绍了基于Kubernetes实现的下一代私有 RDS。其中,调度策略是具体实现时至关重要的一环,它关系到RDS 集群的服...

38510
来自专栏Java技术交流群809340374

最新鲜的美团现场面试41题(三面技术+HR面):Redis+Kafka+分布式

互联网特别是电商平台,阿里双11秒杀、还有12306春运抢票、以及平时各种节假日抢购活动等,都是典型的高并发场景。

730
来自专栏腾讯云数据库(TencentDB)

如何设计和实现高可用的MySQL

王甲坤,腾讯高级工程师、腾讯云关系型数据库MySQL负责人,拥有多年客户端、数据库研发经验。在IOS客户端、MySQL、PostgreSQL、SQL Serve...

8.4K2
来自专栏北京马哥教育

为Hadoop集群选择合适的硬件配置

随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件。 尽管Hadoop被设计为运行在行业标准的硬...

2253
来自专栏Java技术

从分布式一致性谈到CAP理论、BASE理论!

在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景。

742
来自专栏腾讯云技术沙龙

王甲坤:如何设计和实现高可用的MySQL

下面开始我们今天的主要内容,今天主要是通过什么、为什么、怎么做,这条思路跟大家呈现MySQL的高可用。

2105
来自专栏即时通讯技术

IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。

964
来自专栏王亚昌的专栏

分布式消息队列浅析

一个优秀的分布式消息队列,个人分析应该具备以下的能力:高吞吐、低时延(因场景而异),传输透明,伸缩性强,有冗灾能力,一致性顺序投递,同步+异步的发送方式,完善的...

1924

扫码关注云+社区