PySpark和Hadoop
Python、PySpark和Hadoop之间的关系可以简单概括如下:
-
Hadoop:是一个分布式数据存储和处理框架,主要包括两个核心组件:
- HDFS (Hadoop Distributed File System):负责分布式存储,将数据存储在集群中的多个节点上。
- YARN (Yet Another Resource Negotiator):负责资源管理和任务调度,将计算任务分配到集群节点上。
-
Spark:是一个分布式数据处理引擎,具有更快的内存计算能力,常用于替代Hadoop的MapReduce。它可以与Hadoop集成,通过HDFS进行数据存储和通过YARN进行资源管理。
-
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。
操作
-
下载Hadoop:Apache Hadoop的下载链接,解压到电脑的一个路径(例如
C:\hadoop-3.0.0
)。 -
设置HADOOP_HOME环境变量:在代码或系统环境中设置HADOOP路径,以便Spark调用Hadoop相关功能。
在Python代码中可以用如下代码配置Hadoop路径:
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
文件夹内。- 下载地址:hadoop.dll
4. 验证配置
完成上述配置后,可以通过在PySpark代码中使用简单的HDFS操作来验证环境配置。例如,可以在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的分布式作业执行,下面是具体的操作步骤:
一、安装前准备
-
准备多台服务器(至少2台),一台作为主节点,其他作为从节点。
-
SSH免密登录:
- 配置主节点可以无密码登录到从节点和其他所有节点,以便管理和执行分布式作业。
- 执行以下命令生成密钥并复制到其他节点:
ssh-keygen -t rsa ssh-copy-id user@hostname # 将密钥复制到从节点
-
下载必需的软件包:Hadoop、Spark、Python和Java的安装包。
二、安装和配置Java
- 下载并安装Java(推荐JDK 8或11)。
- 可以从Oracle或OpenJDK下载。
- 将JDK解压缩到一个指定目录(例如
/opt/java
),并在/etc/profile
中设置JAVA_HOME
:export JAVA_HOME=/opt/java export PATH=$JAVA_HOME/bin:$PATH
- 验证Java安装:
java -version
三、安装和配置Hadoop
-
下载Hadoop:从Apache Hadoop官网下载稳定版。
- 将下载的压缩包解压缩到一个目录(如
/opt/hadoop
),并在/etc/profile
中设置HADOOP_HOME
:export HADOOP_HOME=/opt/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
- 将下载的压缩包解压缩到一个目录(如
-
配置HDFS和YARN:
-
编辑
$HADOOP_HOME/etc/hadoop/core-site.xml
:<property> <name>fs.defaultFS</name> <value>hdfs://master-node-hostname:9000</value> </property>
-
编辑
$HADOOP_HOME/etc/hadoop/hdfs-site.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
:<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
:<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
-
配置从节点列表:
- 在
$HADOOP_HOME/etc/hadoop/slaves
文件中添加所有从节点的主机名。
- 在
-
格式化NameNode(首次配置时):
hdfs namenode -format
-
启动Hadoop服务:
- 启动HDFS和YARN:
start-dfs.sh start-yarn.sh
- 启动HDFS和YARN:
-
验证安装:
- 访问NameNode的Web UI(默认端口
9870
):http://master-node-hostname:9870
- 访问YARN ResourceManager的Web UI(默认端口
8088
):http://master-node-hostname:8088
- 访问NameNode的Web UI(默认端口
四、安装和配置Spark
-
下载Spark:从Apache Spark官网下载预编译的Hadoop版本的Spark(如
spark-3.1.2-bin-hadoop3.2
)。- 解压缩到指定目录(如
/opt/spark
),并设置SPARK_HOME
:export SPARK_HOME=/opt/spark export PATH=$SPARK_HOME/bin:$PATH
- 解压缩到指定目录(如
-
配置Spark:
-
在
$SPARK_HOME/conf/spark-env.sh
中添加如下内容: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
文件中添加所有从节点的主机名。
-
-
启动Spark集群:
- 在主节点上启动Spark服务:
start-all.sh
- 在主节点上启动Spark服务:
-
验证Spark集群:
- 访问Spark Master Web UI(默认端口
8080
):http://master-node-hostname:8080
- 访问Spark Master Web UI(默认端口
五、配置Python和PySpark
-
安装Python:
- 安装Python 3.x,并确保与Spark兼容。
- 在所有节点上安装Python(可以通过包管理器,如
apt
或yum
)。
-
安装PySpark库:
- 在所有节点上安装
pyspark
(如果需要在Python中运行Spark任务)。
pip install pyspark
- 在所有节点上安装
-
配置Python路径:
- 在
$SPARK_HOME/conf/spark-env.sh
中指定Python路径(假设Python安装在/usr/bin/python3
):export PYSPARK_PYTHON=/usr/bin/python3
- 在
六、提交和测试Spark作业
在主节点上,测试Spark任务的提交。以下是一个示例命令:
$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)中的文件操作命令:
hadoop fs -ls /output/output_json
解释
hadoop fs
:用于执行HDFS文件操作的命令,类似于本地文件系统的ls
、mkdir
等命令,但作用在HDFS上。-ls
:列出指定目录中的文件和子目录的信息。/output/output_json
:HDFS中的路径,表示列出/output/output_json
目录下的文件。
该指令的作用是在HDFS中查看/output/output_json
目录下的文件和文件夹,通常用于检查数据是否已成功保存到HDFS指定目录下。这对验证Spark作业或其他Hadoop任务的输出结果很有帮助。
集群管理方式来部署和运行Spark集群。
以下是使用 Standalone Mode、YARN、Kubernetes 和 Mesos 各种模式来搭建Spark集群的步骤:
一、Standalone Mode(独立模式)
Standalone模式是Spark自带的简单集群管理器,不需要额外安装其他的资源管理器,是最简单的Spark部署模式。
-
下载并安装Spark:
- 下载Spark预编译包,推荐
hadoop
版本(如spark-3.1.2-bin-hadoop3.2
)。 - 解压到目标目录(例如
/opt/spark
)。
- 下载Spark预编译包,推荐
-
配置Spark Standalone Mode:
- 在
$SPARK_HOME/conf/spark-env.sh
中添加:export SPARK_MASTER_HOST='master-node-hostname' # 设置Master节点主机名
- 在
$SPARK_HOME/conf/slaves
中添加所有从节点的主机名(每行一个从节点的主机名)。
- 在
-
启动Spark集群:
- 在主节点上启动Spark服务:
$SPARK_HOME/sbin/start-all.sh
- 验证:访问Spark Master Web UI(默认端口
8080
):http://master-node-hostname:8080
- 在主节点上启动Spark服务:
-
提交任务:
- 使用
spark-submit
提交任务:$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任务使用分布式存储。
-
安装Hadoop:
- 安装Hadoop并配置HDFS和YARN,确保YARN ResourceManager和NodeManager正常运行。
-
下载并安装Spark:
- 同样安装带Hadoop依赖的Spark版本。
-
配置Spark YARN Mode:
- 在
$SPARK_HOME/conf/spark-env.sh
中添加Hadoop配置路径:export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
- 在
-
启动Hadoop和Spark:
- 启动HDFS和YARN:
$HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh
- 启动HDFS和YARN:
-
提交任务:
- 使用YARN管理集群资源,提交任务命令如下:
$SPARK_HOME/bin/spark-submit \ --master yarn \ --deploy-mode cluster \ --num-executors 3 \ --executor-cores 4 \ --executor-memory 4g \ /path/to/your_script.py
- 使用YARN管理集群资源,提交任务命令如下:
适合场景:Hadoop环境中需要处理大规模数据的任务。
三、Kubernetes模式
Kubernetes是一个现代化的容器编排平台,适用于部署容器化的分布式应用,包括Spark。
-
设置Kubernetes集群:
- 使用工具如
minikube
或kubeadm
搭建Kubernetes集群,或者使用云服务(如AWS EKS,Google GKE)。 - 安装
kubectl
工具来管理Kubernetes集群。
- 使用工具如
-
安装Spark并准备Docker镜像:
- Spark需要容器镜像。可以从Apache Spark Docker Hub获取镜像,或者自己构建。
- 使用
spark-on-k8s-operator
可以简化Spark任务在Kubernetes上的管理和提交。
-
配置Kubernetes访问:
- 在Spark中配置Kubernetes API访问权限,例如在
$SPARK_HOME/conf/spark-defaults.conf
中添加:spark.master k8s://https://kubernetes-master:6443 spark.kubernetes.container.image my-spark-image
- 在Spark中配置Kubernetes API访问权限,例如在
-
提交任务:
- 使用
spark-submit
提交任务:$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。
-
安装Mesos:
- 从Apache Mesos官网下载并安装Mesos集群。
- Mesos依赖ZooKeeper进行集群管理,需安装并配置ZooKeeper。
-
配置Mesos集群:
- 配置Mesos Master和Agent(从节点):
- 启动Mesos Master:
mesos-master --zk=zk://master-node:2181/mesos --work_dir=/var/lib/mesos --quorum=1
- 启动Mesos Agent:
mesos-agent --master=zk://master-node:2181/mesos --work_dir=/var/lib/mesos
- 启动Mesos Master:
- 配置Mesos Master和Agent(从节点):
-
下载并安装Spark:
- 与上面类似,安装Spark并配置Mesos集群模式。
-
提交任务:
- 使用
spark-submit
提交任务到Mesos集群:$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:适合多种分布式系统协同运行,适用更复杂的应用场景。
每种模式都能满足不同的需求,具体选择取决于环境和集群资源的实际情况。