大数据学习27:Spark体系结构及全分布环境搭建及Word Count程序编写及原理分析

本文深入解析Spark的三大核心模块:SparkCore、SparkSQL和SparkStreaming,对比MapReduce,阐述Spark的特点与优势,包括其基于内存的高速计算能力,以及如何在不同部署模式下运行Spark任务,涵盖WordCount程序的实现与执行原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三部分的内容

1、Spark Core:内核,是Spark中最重要的内容,相当于MapReduce
               Spark Core和MapReduce都是进行离线计算
			   Spark Core的核心:RDD(弹性分布式数据集),由分区组成
			   
2、Spark SQL:相当于Hive、Pig
              支持SQL和DSL语句  -----> Spark任务(RDD) -----> 运行
			  
3、Spark Streaming:相当于Storm
                    本质:把连续的数据  -----> 不连续的数据DStream(离散流):本质就是RDD

Spark Core课程内容

一、什么是Spark
	1、为什么要学习Spark?讨论MapReduce的缺点不足
		(*)MapReduce的缺点不足:核心Shuffle---> 产生大量I/O
		(*)什么是Spark?http://spark.apache.org/
			 Apache Spark™ is a unified analytics engine for large-scale data processing. 
			
2、Spark的特点:基于内存
		(1)快
		(2)易用
		(3)通用
		(4)兼容性
		参考官网

二、Spark的体系结构与部署(重点)

1、体系结构:主从结构(单点故障)
	官网提供了一张图  http://spark.apache.org/docs/latest/cluster-overview.html

2、安装部署
	(1)伪分布
	(2)全分布
	
3、Spark HA:两种方式
	(1)基于文件目录: 用于开发测试
	(2)基于ZooKeeper:用于生产环境

三、执行Spark Demo程序

1、执行Spark任务的工具
	(1)spark-submit: 相当于 hadoop jar 命令 ---> 提交MapReduce任务(jar文件 )
	                   提交Spark的任务(jar文件 )
					   
	(2)spark-shell:类似Scala的REPL命令行,类似Oracle中的SQL*PLUS
	                  Spark的交互式命令行
					  
2、使用IDEA或者Scala IDE开发程序:WordCount
	(1)Java版本
	(2)Scala版本
package scala
import org.apache.spark.{SparkConf, SparkContext}
object MyWordCound {
  //   bin/spark-submit --class scala.MyWordCound scalajardemo.jar hdfs://10.1.255.132:9000/source/demo.txt hdfs://10.1.255.132:9000/20190515
  def main(args: Array[String]): Unit = {
    //创建任务配置信息
    //如果数组master= local 表示运行在本地模式上
    //如果运行在集群模式上,不需要设置master
    val conf = new SparkConf().setAppName("MyWordCount")/*.setMaster("local")*/

    //创建一个SparkContext对象
    var sc = new SparkContext(conf)

    //执行wordcount
    var result = sc.textFile(/*"hdfs://10.1.255.132:9000/source/reba.txt"*/ args(0))
      .flatMap(_.split(" "))
      .map((_,1))
      .reduceByKey(_+_)//.collect()

    //打印在屏幕上
   //result.foreach(println)
    //写入到hdfs中
     result.saveAsTextFile(args(1))

    //停止SparkContext
    sc.stop()


  }
}

本地模式:


package spark;

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;

public class SparkDemo {

    public static void main(String [] args){

        SparkConf conf = new SparkConf().setAppName("MyWordCount").setMaster("local");


        //SparkContext conf = new SparkContext();

        //创建一个SparkContext对象 JavaSparkContext对象
        JavaSparkContext sc = new JavaSparkContext(conf);

        //读入HDFS数据
        JavaRDD<String> rdd1 = sc.textFile("hdfs://10.1.255.132:9000/source/reba.txt");


        //分词 FlatMapFunction :接口,用于处理分词的操作
        /**
         * 泛型:String 读入的每一句话
         * U:返回值 ----> String 单词
         *
         * */
        JavaRDD<String> rdd2 = rdd1.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterator<String> call(String input) throws Exception {
                //分词操作
                return Arrays.asList(input.split(" ")).iterator();
            }
        });
        /**
         *
         *
         * 每个单词及一个数目
         * String 单词
         * K2
         * V2
         *
         * */

        JavaPairRDD<String,Integer> rdd3 = rdd2.mapToPair(new PairFunction<String, String , Integer >() {
            @Override
            public Tuple2<String, Integer> call(String word) throws Exception {

                return new Tuple2<String,Integer>(word,1);
            }
        });


        /**
         *
         * 执行reduce 操作
         * Integer:
         * Integer:
         * Integer:
         * */

        JavaPairRDD<String,Integer> rdd4 = rdd3.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer integer, Integer integer2) throws Exception {
                //累加操作
                return null;
            }
        });

        //执行计算,把结果打印到屏幕上
        List<Tuple2<String,Integer>> result = rdd4.collect();

        for (Tuple2<String,Integer> tuple : result) {
            System.out.println(tuple._1+"\t"+tuple._2);
        }

    }

}

集群模式:

package spark;

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;

  //  bin/spark-submit --class spark.SparkDemo scalajardemo.jar hdfs://10.1.255.132:9000/source/demo.txt

public class SparkDemo {

    public static void main(String [] args){

//集群模式
        SparkConf conf = new SparkConf().setAppName("MyWordCount")/*.setMaster("local");*/;

        //SparkContext conf = new SparkContext();

        //创建一个SparkContext对象 JavaSparkContext对象
        JavaSparkContext sc = new JavaSparkContext(conf);

        //读入HDFS数据
        JavaRDD<String> rdd1 = sc.textFile(/*"hdfs://10.1.255.132:9000/source/reba.txt"*/
        args[0]);


        //分词 FlatMapFunction :接口,用于处理分词的操作
        /**
         * 泛型:String 读入的每一句话
         * U:返回值 ----> String 单词
         *
         * */
        JavaRDD<String> rdd2 = rdd1.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterator<String> call(String input) throws Exception {
                //分词操作
                return Arrays.asList(input.split(" ")).iterator();
            }
        });
        /**
         *
         *
         * 每个单词及一个数目
         * String 单词
         * K2
         * V2
         *
         * */

        JavaPairRDD<String,Integer> rdd3 = rdd2.mapToPair(new PairFunction<String, String , Integer >() {
            @Override
            public Tuple2<String, Integer> call(String word) throws Exception {

                return new Tuple2<String,Integer>(word,1);
            }
        });


        /**
         *
         * 执行reduce 操作
         * Integer:
         * Integer:
         * Integer:
         * */

        JavaPairRDD<String,Integer> rdd4 = rdd3.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer integer, Integer integer2) throws Exception {
                //累加操作
                return null;
            }
        });

        //执行计算,把结果打印到屏幕上
        List<Tuple2<String,Integer>> result = rdd4.collect();

        for (Tuple2<String,Integer> tuple : result) {
            System.out.println(tuple._1+"\t"+tuple._2);
        }

    }

}

四、Spark执行原理分析

1、分析WordCount程序处理过程
2、Spark提交任务的流程:类似Yarn调度任务的过程

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值