星星之火,可以燎原

Spark简介

Spark是一个开源的计算框架平台,使用该平台,数据分析程序可自动分发到集群中的不同机器中,以解决大规模数据快速计算的问题,同时它还向上提供一个优雅的编程范式,使得数据分析人员通过编写类似于本机的数据分析程序即可实现集群并行计算。

Spark项目由多个紧密集成的组件组成。核心是Spark Core组件,它实现了Spark的基本功能,包括:任务调度、内存管理、错误恢复、与存储系统交互等模块,特别的,Spark Core还定义了弹性分布式数据集(RDD)的API,是Spark内存计算与并行计算的主要编程抽象。

在Spark Core上有一系列软件栈,用于满足了各种不同数据分析计算任务需求,包括连接关系型数据库或Hadoop Hive的SQL/HQL的查询组件Spark SQL,对实时数据进行流式计算的组件Spark Steaming,支持常见机器学习算法并行计算组件MLlib,支持并行图计算组件GraphX等。

为了进一步支持在数千个计算节点上的伸缩计算,Spark Core底层支持在各种集群管理器上运行,包括Hadoop YARN、Apache Mesos,或者Spark自带的Standalone独立调度器。

Spark部署

安装Spark比较简单,只要在机器上配置好最新版JAVA环境,下载编译好的Spark软件包后即可在本地运行。当然,也可以根据具体环境,使用Maven编译需要的Spark功能。

Spark部署有两种方式,一是本地部署,二是集群部署。前者只需启动本地的交互式环境spark-shell.sh脚本即可,常用在本机快速程序测试,后者的应用场景更多些,具体根据集群环境不同,可部署在简易的Spark独立调度集群上、部署在Hadoop YARN集群上、或部署在Apache Mesos上等。

其中,Spark自带的独立调度器是最简单实现Spark集群环境的一种方式,只需在多台联网计算机上安装好Spark,然后在其中一台启动集群管理器(通过start-master.sh脚本),然后再在其他计算机上启动工作节点(通过start-slave.sh脚本),并连接到管理器上即可。

Spark编程

使用Spark编程,需要先在本机安装好Spark环境,然后启动Spark上下文管理器连接到本机(本地部署)或是集群上的集群管理器(集群部署),再使用Spark提供的抽象接口编程即可。

支持Spark的原生语言是Scala,一种支持JVM的脚本语言,可以避免其他语言在做数据转化过程的性能或信息丢失。但随着Spark项目的不断完善,使用Python和PySpark包、或者R和SparkR包进行Spark编程也都是不错的选择。

不论使用何种编程语言,使用Spark进行数据分析的关键在于掌握Spark抽象的编程范式,其基本流程包括4步:

  1. 初始化SparkContext。SparkContext即是Spark上下文管理器(也称为驱动器程序),它主要负责向Spark工作节点上发送指令并获得计算结果,但数据分析人员无需关注具体细节,只需使用SparkContext接口编程即可。

  2. 创建RDD。弹性分布数据集RDD是Spark在多机进行并行计算的核心数据结构,因此使用Spark进行数据分析,首先需使用SparkContext将外部数据读入到Spark集群内。

  3. 设计数据转化操作。即操作的结果是返回一个新的RDD,即在图计算中只是一个中间节点。类比于Hadoop的Map()映射算子,但又不仅于此,Spark还支持filter()过滤算子、distinct()去重算子、sample()采样算子,以及多个RDD集合的交差补并等集合操作。

  4. 设计数据执行操作。即操作的结果向SparkContext返回结果,或者将结果写入外部操作系统。类比于Hadoop的Reduce()算子,按某函数操作两个数据并返回一个同类型的数据,此外Spark还支持collect()直接返回结果算子、count()计数算子、take()/top()返回部分数据算子、foreach()迭代计算算子等操作。

Spark编程范式的本质是有向无环图方式的惰性计算,即当使用上述方式进行编程后,Spark将自动将上述RDD和转化算子转换为有向无环图的数据工作流,只有当触发执行算子时,才按需进行数据工作流的计算。此外,为进一步提高计算效率,Spark默认将在内存中执行,并自动进行内存分配管理,当然分析人员也可根据需求通过persist()算子将中间步骤数据显式的将内存数据持久化到磁盘中,以方便调试或复用。

在R环境下使用Spark实例

