PySpark和Hadoop

Python、PySpark和Hadoop之间的关系可以简单概括如下:

  1. Hadoop:是一个分布式数据存储和处理框架,主要包括两个核心组件:

    • HDFS (Hadoop Distributed File System):负责分布式存储,将数据存储在集群中的多个节点上。
    • YARN (Yet Another Resource Negotiator):负责资源管理和任务调度,将计算任务分配到集群节点上。
  2. Spark:是一个分布式数据处理引擎,具有更快的内存计算能力,常用于替代Hadoop的MapReduce。它可以与Hadoop集成,通过HDFS进行数据存储和通过YARN进行资源管理。

  3. PySpark:是Spark的Python API接口,使得可以用Python语言编写Spark程序。它允许数据工程师和数据科学家使用Python进行大数据处理,而不必使用Java或Scala等原生Spark语言。

  • Hadoop提供底层数据存储(HDFS)和资源管理(YARN) ,而Spark作为计算引擎,通过YARN管理集群资源并使用HDFS存储数据
  • PySpark是Spark的Python接口 ,允许用户通过Python编写代码,利用Spark和Hadoop的分布式计算和存储能力,来处理大数据。

配置Hadoop和Spark的环境变量以及依赖项的目的,是为了在Windows系统上使PySpark能够访问Hadoop的资源(如HDFS),并能够顺利执行文件读写操作。以下是各个配置的具体作用:

1. 安装Hadoop并配置环境变量

目的

在Windows上,Spark与Hadoop通信需要Hadoop的配置和二进制文件支持,而Hadoop本身默认不支持Windows。因此我们需要手动配置Hadoop环境,使PySpark能够访问HDFS。

操作
  1. 下载HadoopApache Hadoop的下载链接,解压到电脑的一个路径(例如C:\hadoop-3.0.0)。

  2. 设置HADOOP_HOME环境变量:在代码或系统环境中设置HADOOP路径,以便Spark调用Hadoop相关功能。

    在Python代码中可以用如下代码配置Hadoop路径:

    python 复制代码
    import os
    os.environ['HADOOP_HOME'] = 'HADOOP解压文件夹路径'

2. 配置winutils.exe

目的

Hadoop默认不支持Windows,因此在Windows上运行Hadoop依赖winutils.exe。这个文件允许在Windows上使用Hadoop的一些特定功能,例如本地HDFS文件系统操作。

操作
  • 下载winutils.exe,并将其放置在%HADOOP_HOME%\bin目录中(例如,C:\hadoop-3.0.0\bin\winutils.exe)。

3. 下载hadoop.dll文件

目的

在Windows上,Hadoop和Spark的部分功能依赖于hadoop.dll库,该动态链接库允许Spark在Windows上调用Hadoop API,处理HDFS文件的操作。

操作
  • 下载hadoop.dll文件,并将其放入C:\Windows\System32文件夹内。

4. 验证配置

完成上述配置后,可以通过在PySpark代码中使用简单的HDFS操作来验证环境配置。例如,可以在Python代码中执行文件保存操作:

python 复制代码
from pyspark.sql import SparkSession
import os

# 配置HADOOP_HOME路径
os.environ['HADOOP_HOME'] = 'C:\\hadoop-3.0.0'

# 初始化SparkSession
spark = SparkSession.builder \
    .appName("HDFS Write Test") \
    .getOrCreate()

# 创建测试数据
data = spark.createDataFrame([(1, "test"), (2, "example")], ["id", "text"])

# 将数据保存到HDFS路径
data.write.csv("hdfs:///path/to/output/test.csv")

spark.stop()

总结

通过以上步骤,在Windows系统上可以成功配置Hadoop与PySpark,使得Python代码能够正常访问HDFS并进行文件保存等操作。


配置上述linux 集群环境

以支持Hadoop、Spark、YARN以及Python的分布式作业执行,下面是具体的操作步骤:

