Introduction of Spark

高性能计算与云计算是什么关系?spark能否用于高性能计算?

  1. 根据《2017全国高性能学术年会》(2017年会)中的PPT-《2017+TOP100排行榜+vFinal》,可以知道云计算集群也是HPC的一部分,云计算是HPC应用系统的重要组成部分。
  2. Ni et al. (2017),将商用的云计算集群,如(Amazon’s EC2)与专用HPC Cluster分开,但是没有进行直接的对比。另外,Ni et al. (2017)对比了spark与MPI,MPI的性能确实更好。但是spark在用户友好度,容错等方面具有很大优势。虽然spark不是性能最好的软件工具,然是也完全可以算作是高性能计算平台,特别是针对大数据处理的。总的来说,spark在效率与robustness方面达到了一个较好平衡。
    Ref: Ni, E.C., Ciocan, D.F., Henderson, S.G., Hunter, S.R., 2017. Efficient Ranking and Selection in Parallel Computing Environments. Operations Research 65(3), 821-836.

另外一个问题要提出,什么是HPC,HPC主要比较的是一个指标:PFLOTS。而且数据分析/机器学习2017年占据了56%的份额。除了CPU集群,现在的高性能集群更多的是异构集群,GPU集群,FPGA集群。spark如果光比较PFLOTS肯定是没有优势的,但是在云服务,大数据方面是有独特优势的。

Spark是大数据处理,和云计算的重要参与者。我这里主要利用的是其内存计算技术。另外,可以在case study里面show的是云计算。
Spark的优势:(1)内存计算技术:为了使程序运行更快,Spark提供了内存计算,减少了迭代计算时的IO开销;(2)DGA技术。
要了解spark,首先需要了解scala。所以,我们在附件1中对scala进行介绍。总结一下特性:(1)多范式,函数式,并发性好。(2)运行在JAVA虚拟机上,完全兼容java。(3)语法简洁。
Spark与Hadoop对比:(1)hadoop表达能力有限,所有的编程工作都是并行的,而事实上很多任务是并串混合的。(2)磁盘的I/O开销大。基于磁盘的运算。每次Map都把结果写入磁盘。(3)延迟高,每个任务都没严格的切分成两个阶段,必须等所有的Map结束后,Reduce才能启动。所以,难以胜任多阶段的计算任务。
相比于Hadoop,spark:(1)继承MapReduce的计算模式;同时,提供了除Map和Reduce以外的更多操作功能;groupby,fliter,等。(2)基于内存的计算;(3)DAG的任务调度机制。

scala是spark编程基础。

  1. 编程范式。
    1. 要提到编程范式,包括函数式与命令式。函数式编程范式对高并发系统可以获得很好的实时响应性,充分利用多核CPU并行处理能力。如果是命令式编程,对多核CPU不适应。命令式多线程之间有状态共享,很多个线程去访问同一个共享变量的时候,各个线程不能随便改,必须要保证这个共享变量的一致性。这个时候就需要锁机制来实现并发控制。线程只有拿到锁权限才能修改这个变量。锁机制解决了多个状态共享问题,但是降低的并发度。相反,函数式编程不需要在多个线程之间共享状态。因为它不修改变量,所以根本不存在”锁”线程的问题。Scala是多范式的编程语言。Java是单范式,是面向对象的命令式语言。Scala可以混合着使用,使用起来自由。Scala性能最好,不要做底层的变换。
    2. Scala是函数式语言,就是说函数也是一个值。函数在scala语言中具有最高的地位。
  2. Scala兼容Java程序,Hadoop用java开发,Spark这是用 cala开发。
  3. Scala完全面向对象,每个变量与操作都是对象。如a+b, 中的+就是一个方法。
  4. Scala编程的时候需要启动scala解释器,这是一个交互式执行环境,你往里面输入一个命令,返回一个结果。
  5. 语法特点
    1. 如何打印hello world? 单例对象。在单例对象里面定义入口函数main。入口函数里面定义println。所以scala与java不一样,java里面必须定义一个class,不需要定义object然后去实例化。写好后,必须要用scalac去编译。因为只要用了面向对象的概念,就必须要先编译一遍,先编译成java字节码,然后才能运行。如果没有object,可以直接用scala命令去运行。
      另外,文件名称与对象名称不要一致。
    2. 变量分为可变与不可变。数据类型string是自动继承java.lang.String这个包。所有数据类型都是类,声明int类型的变量时候实际是声明全称是scala.Int这个类的对象。特殊的字符串类型是直接用了java中的类。
    3. 在scala中所有加减乘除等操作符是类的方法。只是scal中可以进行简写。
    4. 富包装类,有些方法比如加减乘除是在基本类中定义好的,但是有些不是,比如求最大值max。max方法没有定义到scala.Int类中,一旦你调用max方法,自动转换成富包装类。
    5. Range在for loop中有用。
    6. 从控制台(键盘,屏幕)输入输出。输入用read为前缀的方法。这些方法属于scala.io.StdIn 包,必须import。输出用print,println,printf方法。Printf是C语言风格的方法。
    7. 从本地读写文件,java.io.PrintWriter Package. 读文件用scala.io.Source。
    8. 异常处理,scala不支持java中的checked exception, all exceptionis are treated as unchecked exception.
      Use “try-catch” to capture exceptions
    9. 数据结构;包含容器,which further includes list, set, map, Array. 与容器并行的是迭代器,元组。
    10. 容器可以分为有序与无序,可变与不可变。
    11. 迭代器不是collection。迭代器是帮助访问集合,利用迭代器中的方法去访问集合。
    12. 面向对象。Trait。
    13. 编译与执行:如果要编译的话,声明必须封装到对象中去。否则编译会出错。这里叫单例对象。
    14. getter与setter方法,私有变量
    15. 构造器