• Spark 单机和集群环境部署教程


    下面是一个详细的 Spark 单机和集群环境部署教程,以及部署过程中的注意事项和一个使用 Java 和 Python 实现的 Spark 应用案例。

    一、Spark 单机模式部署

    1. 环境准备

    • 操作系统:Linux (推荐使用 Ubuntu 20.04 或 CentOS 7)
    • Java:Spark 需要 Java 环境,推荐使用 OpenJDK 8 或 11。
    • Scala:如果使用 Scala 开发 Spark 应用,需要安装 Scala。
    • Python:Spark 支持 Python 2.7+ 或 3.4+。
    • Spark:下载并安装 Spark。
    • Hadoop:虽然在单机模式中不需要 Hadoop,但如果处理大规模数据,建议安装 Hadoop。

    2. 安装 Java

    Ubuntu 中:

    sudo apt update
    sudo apt install openjdk-11-jdk
    

    CentOS 中:

    sudo yum install java-11-openjdk
    

    验证 Java 安装:

    java -version
    

    3. 下载并安装 Spark

    访问 Spark 官网 下载最新版本的 Spark。

    wget https://downloads.apache.org/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgz
    tar -xzvf spark-3.3.1-bin-hadoop3.tgz
    mv spark-3.3.1-bin-hadoop3 /usr/local/spark
    

    4. 配置环境变量

    编辑 ~/.bashrc 文件,添加以下内容:

    export SPARK_HOME=/usr/local/spark
    export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    

    应用更改:

    source ~/.bashrc
    

    5. 启动 Spark

    启动 Spark Shell

    Spark 提供了交互式的 Spark Shell,可以使用 Scala 和 Python 进行交互式开发:

    # 使用 Scala 启动 Spark Shell
    spark-shell
    
    # 使用 Python 启动 PySpark
    pyspark
    
    启动 Spark Standalone 集群
    start-master.sh
    start-worker.sh spark://<master-hostname>:7077
    

    在浏览器中访问 Spark Web 界面:

    6. 验证 Spark

    通过 Spark Shell 运行简单的 Spark 应用进行验证:

    // 使用 Scala 创建 RDD
    val data = Array(1, 2, 3, 4, 5)
    val distData = sc.parallelize(data)
    
    // 求和
    val sum = distData.reduce((a, b) => a + b)
    println("Sum: " + sum)
    
    # 使用 Python 创建 RDD
    data = [1, 2, 3, 4, 5]
    distData = sc.parallelize(data)
    
    # 求和
    sum = distData.reduce(lambda a, b: a + b)
    print("Sum:", sum)
    

    注意事项

    • 确保 Java 环境配置正确:特别是 JAVA_HOME
    • 检查 Spark 和 Hadoop 的兼容性:如果 Spark 依赖 Hadoop,需确保二者版本兼容。
    • 网络配置:单机模式一般不需要特别的网络配置,但若使用多节点,需确保网络可达。

    二、Spark 集群模式部署

    1. 环境准备

    • 多台服务器,至少 3 台(1 个 Master,2 个 Worker)。
    • 网络:确保各节点之间可以互相访问。
    • 操作系统:Linux (Ubuntu 或 CentOS)。
    • Java:在所有节点上安装 Java。
    • Hadoop:可选,根据需求安装。
    • Spark:在所有节点上安装 Spark。

    2. 设置 SSH 免密码登录

    在 Master 节点上生成 SSH 密钥:

    ssh-keygen -t rsa
    

    将公钥复制到所有 Worker 节点:

    ssh-copy-id user@worker1
    ssh-copy-id user@worker2
    

    3. 安装 Spark

    在所有节点上安装 Spark,步骤与单机安装相同。

    4. 配置 Spark 集群

    编辑 spark-env.sh

    在 Spark 的配置目录中编辑 spark-env.sh 文件(如果不存在,则创建),添加以下内容:

    # Master 节点的配置
    export SPARK_MASTER_HOST=<master-hostname>
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    export SPARK_WORKER_MEMORY=2g  # Worker 节点内存配置
    export SPARK_WORKER_CORES=2    # Worker 节点 CPU 核心数
    

    在所有节点上配置相同的 spark-env.sh 文件。

    配置 slaves 文件

    在 Master 节点上,编辑 $SPARK_HOME/conf/slaves 文件,添加所有 Worker 节点的主机名:

    worker1
    worker2
    

    5. 启动 Spark 集群

    在 Master 节点上执行:

    start-all.sh
    

    6. 验证集群状态

    访问 Spark Master 的 Web 界面,确保所有节点正常运行:

    注意事项

    • SSH 配置:确保 Master 能够通过 SSH 无密码访问 Worker 节点。
    • 时钟同步:使用 ntpdchrony 确保所有节点的时钟同步。
    • 内存和资源配置:根据实际需求合理配置每个 Worker 节点的内存和 CPU 资源。
    • 环境变量:确保所有节点的环境变量配置一致。

    三、Spark 使用案例:Word Count

    下面是一个使用 Java 和 Python 实现的 Spark 应用程序示例,完成 Word Count 任务。

    使用 Java 实现 Spark Word Count

    1. 编写 Java 程序
    import org.apache.spark.SparkConf;
    import org.apache.spark.api.java.JavaRDD;
    import org.apache.spark.api.java.JavaSparkContext;
    import org.apache.spark.api.java.JavaPairRDD;
    import scala.Tuple2;
    
    import java.util.Arrays;
    
    public class JavaWordCount {
        public static void main(String[] args) {
            // 创建 Spark 配置和上下文
            SparkConf conf = new SparkConf().setAppName("Java Word Count");
            JavaSparkContext sc = new JavaSparkContext(conf);
    
            // 读取输入文件
            JavaRDD<String> input = sc.textFile(args[0]);
    
            // 分割单词
            JavaRDD<String> words = input.flatMap(s -> Arrays.asList(s.split(" ")).iterator());
    
            // 转换为键值对
            JavaPairRDD<String, Integer> pairs = words.mapToPair(word -> new Tuple2<>(word, 1));
    
            // 计数
            JavaPairRDD<String, Integer> counts = pairs.reduceByKey((a, b) -> a + b);
    
            // 输出结果
            counts.saveAsTextFile(args[1]);
    
            // 关闭 Spark 上下文
            sc.close();
        }
    }
    
    2. 编译并打包 Java 程序

    确保你已经安装了 Maven,并在 pom.xml 文件中配置了 Spark 依赖:

    <dependencies>
        <dependency>
            <groupId>org.apache.sparkgroupId>
            <artifactId>spark-core_2.12artifactId>
            <version>3.3.1version>
        dependency>
        <dependency>
            <groupId>org.apache.sparkgroupId>
            <artifactId>spark-sql_2.12artifactId>
            <version>3.3.1version>
        dependency>
    dependencies>
    

    编译并打包:

    mvn clean package
    
    3. 运行 Java 程序

    将输入文件上传到 HDFS:

    hdfs dfs -put localfile.txt /user/hadoop/input
    

    运行 Spark 应用:

    spark-submit \
      --class JavaWordCount \
      --master spark://<master-hostname>:7077 \
      target/java-word-count-1.0-SNAPSHOT.jar \
      hdfs://<hadoop-cluster>/user/hadoop/input \
      hdfs://<hadoop-cluster>/user/hadoop/output
    
    4. 查看结果
    hdfs dfs -cat /user/hadoop/output/part-00000
    

    使用 Python 实现 Spark Word Count

    1. 编写 Python 程序
    from pyspark import SparkConf, SparkContext
    
    # 创建 Spark 配置和上下文
    conf = SparkConf().setAppName("Python Word Count")
    sc = SparkContext(conf=conf)
    
    # 读取输入文件
    input = sc.textFile("hdfs:///user/hadoop/input")
    
    # 分割单词
    words = input.flatMap(lambda line: line.split(" "))
    
    # 转换为键值对
    pairs = words.map(lambda word: (
    
    word, 1))
    
    # 计数
    counts = pairs.reduceByKey(lambda a, b: a + b)
    
    # 输出结果
    counts.saveAsTextFile("hdfs:///user/hadoop/output")
    
    # 关闭 Spark 上下文
    sc.stop()
    
    2. 运行 Python 程序

    将输入文件上传到 HDFS:

    hdfs dfs -put localfile.txt /user/hadoop/input
    

    运行 Spark 应用:

    spark-submit \
      --master spark://<master-hostname>:7077 \
      wordcount.py
    
    3. 查看结果
    hdfs dfs -cat /user/hadoop/output/part-00000
    

    总结

    通过以上步骤,我们成功部署了 Spark 单机和集群环境,并实现了一个简单的 Word Count 应用。Spark 提供了强大的分布式计算能力,可以处理大规模数据,并支持多种编程语言。

    部署过程中的注意事项

    • 确保 Java 环境正确配置
    • 配置正确的网络和 SSH 访问,尤其在集群模式下。
    • 合理分配资源,根据节点的硬件配置调整内存和 CPU 使用。
    • 定期监控集群状态,使用工具(如 Spark UI、Ganglia、Prometheus)监控 Spark 集群性能。
    • 时钟同步:使用 ntpdchrony 确保所有节点的时钟同步,防止因时间不一致导致的任务调度问题。

    通过合理配置和优化,Spark 可以在多种场景下提供高效的大数据处理能力,支持实时流处理和批处理等多种任务类型。

  • 相关阅读:
    TCP三次握手、四次挥手详解(Wireshark实践)
    一文了解云计算
    Day57 647. 回文子 516.最长回文子序列 动态规划总结篇
    项目实战——类似Everything的加强版软件
    day22_mysql
    产业互联网的商业模式并非平台模式这么简单
    Java—类加载机制
    vue配置环境变量
    接口自动化之测试数据动态生成并替换
    GraphQL(7):ConstructingTypes
  • 原文地址:https://blog.csdn.net/qq_42568323/article/details/141002611