一、安装前准备

  1. 准备多台服务器(至少2台),一台作为主节点,其他作为从节点。

  2. SSH免密登录

    • 配置主节点可以无密码登录到从节点和其他所有节点,以便管理和执行分布式作业。

    • 执行以下命令生成密钥并复制到其他节点:

      bash 复制代码
      ssh-keygen -t rsa
      ssh-copy-id user@hostname   # 将密钥复制到从节点
  3. 下载必需的软件包:Hadoop、Spark、Python和Java的安装包。


二、安装和配置Java

  1. 下载并安装Java (推荐JDK 8或11)。

    • 可以从OracleOpenJDK下载。

    • 将JDK解压缩到一个指定目录(例如/opt/java),并在/etc/profile中设置JAVA_HOME

      bash 复制代码
      export JAVA_HOME=/opt/java
      export PATH=$JAVA_HOME/bin:$PATH
  2. 验证Java安装

    bash 复制代码
    java -version

三、安装和配置Hadoop

  1. 下载Hadoop :从Apache Hadoop官网下载稳定版。

    • 将下载的压缩包解压缩到一个目录(如/opt/hadoop),并在/etc/profile中设置HADOOP_HOME

      bash 复制代码
      export HADOOP_HOME=/opt/hadoop
      export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
  2. 配置HDFS和YARN

    • 编辑$HADOOP_HOME/etc/hadoop/core-site.xml

      xml 复制代码
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://master-node-hostname:9000</value>
      </property>
    • 编辑$HADOOP_HOME/etc/hadoop/hdfs-site.xml

      xml 复制代码
      <property>
          <name>dfs.replication</name>
          <value>3</value> <!-- 根据集群节点数量设置 -->
      </property>
      <property>
          <name>dfs.namenode.name.dir</name>
          <value>/opt/hadoop/data/namenode</value>
      </property>
      <property>
          <name>dfs.datanode.data.dir</name>
          <value>/opt/hadoop/data/datanode</value>
      </property>
    • 编辑$HADOOP_HOME/etc/hadoop/yarn-site.xml

      xml 复制代码
      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master-node-hostname</value>
      </property>
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
    • 编辑$HADOOP_HOME/etc/hadoop/mapred-site.xml

      xml 复制代码
      <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
      </property>
  3. 配置从节点列表

    • $HADOOP_HOME/etc/hadoop/slaves文件中添加所有从节点的主机名。
  4. 格式化NameNode(首次配置时):

    bash 复制代码
    hdfs namenode -format
  5. 启动Hadoop服务

    • 启动HDFS和YARN:

      bash 复制代码
      start-dfs.sh
      start-yarn.sh
  6. 验证安装

    • 访问NameNode的Web UI(默认端口9870):http://master-node-hostname:9870
    • 访问YARN ResourceManager的Web UI(默认端口8088):http://master-node-hostname:8088

四、安装和配置Spark

  1. 下载Spark :从Apache Spark官网下载预编译的Hadoop版本的Spark(如spark-3.1.2-bin-hadoop3.2)。

    • 解压缩到指定目录(如/opt/spark),并设置SPARK_HOME

      bash 复制代码
      export SPARK_HOME=/opt/spark
      export PATH=$SPARK_HOME/bin:$PATH
  2. 配置Spark

    • $SPARK_HOME/conf/spark-env.sh中添加如下内容:

      bash 复制代码
      export JAVA_HOME=/opt/java
      export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
      export SPARK_WORKER_MEMORY=4g   # 根据需求调整
      export SPARK_WORKER_CORES=4     # 根据需求调整
      export SPARK_MASTER_HOST='master-node-hostname'
    • 配置从节点列表:在$SPARK_HOME/conf/slaves文件中添加所有从节点的主机名。

  3. 启动Spark集群

    • 在主节点上启动Spark服务:

      bash 复制代码
      start-all.sh
  4. 验证Spark集群

    • 访问Spark Master Web UI(默认端口8080):http://master-node-hostname:8080

五、配置Python和PySpark

  1. 安装Python

    • 安装Python 3.x,并确保与Spark兼容。
    • 在所有节点上安装Python(可以通过包管理器,如aptyum)。
  2. 安装PySpark库

    • 在所有节点上安装pyspark(如果需要在Python中运行Spark任务)。
    bash 复制代码
    pip install pyspark
  3. 配置Python路径

    • $SPARK_HOME/conf/spark-env.sh中指定Python路径(假设Python安装在/usr/bin/python3):

      bash 复制代码
      export PYSPARK_PYTHON=/usr/bin/python3

