大数据-Spark的任务执行

本文详细介绍了如何使用Spark-submit提交任务,包括在伪分布式集群中运行蒙特卡洛求圆周率示例,以及如何在本地模式和集群模式下进行WordCount操作。涵盖了从配置文件修改到任务提交的完整流程。

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

Spark的任务执行

Spark-submit

(1)修改conf/slaves配置文件
hadoop1

(2)启动spark的伪分布式集群

./sbin/start-all.sh

(3)spark-submit提交任务(以蒙特卡洛求圆周率为例)

spark-submit --master spark://hadoop1:7077 --class org.apache.spark.examples.SparkPi /usr/local/spark/spark-2.1.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.1.0.jar 100

(4)spark-submit运行结果

在这里插入图片描述
在这里插入图片描述

Spark-shell

本地模式

(1)修改conf/slaves配置文件
hadoop1

(2)启动spark的伪分布式集群

./sbin/start-all.sh

(3)启动spark-shell

spark-shell

(4)提交任务

sc.textFile("spark_workCount.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

在这里插入图片描述

集群模式

(1)修改conf/slaves配置文件
hadoop1

(2)启动spark的伪分布式集群

./sbin/start-all.sh

(3)启动spark-shell

spark-shell --master spark://hadoop1:7077

(4)hdfs创建/spark/tmp文件夹

hdfs dfs -mkdir -p /spark/tmp

(5)hdfs上传spark_workCount.txt文件

hdfs dfs -put spark_workCount.txt /spark/tmp

(6)提交任务

sc.textFile("hdfs://hadoop1:9000/spark/tmp/spark_workCount.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://hadoop1:9000/spark/output")

在这里插入图片描述
在这里插入图片描述

Spark的WordCount

Scala本地模式

(1)将jars文件夹下的jar包放到IDEA项目的resource下

注意:保持scala版本跟jar包的版本一致

在这里插入图片描述
(2)启动spark-shell

./sbin/start-all.sh
spark-shell

(3)运行本地模式的WorkCount

package spark

import org.apache.spark.{SparkConf, SparkContext}

object WordCount {
  def main(args: Array[String]): Unit = {
    //创建一个spark的配置文件
    val conf = new SparkConf().setAppName("Scala WorkCount").setMaster("local")
    //实例化SparkContext对象
    val sc = new SparkContext(conf)

    //本地模式
    val result = sc.textFile("hdfs://192.168.138.130:9000/spark/tmp/spark_workCount.txt")
      .flatMap(_.split(" "))
      .map((_,1))
      .reduceByKey(_+_)

    //输出结果
    result.foreach(println)
  }
}

在这里插入图片描述

Scala集群模式

(1)编写scala代码
import org.apache.spark.{SparkConf, SparkContext}

object WorkCount {
  def main(args: Array[String]): Unit = {
    //创建一个spark的配置文件
    val conf = new SparkConf().setAppName("Scala WorkCount")
    //实例化SparkContext对象
    val sc = new SparkContext(conf)

    //集群模式
    val result = sc.textFile(args(0))
      .flatMap(_.split(" "))
      .map((_,1))
      .reduceByKey(_+_)
      .saveAsTextFile(args(1));

    //关闭
    sc.stop();
  }
}

(2)将代码打成jar包放到linux上

在这里插入图片描述
(3)运行spark

./sbin/start-all.sh

(4)提交任务

./sbin/start-all.sh
spark-submit --master spark://hadoop1:7077 --class spark.WordCount /root/Spark-1.0-SNAPSHOT.jar hdfs://192.168.138.130:9000/spark/tmp/spark_workCount.txt hdfs://192.168.138.130:9000/spark/wordcount

在这里插入图片描述
在这里插入图片描述

Java本地模式

(1)将jars文件夹下的jar包放到IDEA项目的resource下

注意:保持scala版本跟jar包的版本一致

在这里插入图片描述
(2)启动spark-shell

./sbin/start-all.sh
spark-shell

(3)运行本地模式的WorkCount

package com.spark.util;

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;

/**
 * Spark WordCount
 * 
 * @author Jabin
 * @version 1.00 2019/
 */
public class WordCount {
    public static void main(String[] args) {
        //创建Spark配置
        SparkConf conf = new SparkConf().setAppName("Spark.WordCount").setMaster("local");
        //加载Spark配置
        JavaSparkContext sc = new JavaSparkContext(conf);
        //本地模式
        JavaRDD<String> textFile = sc.textFile("hdfs://192.168.138.130:9000/spark/tmp/spark_workCount.txt");

        JavaRDD<String> flatMap = textFile.flatMap(new FlatMapFunction<String, String>() {
            public Iterator<String> call(String s) {
                return Arrays.asList(s.split(" ")).iterator();
            }
        });

        JavaPairRDD<String, Integer> map = flatMap.mapToPair(new PairFunction<String, String, Integer>() {
            public Tuple2<String, Integer> call(String s) {
                return new Tuple2<String, Integer>(s, 1);
            }
        });

        JavaPairRDD<String, Integer> reduce = map.reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer a, Integer b) {
                return a + b;
            }
        });

        List<Tuple2<String, Integer>> list = reduce.collect();

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

在这里插入图片描述

Spark的任务调度架构图

在这里插入图片描述

### 大数据平台运维 Spark 实战教程最佳实践 #### 1. 配置优化 为了提高 Spark 的运行效率,在配置阶段可以调整一些参数来适应不同的工作负载。例如,设置 `spark.executor.memory` 和 `spark.driver.memory` 来控制内存分配;通过修改 `spark.sql.shuffle.partitions` 可以影响 shuffle 操作中的分区数量[^2]。 ```bash export SPARK_EXECUTOR_MEMORY=8g export SPARK_DRIVER_MEMORY=4g ``` #### 2. 数据本地化策略 当作业启动时,Spark 尝试将任务调度到拥有所需数据副本的工作节点上执行,即遵循数据本地化的原则。如果无法满足,则会考虑其他可用资源。这种机制有助于减少网络传输开销,提升整体性能。 #### 3. 动态资源分配 启用动态资源分配可以让应用程序根据实际需求自动增加或释放计算资源。这对于长时间运行的应用尤其有用,因为它能够更好地利用集群资源,降低成本的同时提高了灵活性。 ```scala // 启用动态分配 conf.set("spark.dynamicAllocation.enabled", "true") conf.set("spark.shuffle.service.enabled", "true") // 必须开启此选项才能使动态分配生效 ``` #### 4. 日志管理和监控 有效的日志记录对于排查问题至关重要。建议定期清理过期的日志文件,并确保有足够的磁盘空间用于保存必要的历史信息。此外,集成第三方工具如 Prometheus + Grafana 进行实时监控可以帮助及时发现潜在的风险点[^3]。 ```json { "logLevel": "INFO", "retentionPolicy": { "type": "maxAge", "duration": "7d" } } ``` #### 5. 安全措施 考虑到安全性因素,在生产环境中应实施严格的访问权限控制政策。比如仅允许特定 IP 地址范围内的客户端连接至 Master 节点;加密敏感数据防止泄露风险等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值