tonglin0325的个人主页

Spark学习笔记——Spark on YARN

Spark运行的时候,采用的是主从结构,有一个节点负责中央协调, 调度各个分布式工作节点。这个中央协调节点被称为驱动器( Driver) 节点。与之对应的工作节点被称为执行器( executor) 节点

所有的 Spark 程序都遵循同样的结构:程序从输入数据创建一系列 RDD, 再使用转化操作派生出新的 RDD,最后使用行动操作收集或存储结果 RDD 中的数据。

1.驱动器节点:

Spark 驱动器是执行你的程序中的 main() 方法的进程。它执行用户编写的用来创建 SparkContext、创建 RDD,以及进行 RDD 的转化操作和行动操作的代码。其实,当你启动 Spark shell 时,你就启动了一个 Spark 驱动器程序

驱动器程序在 Spark 应用中有下述两个职责:1.把用户程序转为任务 2.为执行器节点调度任务

2.执行器节点:

Spark 执行器节点是一种工作进程,负责在 Spark 作业中运行任务,任务间相互独立。 Spark 应用启动时, 执行器节点就被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。

执行器进程有两大作用: 第一,它们负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程; 第二,它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。

3.集群管理器:

驱动器节点和执行器节点是如何启动的呢? Spark 依赖于集群管理器来启动执行器节点,而在某些特殊情况下,也依赖集群管理器来启动驱动器节点。

全文 >>

Spark学习笔记——键值对操作

键值对 RDD是 Spark 中许多操作所需要的常见数据类型

键值对 RDD 通常用来进行聚合计算。我们一般要先通过一些初始** ETL(抽取、转化、装载)**操作来将数据转化为键值对形式。

Spark 为包含键值对类型的 RDD 提供了一些专有的操作。

全文 >>

Spark学习笔记——RDD编程

1.RDD——弹性分布式数据集(Resilient Distributed Dataset)

RDD是一个分布式的元素集合,在Spark中,对数据的操作就是创建RDD转换已有的RDD调用RDD操作进行求值

Spark 中的 RDD 就是一个不可变的分布式对象集合。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。

1
2
3
4
5
6
7
8
9
10
11
object WordCount {
def main(args: Array[String]) {
val inputFile = "file:///home/common/coding/coding/Scala/word-count/test.segmented"
val conf = new SparkConf().setAppName("WordCount").setMaster("local")    #创建一个SparkConf对象来配置应用<br>    #集群URL:告诉Spark连接到哪个集群,local是单机单线程,无需连接到集群,应用名:在集群管理器的用户界面方便找到应用
val sc = new SparkContext(conf)        #然后基于这SparkConf创建一个SparkContext对象
val textFile = sc.textFile(inputFile)    #读取输入的数据
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)  #切分成单词,转换成键值对并计数
wordCount.foreach(println)
}
}

创建一个RDD

1
2
val textFile = sc.textFile(inputFile)

或者

1
2
val lines = sc.parallelize(List("pandas", "i like pandas"))

全文 >>

Scala学习笔记——函数和闭包

1.本地函数

可以在一个方法内再次定义一个方法,这个方法就是外部方法的内部私有方法,省略了private关键字

2.头等函数

1
2
3
var increase = (x: Int) => x + 1
System.out.println(increase(10))

集合类的foreach方法

1
2
3
var list1 = List(1, 2)
list1.foreach((x: Int) => println(x))

全文 >>

Spark学习笔记——在远程机器中运行WordCount

1.通过realy机器登录relay-shell

1
2
ssh XXX@XXX

2.登录了跳板机之后,连接可以用的机器

1
2
XXXX.bj

3.在本地的idea生成好程序的jar包(word-count_2.11-1.0.jar)之后,把jar包需要put到远程机器的hdfs文件系统中的文件通过scp命令从开发机传到远程的机器中

1
2
scp 开发机用户名@开发机ip地址:/home/XXXXX/文件 .    #最后一个.表示cd的根目录下

全文 >>

Ubuntu下安装HBase

1.在清华镜像站点下载hbase的安装文件,选择的是stable的版本,版本号是hbase-1.2.5/

2.解压放在/usr/local的目录下

3.修改权限

1
2
sudo chown -R hduser hadoop hbase-1.2.5/

4.修改文件夹的名称为hbase

5.在~/.bashrc下添加,之后source一下

1
2
export PATH=$PATH:/usr/local/hbase/bin

或者在 /etc/profile中添加

1
2
3
export HBASE_HOME=/usr/local/hbase
export PATH=${HBASE_HOME}/bin:$PATH

6.修改文件夹的权限

1
2
3
cd /usr/local
sudo chown -R hadoop ./hbase

7.测试一下是否安装成功

1
2
3
hbase version
HBase 1.2.5...

全文 >>

Scala学习笔记——内建控制结构

Scala的内建控制结构包括:if、while、for、try、match和函数调用

1.if表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
//常见的写法
var filename = "name"
if (!args.isEmpty)
filename = args(0)

//比较简洁的写法
var filename1 =
if (!args.isEmpty) args(0)
else "name"

//更简洁的写法,不要有中间变量
println(if(!args.isEmpty) args(0) else "name")

全文 >>

Scala学习笔记——函数式对象

用创建一个函数式对象(类Rational)的过程来说明

类Rational是一种表示有理数(Rational number)的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.scala.first

/**
* Created by common on 17-4-3.
*/
object Rational {
def main(args: Array[String]) {

var r1 = new Rational(1, 2)
var r2 = new Rational(1)
System.out.println(r1.toString)
System.out.println(r1.add(r2).toString)
var r3 = new Rational(2, 2)
System.out.println(r3)
System.out.println(r1 + r3)
}
}

class Rational(n: Int, d: Int) {
//检查先决条件,不符合先决条件将抛出IllegalArgumentException
require(d != 0)
//最大公约数
private val g = gcd(n.abs, d.abs)

private def gcd(a: Int, b: Int): Int = {
if (b == 0) a else gcd(b, a % b)
}

//进行约分
val numer: Int = n / g
val denom: Int = d / g

//辅助构造器
def this(n: Int) = this(n, 1)

//定义操作符
def +(that: Rational): Rational = {
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
}

//方法重载
def +(i: Int): Rational = {
new Rational(
numer + i * denom, denom
)
}

def *(that: Rational): Rational = {
new Rational(
numer * that.numer,
denom * that.denom
)
}

//方法重载
override def toString = numer + "/" + denom

//定义方法
def add(that: Rational): Rational = {
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
}

//定义方法,自指向this可写可不写
def lessThan(that: Rational): Boolean = {
this.numer * that.denom < that.numer * this.denom
}


}

全文 >>