六、提交和测试Spark作业

在主节点上,测试Spark任务的提交。以下是一个示例命令:

bash 复制代码
$SPARK_HOME/bin/spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --num-executors 3 \
  --executor-cores 4 \
  --executor-memory 4g \
  /path/to/your_script.py
  • 解释
    • --master yarn:指定YARN为资源管理器。
    • --deploy-mode cluster:在YARN集群中以集群模式运行。
    • --num-executors:指定Executor数量。
    • --executor-cores:为每个Executor分配的CPU核心数。
    • --executor-memory:为每个Executor分配的内存大小。

完成以上配置后,您将能够在Hadoop和YARN环境中运行Spark作业,并利用集群中的资源处理分布式数据任务。

这段指令展示了Hadoop文件系统(HDFS)中的文件操作命令:

bash 复制代码
hadoop fs -ls /output/output_json

解释

  • hadoop fs :用于执行HDFS文件操作的命令,类似于本地文件系统的lsmkdir等命令,但作用在HDFS上。
  • -ls:列出指定目录中的文件和子目录的信息。
  • /output/output_json :HDFS中的路径,表示列出/output/output_json目录下的文件。

该指令的作用是在HDFS中查看/output/output_json目录下的文件和文件夹,通常用于检查数据是否已成功保存到HDFS指定目录下。这对验证Spark作业或其他Hadoop任务的输出结果很有帮助。


集群管理方式来部署和运行Spark集群。

以下是使用 Standalone ModeYARNKubernetesMesos 各种模式来搭建Spark集群的步骤:

一、Standalone Mode(独立模式)

Standalone模式是Spark自带的简单集群管理器,不需要额外安装其他的资源管理器,是最简单的Spark部署模式。

  1. 下载并安装Spark

    • 下载Spark预编译包,推荐hadoop版本(如spark-3.1.2-bin-hadoop3.2)。
    • 解压到目标目录(例如/opt/spark)。
  2. 配置Spark Standalone Mode

    • $SPARK_HOME/conf/spark-env.sh中添加:

      bash 复制代码
      export SPARK_MASTER_HOST='master-node-hostname'  # 设置Master节点主机名
    • $SPARK_HOME/conf/slaves中添加所有从节点的主机名(每行一个从节点的主机名)。

  3. 启动Spark集群

    • 在主节点上启动Spark服务:

      bash 复制代码
      $SPARK_HOME/sbin/start-all.sh
    • 验证 :访问Spark Master Web UI(默认端口8080):http://master-node-hostname:8080

  4. 提交任务

    • 使用spark-submit提交任务:

      bash 复制代码
      $SPARK_HOME/bin/spark-submit --master spark://master-node-hostname:7077 your_script.py

适合场景:小规模集群和不需要复杂资源管理的环境。


二、YARN集群模式

YARN(Yet Another Resource Negotiator)是Hadoop的资源管理器,适合与Hadoop生态系统集成。YARN可以与Hadoop的HDFS结合使用,允许Spark任务使用分布式存储。

  1. 安装Hadoop

    • 安装Hadoop并配置HDFS和YARN,确保YARN ResourceManager和NodeManager正常运行。
  2. 下载并安装Spark

    • 同样安装带Hadoop依赖的Spark版本。
  3. 配置Spark YARN Mode

    • $SPARK_HOME/conf/spark-env.sh中添加Hadoop配置路径:

      bash 复制代码
      export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
  4. 启动Hadoop和Spark

    • 启动HDFS和YARN:

      bash 复制代码
      $HADOOP_HOME/sbin/start-dfs.sh
      $HADOOP_HOME/sbin/start-yarn.sh
  5. 提交任务

    • 使用YARN管理集群资源,提交任务命令如下:

      bash 复制代码
      $SPARK_HOME/bin/spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --num-executors 3 \
        --executor-cores 4 \
        --executor-memory 4g \
        /path/to/your_script.py

