spark学习笔记01
Spark入门
1、课程目标
1、熟悉spark相关概念
2、搭建一个spark集群
3、编写简单spark应用程序
2、spark概述
spark是什么
是基于内存的分布式计算引擎,计算速度非常快,仅仅只是涉及到数据的计算,没有涉及到数据存储。可以对接外部的数据源(比如hdfs,这个时候就需要搭建一个hadoop集群)
为什么要学习spark
spark运行速度快,由于中间数据结果可以不落地,直接保存在内存中,速度比mapreduce快很多
3、spark特性
速度快
spark比mapreduce在内存快100x,在磁盘中快10x
spark任务中间结果数据不可以不落地,直接保存在内存中
在mapreduce任务中,如果当前有100 task,对应的会产生多少个进程去运行? 100个,mapreduce是以进程的方式去运行任务
在spark任务中,如果当前有100个task,对应它只需要开启100个线程去运行就可以了,spark是以线程的方式运行任务。
易用性
可以快速编写spark应用程序,使用4种语言开发 java/scala/python/R
通用性
可以使用sparksql/sparkStreaming/Mlib/Graphx
兼容性
spark可以运行在不同平台里面
yarn 整个资源调度由resourcemanager
mesos apache开源的一个资源调度框架
standalone 整个资源调度由 master
4、spark集群安装
1、下载spark安装包
spark-2.0.2-bin-hadoop2.7.tgz
2、先规划安装目录
/export/servers
3、解压安装包
tar -zxvf spark-2.0.2-bin-hadoop2.7.tgz -C /export/servers
4、重命名安装目录
mv spark-2.0.2-bin-hadoop2.7 spark
5、修改配置文件
进入到spark安装目录下conf文件夹
修改spark-env.sh.template(先重命名)
mv spark-env.sh.template spark-env.sh
配置java环境变量
export JAVA_HOME=/export/servers/jdk
配置spark集群的master地址
export SPARK_MASTER_HOST=node1
配置spark集群的master端口
export SPARK_MASTER_PORT=7077
修改slaves.teamplate(先重命名)
mv slaves.template slaves
添加spark集群中的worker节点
node2
node3
6、配置spark环境变量
修改 /etc/profile
export SPARK_HOME=/export/servers/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
7、分发安装目录到其他节点
scp -r /export/servers/spark root@node2:/export/servers
scp -r /export/servers/spark root@node3:/export/servers
scp /etc/profile root@node2:/etc
scp /etc/profile root@node3:/etc
8、让所有节点的环境变量生效
在所有节点上执行命令
source /etc/profile
5、spark集群启动和停止
启动spark集群
$SPARK_HOME/sbin/start-all.sh
停止spark集群
$SPARK_HOME/sbin/stop-all.sh
6、spark的master web管理界面
访问地址
http://master的地址:8080
7、基于zk的sparkHA高可用集群
1、需要搭建一个zookeeper集群
2、需要修改配置
$SPARK_HOME/conf/spark-env.sh
1、注释掉手动指定的活着的master
#export SPARK_MASTER_HOST=node1
2、引入zk配置
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/spark"
3、启动sparkHA
先启动zookeeper
在任意一台机器上启动 start-all.sh(需要配置任意2台机器之间的免登陆)
当执行该脚本时候,它会在当前机器上产生一个master进程。
在slaves文件中,获取对应worker节点,然后在指定的主机上启动worker进程
可以在其他节点上单独启动master进程
start-master.sh
8、spark角色介绍
1、driver
就是运行main方法的进程,他会创建sparkContext
2、application
就是一个应用程序,它是包括driver的代码以及整个任务在计算时所需要的一些资源
3、Master
它是整个spark集群中的老大,它是负责任务的分配和资源调度
4、Worker
就是真正计算任务的节点
5、Executor
它是一个进程,会在worker节点启动运行任务
6、Task
它是spark集群中最小的工作单元,它是线程的方式运行在executor进程中
9、初识spark程序
1、普通模式提交(指定当前集群中活着的master地址)
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.0.2.jar \
1002、高可用模式提交
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077,node2:7077,node3:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.0.2.jar \
100
10、spark-shell使用
1、spark-shell --master local[2] 读取本地数据文件实现单词计数
local[N]
local表示本地运行,后面的数字N表示本地采用多少个线程去运行任务
local[*]
local表示本地运行,后面的* 表示使用当前机器上所有可用的资源
他会产生一个SparkSubmit进程。
sc.textFile("file:///root/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
2、spark-shell --master local[2] 读取HDFS数据文件实现单词计数
sc.textFile("hdfs://node1:9000/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
spark整合HDFS
需要修改spark-env.sh
export HADOOP_CONF_DIR=/export/servers/hadoop/etc/hadoop
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
3、spark-shell --master spark://node1:7077 读取HDFS数据文件实现单词计数
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
11、利用scala编写spark的wordcount程序(本地运行)
导入依赖
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
</dependency>
代码开发
package cn.itcast
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
//todo:利用scala实现spark的wordcount程序
object WordCount {
def main(args: Array[String]): Unit = {
//1、创建sparkconf 设置appName和master地址 local[2] 表示本地使用2个线程运行
val sparkConf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local[2]")
//2、创建sparkcontext,所有计算的源头,它会创建DAGScheduler和TaskScheduler
val sc = new SparkContext(sparkConf)
//3、读取数据文件
val data: RDD[String] = sc.textFile("D:\\words.txt")
//4、切分每一行
val words: RDD[String] = data.flatMap(_.split(" "))
//5、每个单词计为1
val wordAndOne: RDD[(String, Int)] = words.map((_,1))
//6、相同单词出现次数累加
val result: RDD[(String, Int)] = wordAndOne.reduceByKey(_+_)
//7、打印输出
val finalResult: Array[(String, Int)] = result.collect()
println(finalResult.toBuffer)
//关闭sc
sc.stop()
}
}
12、利用scala编写spark的wordcount程序(集群运行)
package cn.itcast
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
//todo:利用scala实现spark的wordcount程序(集群运行)
object WordCount_Online {
def main(args: Array[String]): Unit = {
//1、创建sparkconf 设置appName
val sparkConf: SparkConf = new SparkConf().setAppName("WordCount_Online")
//2、创建sparkcontext,所有计算的源头,它会创建DAGScheduler和TaskScheduler
val sc = new SparkContext(sparkConf)
//3、读取数据文件
val data: RDD[String] = sc.textFile(args(0))
//4、切分每一行
val words: RDD[String] = data.flatMap(_.split(" "))
//5、每个单词计为1
val wordAndOne: RDD[(String, Int)] = words.map((_,1))
//6、相同单词出现次数累加
val result: RDD[(String, Int)] = wordAndOne.reduceByKey(_+_)
//7、保存结果数据到HDFS上
result.saveAsTextFile(args(1))
//关闭sc
sc.stop()
}
}
提交脚本
spark-submit --class cn.itcast.WordCount_Online --master spark://node1:7077 --executor-memory 1g --total-executor-cores 2 original-spark_class04-2.0.jar /words.txt /2018
13、利用java编写spark的wordcount程序(本地运行)
package cn.itcast;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
//todo:利用java语言实现spark的wordcount程序
public class WordCount_Java {
public static void main(String[] args) {
//1、创建sparkconf对象
SparkConf sparkConf = new SparkConf().setAppName("WordCount_Java").setMaster("local[2]");
//2、创建javaSparkContext
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
//3、读取数据文件
JavaRDD<String> dataJavaRDD = jsc.textFile("d:\\words.txt");
//4、切分每一行
JavaRDD<String> wordsJavaRDD = dataJavaRDD.flatMap(new FlatMapFunction<String, String>() {
public Iterator<String> call(String line) throws Exception {
String[] words = line.split(" ");
return Arrays.asList(words).iterator();
}
});
//5、每个单词计为1
JavaPairRDD<String, Integer> wordAndOneJavaPairRDD = wordsJavaRDD.mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String, Integer>(word, 1);
}
});
//6、相同单词出现的次数累加
JavaPairRDD<String, Integer> resultJavaPairRDD = wordAndOneJavaPairRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
});
//按照单词出现的次数降序排列 需要把(单词,次数) 位置颠倒 (次数,单词)
JavaPairRDD<Integer, String> reverseJavaRDD = resultJavaPairRDD.mapToPair(new PairFunction<Tuple2<String, Integer>, Integer, String>() {
public Tuple2<Integer, String> call(Tuple2<String, Integer> t) throws Exception {
return new Tuple2<Integer, String>(t._2, t._1);
}
});
//按照单词出现的次数降序排列 需要把(次数,单词)位置颠倒(单词,次数)
JavaPairRDD<String, Integer> sortedRDD = reverseJavaRDD.sortByKey(false).mapToPair(new PairFunction<Tuple2<Integer, String>, String, Integer>() {
public Tuple2<String, Integer> call(Tuple2<Integer, String> t) throws Exception {
return new Tuple2<String, Integer>(t._2, t._1);
}
});
//7、打印结果
List<Tuple2<String, Integer>> finalResult = sortedRDD.collect();
for (Tuple2<String, Integer> tuple : finalResult) {
System.out.println("单词:"+tuple._1+" 次数:"+tuple._2);
}
//8、关闭
jsc.stop();
}
}
spark学习笔记01的更多相关文章
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- Spark学习笔记之SparkRDD
Spark学习笔记之SparkRDD 一. 基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ① 内存集合和外部存储系统 ② ...
- spark学习笔记总结-spark入门资料精化
Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...
- Spark学习笔记2(spark所需环境配置
Spark学习笔记2 配置spark所需环境 1.首先先把本地的maven的压缩包解压到本地文件夹中,安装好本地的maven客户端程序,版本没有什么要求 不需要最新版的maven客户端. 解压完成之后 ...
- Spark学习笔记3(IDEA编写scala代码并打包上传集群运行)
Spark学习笔记3 IDEA编写scala代码并打包上传集群运行 我们在IDEA上的maven项目已经搭建完成了,现在可以写一个简单的spark代码并且打成jar包 上传至集群,来检验一下我们的sp ...
- Spark学习笔记-GraphX-1
Spark学习笔记-GraphX-1 标签: SparkGraphGraphX图计算 2014-09-29 13:04 2339人阅读 评论(0) 收藏 举报 分类: Spark(8) 版权声明: ...
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
- Spark学习笔记0——简单了解和技术架构
目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...
- Spark学习笔记2——RDD(上)
目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...
随机推荐
- ELK学习总结(2-6)elk的mapping
1.什么是映射 映射:创建索引的时候,预先定义字段的类型及相关属性 作用:这样会让索引建立的更加细致和完善,如:是否存储.使用何种分析器.重要级别 分类:静态映射和动态映射 2.字段类型:string ...
- spring-oauth-server实践:使用授权方式四:client_credentials 模式下access_token做业务!!!
spring-oauth-server入门(1-10)使用授权方式四:client_credentials 模式下access_token做业务!!! 准备工作 授权方式四::客户端方式: 服务网关地 ...
- 新概念英语(1-31)Where's Sally?
新概念英语(1-31)Where's Sally? Is the cat climbing the tree ? A:Where is Sally, Jack ? B:She is in the ga ...
- EasyUI中datagrid的基本用法
EasyUI中datagrid是最常用的一个控件了,现在整理一下datagrid的基本语法,先展示下页面效果吧,如下图
- leetcode算法: Find Largest Value in Each Tree Row
'''You need to find the largest value in each row of a binary tree.Example:Input: 1 / \ 3 2 / \ \ 5 ...
- JavaScript的作用域链
/* js当中 每个函数都是一个执行环境 函数调用函数会进入新的执行环境结束之后再回来当前 作用域链: 在内部的作用域中可以访问和修改外部的变量 在外部作用域不能修改或者访问内部的变量 */ var ...
- 关于vertical-align和line-height的真知灼见
本文的重点是了解vertical-align和line-height的使用 涉及到的名词:基线,底端,行内框,行框,行间距,替换元素及非替换元素,对齐.只有充分理解这些概念才会灵活运用这两个属性. 什 ...
- 深入浅出Lua虚拟机
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:郑小辉 | 腾讯 游戏客户端开发高级工程师 写在前面:本文所有的文字都是我手工一个一个敲的,以及本文后面分享的Demo代码都是我一行一 ...
- POJ-1860 Currency Exchange---Bellman-Ford判断正环
题目链接: https://vjudge.net/problem/POJ-1860 题目大意: 我们的城市有几个货币兑换点.让我们假设每一个点都只能兑换专门的两种货币.可以有几个点,专门从事相同货币兑 ...
- 搭建ssm项目框架
[声明]转载注明链接,源码联系公众号:aandb7获取 [此处组织名groupId:com.dayuanit,可替换公司域名:项目名artifactid:...] 此处第二个配置文件选择maven安装 ...