Java Spark入门教程 词频统计 远程调用的几个坑

一、几个概念

1.1 Spark集群(分布式计算)


一组计算机的集合,每个计算机节点作为独立的计算资源,又可以虚拟出多个具备计算能力的虚拟机,这些虚拟机是集群中的计算单元。Spark集群支持Standalone、Mesos、Yarn三种集群部署模式。

1. Standalone: 独立模式,Spark 原生的简单集群管理器, 自带完整的服务, 可单独部署到一个集群中,无需依赖任何其他资源管理系统, 使用 Standalone 可以很方便地搭建一个集群,一般在公司内部没有搭建其他资源管理框架的时候才会使用。
2. Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括 yarn,由于mesos这种方式目前应用的比较少。
3. YARN(hadoop yarn): 统一的资源管理机制, 在上面可以运行多套计算框架,根据 driver 在集群中的位置不同,分为 yarn client 和 yarn cluster。


小结:

生产环境多数使用的集群管理器是 YARN。

1.2 Cluster Manager

集群中的计算资源是由Cluster Manager来管理的

1.3 Driver 进程

编写的Spark程序就在Driver上, 由Driver进程执行。

1.4 Worker

集群中运行应用程序的节点,用自己所在节点的内存存储RDD的partition。启动其他进程和线程,对RDD的partition进行并行计算处理

1.5 Executor

应用程序在Worker节点上启动的进行,Executor接收到task之后,会启动多个线程来执行Task

1.6 Task

被发送到某个Executor的一个工作单元,Task会对RDD的partition数据执行指定的算子操作, 形成新RDD的 partition

二、Spark安装

windows本地安装

Spark学习笔记--Spark在Windows下的环境搭建 - 法号阿兴 - 博客园​www.cnblogs.com图标

 

三、调用

官方示例:

https://github.com/apache/spark/tree/master/examples/src/main/java/org/apache/spark/examples​github.com

3.1 官方JavaWordCount词频统计demo

import scala.Tuple2;

import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.SparkSession;

import java.util.*;
import java.util.regex.Pattern;

/**
 * 官方JavaWordCount Demo + 说明
 * @author hanko
 */
public final class JavaWordCount {
  private static final Pattern SPACE = Pattern.compile(" ");

  public static void main(String[] args) throws Exception {


    SparkSession spark = SparkSession
      .builder()
      .appName("JavaWordCount")
      //local本地spark  local[k]本地k个线程 local[*]本地多线程
      .master("local")
      .getOrCreate();

    //根据数据来源,创建RDD
    JavaRDD<String> lines = spark.read().textFile("src/main/resources/data.txt").javaRDD();
    /*对初始的RDD进行Transformation级别的处理,如map、filter高阶函数编程,进行具体计算*/
    //1、对每行字符串进行单词拆分,并把所有拆分结果通过flatMap合并成一个大的单词集合
    JavaRDD<String> words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
    //2、在单词拆分的基础上,对每个单词实例进行计数为1
    JavaPairRDD<String, Integer> ones = words.mapToPair(s -> new Tuple2<>(s, 1));
    // 3、计算每个单词在文中出现的总次数(即相关单词累加次数)
    JavaPairRDD<String, Integer> counts = ones.reduceByKey((i1, i2) -> i1 + i2);
    //将RDD类型的数据转化为数组
    List<Tuple2<String, Integer>> output = counts.collect();
    //遍历并打印数组
    for (Tuple2<?,?> tuple : output) {
      System.out.println(tuple._1() + ": " + tuple._2());
    }

    spark.stop();
  }
}

如果是中文可以使用中文分词器先把数据处理后再统计。

3.2 在JavaWordCount基础上增加排序

import org.apache.spark.sql.SparkSession;
import scala.Tuple2;
import java.util.Arrays;
import java.util.regex.Pattern;

/**
 * JavaWordCount增加排序
 * @author hanko
 */
public final class JavaWordCountSort {
  private static final Pattern SPACE = Pattern.compile(" ");

  public static void main(String[] args) throws Exception {


    SparkSession spark = SparkSession
      .builder()
      .appName("JavaWordCountSort")
      .master("local")
      .getOrCreate();

    spark.read().textFile("src/main/resources/data.txt").javaRDD().flatMap(line -> {
      return Arrays.asList(line.split(" ")).iterator();
    }).mapToPair(word -> {
      return new Tuple2<String,Integer>(word,1);
    }).reduceByKey((x,y) -> (x + y)).mapToPair(t -> {
      return new Tuple2<Integer,String>(t._2,t._1);
      //增加sortByKey false降序
    }).sortByKey(false).mapToPair(t -> {
      return new Tuple2<String,Integer>(t._2,t._1);
    }).foreach(t -> System.out.println(t));


    spark.stop();
  }
}

3.3 除接收textFile源数据外,也可以直接接收集合数据

SparkSession spark = SparkSession
      .builder()
      .appName("JavaWordCount")
      .master("local")
      .getOrCreate();

    JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
    //输入集合数据,调用spark的parallelize函数来创建RDD
    JavaRDD<String> lines = jsc.parallelize(Arrays.asList("hello","hello", "world"));
    /*对初始的RDD进行Transformation级别的处理,如map、filter高阶函数编程,进行具体计算*/
    //1、对每行字符串进行单词拆分,并把所有拆分结果通过flatMap合并成一个大的单词集合
    JavaRDD<String> words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());

四、技术笔记

玄明Hanko:spark远程调用的几个坑​zhuanlan.zhihu.com图标

 

发布于 2 分钟前
posted @ 2020-12-04 16:40  玄明hanko  阅读(800)  评论(0编辑  收藏  举报