spark

1、spark架构设计

相关名词术语解释
1.RDD

弹性分布式数据集,数据集在spark上的一种抽象
只读,可分区的分布式数据集合
一个RDD 包含多个分区Partition
2.Partition

Partition 类似hadoop的Split中的block
划分依据很多:hash分区、范围分区、也可自己定义
一个partition交给一个task去计算处理
3.算子

op,即为映射、关系、变换
两大类:transformation和action
4.tansformation类算子

延迟计算,从一个RDD到另一个RDD转换,有action操作才会触发运算
5.Action类算子

触发spark提交作业,数据输出spark系统
6.窄依赖(一对一)
父rdd分区被一个子rdd分区使用

7.宽依赖(一对多)
父rdd分区被子rdd多个分区使用

8.Application

和MapReduce中的job或者yarn中的application类似
一般指整个Spark项目从开发、测试、布署、运行的全部。
9.Driver

驱动程序,main函数且创建sparkContext的程序
10.Cluster Manager

集群资源管理器,在集群上获取资源的服务
11.WorkerNode

集群中运行spark应用代码的节点
物理机器节点,可以启动Executor进程
12.Executor

Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立专享的一批Executor。
Executor资源容器,真正承载task的运行管理,以多线程运行task
13.Task

分配到executor上的基本工作单元,执行实际的计算任务。
Task分为两类,即为ShuffleMapTask和ResultTask。
ShuffleMapTask:即为Map任务和发生Shuffle的任务的操作,由Transformation操作组成,其输出结果是为下个阶段任务(ResultTask)进行做准备,不是最终要输出的结果。
ResultTask:即为Action操作触发的Job作业的最后一个阶段任务,其输出结果即为Application最终的输出或存储结果。
线程和进程的区别和联系

均代表了一部分资源和计算能力的抽象

进程比线程的范围要更高一级,进程是由线程组成的。即进程比线程要更重量级。

进程是操作系统进行资源分配的最小单元。

线程是操作系统任务执行、使用CPU的最小执行单元。

1.2 spark-shell
启动方式
spark-shell --master local[2]
以本地两个线程模拟运算spark相关操作,数量与本机的cpu核数一致最佳

相关参数
参数列表获取方式:spark-shell --help

1.3 开发和测试环境准备
1、初始化spark conf,包括 appname,master参数
2、构建java spark context
3、定义输入文件路径,本地或是hdfs均可
4、通过jsc.textFile()拿到文件路径对应的fileRDD,其内部是文本行形式,也可称为lineRDD
5、lineRDD => word rdd
6、word rdd => (word,1) rdd
7、(word,1) rdd => (word,freq) rdd
8、(word,freq) rdd => collect本地化数据
9、对本地化数据进行处理,比如打印
10、关掉上下文环境变量

public class SparkWordCount4Java {
  public static void main(String[] args) {
      /**
       *  * 1、初始化spark conf,包括 appname,master参数
       */
        SparkConf conf=new SparkConf();
        conf.setAppName("java-sparkwordcount-job019");
        conf.setMaster("local[2]");
        
          /**
         * 2、构建java spark context
           */
        JavaSparkContext jsc=new JavaSparkContext(conf);
        
          /**
         * 3、定义输入文件路径,本地或是hdfs均可
           */
        String filePath="file:C:/Users/USB/Desktop/SpackTest.txt";
        
          /**
         * 4、通过jsc拿到文件路径对应的fileRDD,其内部是文本行形式line形式, 也可称为lineRDD
           */
        JavaRDD<String> linesRDD=jsc.textFile(filePath);
        
          /**
         * 5、lineRDD => word rdd
           */
        JavaRDD<String> wordRDD=linesRDD.flatMap(new FlatMapFunction<String, String>() {

            @Override
            public Iterator<String> call(String line) throws Exception {
                return Arrays.asList(line.split(",")).iterator();
            }
            
        });
        
          /**
         * 6、word rdd => (word,1) rdd
           */
        JavaPairRDD<String,Integer> kvRDD=wordRDD.mapToPair(new PairFunction<String, String, Integer>() {

            @Override
            public Tuple2<String, Integer> call(String word) throws Exception {
                return new Tuple2<String,Integer>(word,1);
            }
            
        });
        
          /**
         * 7、(word,1) rdd => (word,freq) rdd
           */
        JavaPairRDD<String,Integer> wcRDD=kvRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {
            
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1+v2;
            }
        });
        
          /**
         * 8、(word,freq) rdd => collect本地化数据
           */
        List<Tuple2<String, Integer>> wcList=wcRDD.collect();
        
          /**
         * 9、对本地化数据进行处理,比如打印
           */
        for(Tuple2<String,Integer> tuple2:wcList){
            System.out.println(tuple2.toString());
        }
        
          /**
         * 10、关掉上下文环境变量
           */
        jsc.stop();
        
      
        System.out.println("done!!!");
}
}
1.4 三种运行方式
编写脚本运行
#! /bin/sh
# 配置成hadoop配置文件存放目录
export HADOOP_CONF_DIR=/usr/hdp/3.1.0.0-78/hadoop/conf/
spark-submit \
--class com.tl.job014.spark.SparkWordCount4Java \
--master local[2] \本地        
--master yarn-client \    集群方式yarn-client运行
--master yarn-cluster \    读取hdfs分布式文件系统
--driver-memory 512m \
--executor-memory 512m \
--num-executors 2 \
/home/zel/job014/FirstSparkWordCount4Java/FirstSpark4Java-jar-with-dependencies.jar \
file:///home/zel/job014/FirstSparkWordCount4Java/input.txt
#hdfs://cluster0.hadoop:8020/tmp/spark/input.txt


linux 本地方式
开发环境打包:跟之前的maven打包完全一致
编写Shell运行脚本:
注意修改代码中的setMaster代码,将之前代码设置注释掉
String filePath=“file:C:/Users/USB/Desktop/SpackTest.txt”; 改为动态传参
string filePath=null;
if(args==null || args.length!=1){
    System.out.println("输入有误,请检查!!");
    System.exit(-1);
}
filePath=args[0];

本地测试:打开setmaster 右击run as->run congigration->arguments->filePath:///…
测试完毕,关闭setmaster -> maven install

集群方式
注意输入路径,应改为hdfs等分布式文件系统的路径
yarn-client等于–master设置成yarn,deploy-mode设置成client

yarn-cluster
注意输入路径,应改为hdfs等分布式文件系统的路径
yarn-cluster等于–master设置成yarn,–deploy-mode设置成cluster

1.5 maven构建scala项目
搭建步骤

1)安装对应的maven构建scala的archetype

2)新建maven scala archetype项目

3)修改模板构建完成项目配置参数

4)运行模板自带的scala案例

5)自定义编程实现HelloWorld案例

6)package打包-不带依赖jar的打包

7)package打包-带依赖jar的all-in-one打包

在window运行jar

java -cp ./F...jar com....test
1
2.算子分析与应用
2.1 准换算子(不触发提交,提交后才启动转换计算)
value型:
输入输出一对一:map flatMap mapPartitions
输入输出多对一:union cartesian
输入输出多对多:groupBy
输出为输入子集:filter distinct subtract sample takeSample
cache型:cache persist

key-value型:
一对一:mapValues
单个RDD聚集:combineByKey reduceByKey partitionBy
两个RDD:cogroup
连接:join leftOutJoin rightOutJoin

2.2 行动算子(触发sparkContext提交作业)
无输出(不到hdfs、本地):foreach
HDFS:saveAsTextFile saveAsObjectFile
scala集合数据类型:collect collectAsMap reduceByKeyLocally lookup count
top reduce fold aggregate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值