定义

专为大规模数据处理而设计的快速通用的计算引擎,并形成一个高速发展应用广泛的生态系统。

特点

  • 速度快
    • 内存计算下,Spark 比 Hadoop 快100倍
  • 易用性
    • 80多个高级运算符
    • 跨语言:使用Java,Scala,Python,R和SQL快速编写应用程序。
  • 通用性

    • Spark 提供了大量的库,包括SQL、DataFrames、MLib、GraphX、Spark Streaming。
    • 开发者可以在同一个应用程序中无缝组合使用这些库。

      支持多种资源管理器

      Spark 支持 Hadoop YARN,Apache Mesos,及其自带的独立集群管理器

      生态组件丰富与成熟

  • spark streaming:实时数据处理

  • shark/sparkSQL:用sql语句操作spark引擎
  • sparkR:用R语言操作Spark
  • mlib:机器学习算法库
  • graphx:图计算组件

在Hadoop生态圈中位置

在hadoop生态圈中位置
image.png
在spark生态圈
image.png

就业前景

  • 成熟度相比于hadoop还差一些,但自身迭代和生态圈发展很快。
  • 业务对实时性要求日渐增高,各大公司和小公司都在积极调研转向spark,都需要懂spark、用spark的人
  • Spark特别适合于迭代运算比较多的机器学习算法,而机器学习正在如火如荼发展中。
  • Spark未来可能会取代MapReduce,但与Hadoop仍会友好共生。
  • 基于内存计算是最大优势,而内存瓶颈会越来越少,故Spark的爆发点还有很大空间。
  • 总结:岗位需求量和发展前景都很广阔,是未来3-5年的技术应用最大热门。

Scala

  • 语言介绍
    • 多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
    • 运行在 Java 虚拟机上,并兼容现有的 Java 程序。
    • 源代码被编译成 Java 字节码文件,运行于 JVM 之上,并可以调用 现有的 Java 类库
  • 语言特点
    • 面向对象特性
      • 一种纯面向对象的语言,每个值都是对象
    • 函数式编程
      • 函数式语言,其函数也能当成值来使用。
      • 提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。
    • 静态类型
      • 具备类型系统,通过编译时检查,保证代码的安全性和一致性。
      • 像 scala,java,c/c++,c#,golang 等属于静态类型。
      • 像 python,ruby,javascript 等属于动态语言。
    • 扩展性
      • 提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构。
    • 并发性
      • 其并没有在底层对语言的并发性做更新升级。
      • 使用 Actor 作为其并发模型

应用前景

  • 技术方面
    • 完全兼容 Java,运行于 JVM 虚拟机之上。
    • 支持函数式编程和类型推断
    • 结合面向过程和面向对象,并保证代码简洁及优雅
    • 开发工具 IDE 非常成熟
  • 应用方面
    • LinkedIn/Twitter/英国卫报等众多企业已全面生产应用 Scala, 或替换 Java 代码。
    • spark/kafka 等大数据开发组件的巨大爆发力,使 Scala 为国内 所热捧。

基础语法