最新版的RStudio已经较完整的集成了Spark数据分析功能,可以在SparkR官方扩展接口基础上更方便的使用Spark,主要需要安装两个包,分别是sparklyr和dplyr。其中,sparklyr包提供了更简洁易用的Spark R编程接口,dplyr包提供了一个语法可扩展的数据操作接口,支持与主流SQL/NoSQL数据库连接,同时使数据操作与数据集数据结构解耦合,并且和Spark原生算子可基本对应。

若第一次运行,先在本机安装必要的包和Spark环境:

  1. install.package('sparklyr')
  2. install.package('dplyr')
  3. # 在本机自动安装Spark和hadoop环境,若已手动安装设定环境变量即可
  4. spark_install(version = "1.6.0", hadoop_version = "2.6")
  5. # 设定本机Spark环境变量
  6. Sys.setenv(SPARK_HOME='~/Library/Caches/spark/spark-1.6.0-bin-hadoop2.6')

之后运行下面的小例子,可以发现,除了需要初始化SparkContext、导入RDD数据和导出数据外,其他数据处理操作都与在本机做数据分析是一样的。

  1. library(sparklyr)
  2. library(dplyr)
  3. # 创建SparkContext并连接Spark自带的集群管理器,也可设置为本机环境,即master=‘local’
  4. sc <- spark_connect(master = '127.0.0.1:7077')
  5. # 将iris数据集读入到Spark中,得到RDD对象引用,在R中为dplyr的tbl通用数据框格式
  6. iris.spark <- copy_to(sc, iris)
  7. # dplyr数据链式操作,计算在Spark集群中完成,并将结果通过collect()返回至R内存变量中
  8. iris.r <- iris.spark %>%
  9. select(Sepal_Length, Species) %>%
  10. filter(Sepal_Length>5) %>%
  11. group_by(Species) %>%
  12. summarise(SL_mean=mean(Sepal_Length)) %>%
  13. arrange(SL_mean) %>%
  14. collect()

此外,除了dplyr接口外,sparklyr还封装了一套特征工程和常用机器学习算法,足以满足80%常见的数据分析与挖掘工作,至于剩余的20%定制算法或是流处理、图计算等任务,便需要了解更多高阶的Spark接口来实现了。


数据科学武林风起云涌,

随数据小虾米共闯江湖~

Spark入门实战的更多相关文章

  1. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  2. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  3. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  4. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  5. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  6. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  7. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

  8. Spark入门实战系列--4.Spark运行架构

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...

  9. Spark入门实战系列--5.Hive(上)--Hive介绍及部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Hive介绍 1.1 Hive介绍 月开源的一个数据仓库框架,提供了类似于SQL语法的HQ ...

  10. Spark入门实战系列--5.Hive(下)--Hive实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Hive操作演示 1.1 内部表 1.1.1 创建表并加载数据 第一步   启动HDFS ...

随机推荐

  1. javascript小程序——用嵌套循环来输出乘法口诀表

    在学习javascript过程中,一开始接触循环语句时一般拿乘法口诀表来练手,这里我将自己的练习贴在这里,希望能给和我一样的初学者些许帮助,也希望大神们能够不吝指教. 首先,来看一下乘法口诀表是什么样 ...

  2. 每天一个linux命令(50)--date命令

    在Linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date 命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参 ...

  3. 用CSS3 做的星体

    制作原理:在我的上一篇随笔中有详细的说明,由于这个方法制作的球,比较耗性能,就只做了3个小球,效果大家可以试验. <!DOCTYPE html><html><head l ...

  4. 用VUEJS做一个猫眼电影web app

    之前一直在学习原生js,可是发现原生js虽然很好,但是想实现一个稍微复杂一点的项目都很麻烦.直到遇见了vue.js,发现vue是真的很好用,而且很简洁,利用组件化开发能够快速做出项目,所以为了学习vu ...

  5. 使用Microsoft.ExceptionMessageBox.dll捕获WinForm程序中异常信息并弹窗显示

    WinForm程序开发中,在开发模式下对于异常的处理一般都是通过调试的方式来查找异常发生的未知与原因. 下面以“除数为0”的情况来具体说明. Button按钮事件如下: private void bu ...

  6. 巧用*_his表记录操作历史

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作.这样可以获取某个 ...

  7. React组件开发经典案例--todolist

    点开查看代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...

  8. C#:求1到100的和

    using System;public class Program    {        public static void Main()            {                ...

  9. Single Number leetcode

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  10. 剑指offer_数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...