适合场景:Hadoop环境中需要处理大规模数据的任务。


三、Kubernetes模式

Kubernetes是一个现代化的容器编排平台,适用于部署容器化的分布式应用,包括Spark。

  1. 设置Kubernetes集群

    • 使用工具如minikubekubeadm搭建Kubernetes集群,或者使用云服务(如AWS EKS,Google GKE)。
    • 安装kubectl工具来管理Kubernetes集群。
  2. 安装Spark并准备Docker镜像

    • Spark需要容器镜像。可以从Apache Spark Docker Hub获取镜像,或者自己构建。
    • 使用spark-on-k8s-operator可以简化Spark任务在Kubernetes上的管理和提交。
  3. 配置Kubernetes访问

    • 在Spark中配置Kubernetes API访问权限,例如在$SPARK_HOME/conf/spark-defaults.conf中添加:

      properties 复制代码
      spark.master k8s://https://kubernetes-master:6443
      spark.kubernetes.container.image my-spark-image
  4. 提交任务

    • 使用spark-submit提交任务:

      bash 复制代码
      $SPARK_HOME/bin/spark-submit \
        --master k8s://https://kubernetes-master:6443 \
        --deploy-mode cluster \
        --name spark-pi \
        --class org.apache.spark.examples.SparkPi \
        --conf spark.executor.instances=3 \
        --conf spark.kubernetes.container.image=my-spark-image \
        local:///opt/spark/examples/jars/spark-examples_2.12-3.1.2.jar 100

适合场景:云原生环境或容器化应用,需要容器调度和管理的情况下。


四、Mesos模式

Mesos是一个分布式资源管理系统,可用于多种工作负载的调度和管理,包括Spark。

  1. 安装Mesos

    • Apache Mesos官网下载并安装Mesos集群。
    • Mesos依赖ZooKeeper进行集群管理,需安装并配置ZooKeeper。
  2. 配置Mesos集群

    • 配置Mesos Master和Agent(从节点):
      • 启动Mesos Master:

        bash 复制代码
        mesos-master --zk=zk://master-node:2181/mesos --work_dir=/var/lib/mesos --quorum=1
      • 启动Mesos Agent:

        bash 复制代码
        mesos-agent --master=zk://master-node:2181/mesos --work_dir=/var/lib/mesos
  3. 下载并安装Spark

    • 与上面类似,安装Spark并配置Mesos集群模式。
  4. 提交任务

    • 使用spark-submit提交任务到Mesos集群:

      bash 复制代码
      $SPARK_HOME/bin/spark-submit \
        --master mesos://master-node-hostname:5050 \
        --deploy-mode cluster \
        --class org.apache.spark.examples.SparkPi \
        /path/to/spark-examples_2.12-3.1.2.jar 100

适合场景:多种分布式应用需要统一管理的集群,且需要高扩展性和可用性。


总结

不同的集群管理模式有各自的优势:

  • Standalone Mode:轻量级且简单,适合小型集群。
  • YARN:适合Hadoop生态系统中使用的Spark作业。
  • Kubernetes:现代化的容器管理,适合云原生和容器化环境。
  • Mesos:适合多种分布式系统协同运行,适用更复杂的应用场景。

每种模式都能满足不同的需求,具体选择取决于环境和集群资源的实际情况。

相关推荐
Data跳动2 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
woshiabc1113 小时前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
lucky_syq3 小时前
Saprk和Flink的区别
大数据·flink
lucky_syq3 小时前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
袋鼠云数栈3 小时前
深入浅出Flink CEP丨如何通过Flink SQL作业动态更新Flink CEP作业
大数据
Java程序之猿3 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
清平乐的技术专栏3 小时前
Hive SQL 查询所有函数
hive·hadoop·sql
来一杯龙舌兰4 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
小白学大数据5 小时前
如何使用Selenium处理JavaScript动态加载的内容?
大数据·javascript·爬虫·selenium·测试工具
15年网络推广青哥5 小时前
国际抖音TikTok矩阵运营的关键要素有哪些?
大数据·人工智能·矩阵