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:适合多种分布式系统协同运行,适用更复杂的应用场景。

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

相关推荐
爱奇艺技术产品团队33 分钟前
爱奇艺大数据多 AZ 统一调度架构
大数据·架构
安科瑞武陈燕WX172696036551 小时前
智慧用电监控装置:引领0.4kV安全用电新时代
大数据·人工智能·安全
m0_375599731 小时前
Hadoop:单机伪分布式部署
大数据·hadoop·分布式
小森饭3 小时前
Kubernetes运行大数据组件-运行hive
大数据·hive·云原生·kubernetes
调皮的木木3 小时前
zookeeper全系列学习之分布式锁实现
java·分布式·zookeeper
Darryl大数据3 小时前
八、MapReduce 大规模数据处理深度剖析与实战指南
大数据·hadoop·mapreduce
ok你也是个coder3 小时前
Kafka 基础入门
分布式·kafka·mq·kafka入门
龙哥·三年风水3 小时前
群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI继续开发二
分布式·php·群控系统