基本概念
o 对象:类的一个具体实例,对象包含属性和方法,如旺财有属性
毛色和看家本领能力。
o 类:类是对象的抽象,对象是类的一个实例。
o 方法:描述类所拥有的行为能力,一个类可以拥有多个方法。
o 属性:也称字段,即每个对象拥有它自身实例变量集合,通过赋
值来创建真正的属性值。

  • 基本语法
    • 区分大小写
    • 类名:首字母要大写,如 class HelloWorld{},class Person{},class Student{},也称大驼峰
    • 方法名称:首字母小写,从第 2 个单词开启的首字段大写,如 def toString(),def getName(),即为小驼峰
    • 程序文件名:保持与类名或对象名一致,区分大小写,以 “.scala”来结尾。
    • 主程序入口:def main(args: Array[String]) ,scala 若要独立运行 必须从 main 方法开始处理,每个 scala 强制程序入口。
  • 标识符
    • 兼容 java 标识符命名规范
    • 命名规范:类为大驼峰,其它为小驼峰
    • 多符号命名:可以加入“$,+,++,<“等符号参与命名,注意首字 符和尾字符的若干限制,如”$”不要作为开头,”_”不要作为结 尾。
    • 有新增关键字,如 yield 成为 scala 新关键字,则在 scala 调用 时,则应由 Thread.yield()改成 Thread.yield来使用。
  • 关键字
    • 以下为保留关键字,不要以关键字作为变量命名image.png
  • 注释
    • 兼容 Java 注释,支持单行和多行
    • 支持多行注释的嵌套结构
  • 换行符
    • 面向行编程的语言,每行语句可以用显式的”;”来结尾,或者以回 车换行来结尾。即末尾的”;”是可选的。
    • 如果一行中包括多个语句,则必须用”;”来分隔。
  • 包定义

    • 兼容 java 包方式,如 package com.tl.utils;
    • 类 c#的包定义方式
      1. package com.tl.test {
      2. class MyTest {
      3. }
  • 引用

    • 引入单个类:import java.util.Date;
    • 引入包下所有类:import java.util._;
    • 引入包下若干类(选择器):import java.util.{Date,HashSet,HashMap}
    • 引入类后重命名:import java.util.{Date => OldDate}
    • 隐藏包下的部分成员:import java.util.{Date=>,}
    • 默认包引入为:java.lang.、scala.、Predef._,默认引入的 包的情况下其内类的使用均不需要加上包名。

数据类型

  • 与 Java 相似部分(皆为对象类型,scala 无原生数据类型)
    • Byte,Short,Int,Long,Float,Double,Char,String,Boolean
  • 差异部分

    • Unit:即为空值或无值,与 Java 中的 void 等同。
    • Null:即为 null,即空引用
    • Nothing:是任何类型的子类型,在 scala 类层级的最末端
    • Any:是所有其它类的基(父)类
    • AnyRef:是所有引用类的基础,即除了值类型之外
    • AnyVal:是所有值类型的基类,包括 9 个值类型scala.Double
      1. scala.Float
      2. scala.Long
      3. scala.Int
      4. scala.Char
      5. scala.Short
      6. scala.Byte
      7. scala.Unit
      8. scala.Boolean
  • 数据类型的关系图image.png

  • 常见字面量
    • 整型字面量:如:0,1,0xff,07L
    • 浮点型字面量:0.0,3.14159f
    • 布尔型字面量:true 或者 false
    • 字符字面量:单引号括起来,如’a’,’b’,’\t’
    • 字符串字面量:双引号括起来,如”HelloWorld”,”MyName”
    • Null 值:是对引用对象类型的子类,不兼容值类型。

变量

  • 常量

    • 在程序运行过程中其值不会发生变化的量叫做常量。如:”A”、 “B”、”123”太丰富
    • 使用 val 来声明常量
      1. val constString:String="hero";
      2. constString="new_hero";
  • 变量

    • 在程序运行过程中其值可能发生改变的量叫做变量。如:对象的
    • 名称、年龄、发色、身材等
    • 使用 var 来声明变量
      1. var varString:String="name";
      2. varString="new_name";
  • 变量类型声明

    • 显式声明类型

      1. var variableName : DataType [= Initial Value]
      2. val constName: DataType [= Initial Value]
    • 隐式声明类型

      1. var myString="HelloWorld";
      2. var myInt=1;
    • 批量变量声明

      1. var a,b=10;
      2. println(a+b);

      访问修饰符

  • scala 访问修饰符包括 private,protected,public,对象的访问级别默认都是 public

    • private
      • 仅在包含了成员定义的类或对象内部可见
      • 在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员。
    • protected
      • 比 java 的 protected 更严格,除了子类可以访问,同包下的类是不能访问的
    • public
      • 跟 Java 完全一致
    • 作用域保护
      • 通过 private[x]或 protected[x]来实现,可以修饰包、类、单例 对象。
      • private[x],即为”这个成员除了对[…]中的类或[…]中的包中的 类及它们的伴生对像可见外,对其它所有类都是 private。
      • protected[x],即为”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是 protected。

运算符

  • 算术运算符
    • image.png
  • 关系运算符
    • image.png
  • 逻辑运算符
    • image.png
  • 位运算符
    • 常用位运算
      • 用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算image.png
  • 全部位运算符
    • image.png
  • 赋值运算符
    • image.png
  • 运算符优先级
    • image.png