spark 基础概率与编程wordcount入门1 javaAPI版本

首先学习Spark我们先简单介绍一下spark的基本概念,

	Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
	Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。

Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序
在这里插入图片描述

spark相关概念:

**Master:**就如同名字一样,是Spark集群的管理者,或者管理节点,在Spark基于Yarn的方式运行过程中,master就是ResourceManager,基于自身的standalone模式运行就是集群中查看到的master节点;
作用:就是整体资源调度

**Worker:**就如同名字一样,是Spark集群的工作节点,在Spark基于Yarn的方式运行过程中,worker就是nodemanager,基于自身standalone模式运行就是集群的worker节点
作用:本台机器上面的资源调度

RDD:弹性式分布式数据集(resilient distributed dataset)
rdd就是能够被并行计算的,被分区存储在集群中各个节点的数据集。
分布式:数据存储在rdd对应的各个partition分区中
弹性:Spark的数据在内存中进行存储或者计算,当内存存储不了的时候,会将对应的数据外溢到磁盘进行存储和计算。
rdd的创建方式:可以hdfs文件创建,还可以通过并行的scala的集合创建,在编码过程中还可以通过转化,将一个rdd转化为其他的rdd。

**Application:**提交到spark集群中去运行的完整的应用就是一个Application,当然一个Application有多个job来组成。

**Job:**每提交到集群一次,就会提交一个spark的job作业,或者说每触发一次action操作,就会提交一次spark作业job,从这个角度而言,一个applicaiton由多个job组成
这里个这个Job,就可以理解为MapReduce中的Job

**Driver:**驱动,简单理解,就是用来提交代码,提交job作业
在换句话说:jobs实在集群中运行的,而这些driver是在本地来提交这些job作业的
换句话说 driver的部分就是在一个application中除去job的部分

**SparkContext:**整个一个Application的应用上下文对象
一个spark应用的入口就是sparkContext,是Spark作业中最重要的概念
Driver+jobs就是Application

spark 作业wordcount的执行流程图代码:
在这里插入图片描述

package com.aura.bigdata.spark.java.core.p1;

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 org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;

import java.util.Arrays;
import java.util.Iterator;

/**
 * 基于Java的Spark代码开发:
 * 使用不同的Spark版本,在api上面略有差异(主要的差异就是SparkContext的构建的差异):
 *  spark2.x之前:
 *      需要手动new SparkContext
 *  spark2.x之后:
 *      需要构建SparkSession,使用sparksession来进行构建sparkcontext
 *      这个sparksession管理了sparkcontext,sqlcontext等等的创建。
 *  注意:
 *      java的api比scala的api一般多以java
 *  步骤:
 *      1、创建SparkContext对象
 *          加载关联的SparkConf对象
 *              A master URL must be set in your configuration
 *                  必须要制定一个spark作业的运行方式
 *              An application name must be set in your configuration
 *                  必须要制定一个spark作业的应用名称
 *          spark作业的运行方式:
 *              local,在本地运行,在本地创建SparkContext对象
 *                  local:给当前Spark作业只分配一个cpu core,一个线程运行,并行度是1
 *                  local[N]:给当前Spark作业只分配N个cpu core,N个线程运行,并行度是N
 *                  local[*]: 根据当前机器,自动分配线程个数
 *                  local[N, R]:比上述多了一个允许失败的次数,R次
 *              standalone: 并行度的设置需要在spark-submit脚本中进行设置
 *                  spark://bigdata01:7077
 *              yarn:   基于yarn的方式运行spark作业
 *                  yarn-cluster:
 *                      SparkContext的创建在yarn集群中
 *                  yarn-client:
 *                      SparkContext的创建在本地
 *                  在测试环境下,一般使用yarn-client,生产环境中一般使用yarn-cluster
 *              mesos(略)
 *                  mesos-cluster:
 *                  mesos-client:
 *              。。。
 *      2、加载外部数据源,产生对应RDD
 *      3、对该rdd进行各种操作
 *      4、关闭sparkContext
 *
 */
public class _02SparkWordCountApp {
    public static void main(String[] args) {
        /**
         * SparkConf可以理解为mr中Configuration
         */
        SparkConf conf = new SparkConf();
        conf.setAppName(_02SparkWordCountApp.class.getSimpleName());
        conf.setMaster("local[2]");
        /**
         * 使用老的api方式进行创建
         * 在一个Spark Application中,只能有一个active的SparkContext
         */
        JavaSparkContext jsc = new JavaSparkContext(conf);
        /**
         * 加载外部数据源,产生对应的RDD
         * textFile:加载外部普通的文本文件,
         */
        JavaRDD<String> linesRDD = jsc.textFile("E:/data/spark/core/hello.txt");

        JavaRDD<String> wordsRDD = linesRDD.flatMap(line -> {
            String[] fields = line.split("\\s+");
            return Arrays.asList(fields).iterator();
        });
        JavaPairRDD<String, Integer> pairsRDD = wordsRDD.mapToPair(word -> {
            return new Tuple2<String, Integer>(word, 1);
        });
        JavaPairRDD<String, Integer> rbkRDD = pairsRDD.reduceByKey((v1, v2) -> {
            return v1 + v2;
        });

        rbkRDD.foreach(pair -> {
            System.out.println(pair._1 + "=" + pair._2);
        });

        jsc.close();
    }
}

发布了52 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39361934/article/details/103270809
今日推荐