一、定义与特点
- 定义
- 专为大规模数据处理而设计的快速通用的计算引擎,并形成一个高速发展应用广泛的生态系统。
- 特点
- 速度快
- 内存计算下,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:图计算组件
- 速度快
二、spark
- 在hadoop生态圈位置
1、Scala介绍
- 作者
- 联邦理工学院(EPFL)的 Martin Odersky,之前曾从事工作是 Generic Java 和 javac(Sun Java 编译器),并于 2001 年开始 设计 Scala。
- 语言介绍
- 多范式(multi-paradigm)的编程语言,设计初衷是要集成面向 对象编程和函数式编程的各种特性。
- 运行在 Java 虚拟机上,并兼容现有的 Java 程序。
- 源代码被编译成 Java 字节码文件,运行于 JVM 之上,并可以调用 现有的 Java 类库。
- 语言特点
- 面向对象特性
- 一种纯面向对象的语言,每个值都是对象
- 函数式编程
- 函数式语言,其函数也能当成值来使用。
- 提供了轻量级的语法用以定义匿名函数,支持高阶函数, 允许嵌套多层函数,并支持柯里化。
- 静态类型
- 具备类型系统,通过编译时检查,保证代码的安全性和一 致性。
- 像 scala,java,c/c++,c#,golang 等属于静态类型。
- 像 python,ruby,javascript 等属于动态语言。
- 扩展性
- 提供了许多独特的语言机制,可以以库的形式轻易无缝添 加新的语言结构。
- 并发性
- 其并没有在底层对语言的并发性做更新升级。
- 使用 Actor 作为其并发模型
- 面向对象特性
2、应用前景
- 技术方面
- 完全兼容 Java,运行于 JVM 虚拟机之上。
- 支持函数式编程和类型推断
- 结合面向过程和面向对象,并保证代码简洁及优雅
- 开发工具 IDE 非常成熟
- 应用方面
- LinkedIn/Twitter/英国卫报等众多企业已全面生产应用 Scala, 或替换 Java 代码。
- spark/kafka 等大数据开发组件的巨大爆发力,使 Scala 为国内 所热捧。
3、基础语法
- 基本概念
- 对象:类的一个具体实例,对象包含属性和方法,如旺财有属性 毛色和看家本领能力。
- 类:类是对象的抽象,对象是类的一个实例。
- 方法:描述类所拥有的行为能力,一个类可以拥有多个方法。
- 属性:也称字段,即每个对象拥有它自身实例变量集合,通过赋 值来创建真正的属性值。
- 基本语法
- 区分大小写
- 类名:首字母要大写,如 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`来使用。
- 关键字
- 以下为保留关键字,不要以关键字作为变量命名。
- 注释
- 兼容 Java 注释,支持单行和多行
- 支持多行注释的嵌套结构
- 换行符
- 面向行编程的语言,每行语句可以用显式的";"来结尾,或者以回 车换行来结尾。即末尾的";"是可选的。
- 如果一行中包括多个语句,则必须用";"来分隔。
- 包定义
- 兼容 java 包方式,如 package com.tl.utils; o
- 类 c#的包定义方式
- package com.tl.test {
- class MyTest {
- }
- package com.tl.test {
- 引用
- 引入单个类: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._,默认引入的 包的情况下其内类的使用均不需要加上包名。
4、数据类型
- 与Java相似部分(皆为对象类型,scala无原生数据类型) Byte,Short,Int,Long,Float,Double,Char,String,Boolea
- 差异部分:
- Unit:即为空值或无值,与 Java中的 void等同
- Null:即为 null,即空引用
- Nothing:是任何类型的子类型,在 scala类层级的最末端
- Any:是所有其它类的基(父)类
- AnyRef:是所有引用类的基础,即除了值类型之外
- AnyVal:是所有值类型的基类,包括 9个值类
5、变量
- 常量
- 在程序运行过程中其值不会发生变化的量叫做常量。
- 如:"A"、 "B"、"123"太丰富
- 使用 val 来声明常量
- val constString:String="hero";
- constString="new_hero";
- 在程序运行过程中其值不会发生变化的量叫做常量。
- 变量
- 在程序运行过程中其值可能发生改变的量叫做变量。
- 如:对象的 名称、年龄、发色、身材等 o
- 使用 var 来声明变量
- var varString:String="name";
- varString="new_name";
- 在程序运行过程中其值可能发生改变的量叫做变量。
- 变量类型声明
- 显式声明类型
- var variableName : DataType [= Initial Value] 或val constName: DataType [= Initial Value]
- 隐式声明类型
- var myString="HelloWorld";
- var myInt=1;
- 批量变量声明
- var a,b=10;
- println(a+b);
- 显式声明类型
6、修饰符
- scala访问修饰符包括private,protected,public,对象的访问级别默认都是public
- private:仅在包含了成员定义的类或对象内部可见,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员
- protected:比java的protected更严格,除了子类可以访问,同包下的类是不能访问的
7、运算符
- 包括 5 种运算符,即算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符