全球服务器测评

CentOS6下配置Spark+Python开发环境

一、环境准备与系统基础处理

CentOS 6上搭建Spark开发环境,本身就是一件比较“老系统工程”的事情。这个系统的生命周期已经结束很久,很多现代工具链都已经不再直接支持它,但在一些历史项目或者内网集群中仍然可以见到它的身影。整个环境的搭建思路不能照搬现在CentOS 7/8的方式,否则很容易在依赖、编译、版本兼容上踩坑。这里的第一步不是急着装Spark,而是先把系统基础环境整理干净,包括网络源、基础工具链以及Java环境。

CentOS 6默认的yum源早已不可用或非常慢,实际操作中通常会先替换为vault源或者国内镜像源,比如阿里云镜像。修改 /etc/yum.repos.d/CentOS-Base.repo 后执行 yum clean allyum makecache,保证基础安装能力恢复正常。接着需要安装一些基础工具:gcc、gcc-c++、make、wget、vim、openssl-devel等,这些工具在后续编译Python模块或者处理依赖时会频繁用到。很多人一开始忽略这一点,后面在pip安装numpy或py4j时才发现缺少编译环境,然后再回头补,会浪费不少时间。

系统时间同步也建议一并处理,CentOS 6在虚拟机或者旧服务器上经常出现时间漂移问题,而Spark在运行分布式任务时对时间一致性还是比较敏感的。可以使用ntpdate手动同步时间,或者配置crontab定期同步。虽然看起来是小问题,但在调试任务调度异常时,这一步往往能避免很多“莫名其妙”的错误。

二、JDK环境安装与配置

Spark运行依赖Java环境,这一点在CentOS 6上尤其需要注意版本匹配。由于系统年代较早,一般推荐使用JDK 1.7或者1.8,但Spark版本必须与Java版本匹配,否则会出现启动失败或类库冲突的问题。如果使用Spark 1.x或2.0早期版本,Java 7通常是比较稳妥的选择,而如果使用Spark 2.1+,Java 8会更合适一些。

实际安装过程中,可以选择手动安装Oracle JDK或者OpenJDK。这里更常见的是直接下载tar.gz包进行解压安装,比如放在 /usr/local/java 目录下,然后配置环境变量。在 /etc/profile 中添加:

export JAVA_HOME=/usr/local/java/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH

执行 source /etc/profile 后,通过 java -version 验证是否生效。这个步骤看似简单,但在CentOS 6上经常会遇到环境变量不生效的问题,通常是因为多个Java版本冲突,比如系统自带OpenJDK和手动安装JDK共存。这种情况下需要通过 which javaalternatives --config java 来确认当前默认Java路径。

Java环境稳定之后,整个Spark运行的基础才算真正搭建完成,否则后面Spark启动时会直接报错,而且日志信息往往比较隐晦,不容易第一时间定位问题。

三、Python环境的安装与调整

CentOS 6默认自带Python 2.6,这个版本对于现代Spark开发来说明显不够用,但又不能轻易删除,因为系统很多工具依赖它。因此一般采用“共存安装”的方式,即在不破坏系统Python的前提下,安装Python 2.7或Python 3.x。

比较稳妥的方式是源码编译Python 2.7.13或3.6版本。下载源码后解压进入目录,执行:

./configure --prefix=/usr/local/python27
make && make install

安装完成后,通过 /usr/local/python27/bin/python 来使用新版本Python,同时避免覆盖系统默认Python。然后在环境变量中追加:

export PATH=/usr/local/python27/bin:$PATH

这样执行 python -V 时就可以看到新版本。

接下来需要安装pip,这是Spark Python接口(PySpark)依赖的重要工具。如果Python版本较新,可以直接使用 get-pip.py 安装。如果是Python 2.7环境,可能需要手动指定旧版本pip,否则容易出现SSL或依赖错误。

安装完成后建议安装几个基础包:setuptoolssixpy4j。其中py4j是Spark Python与JVM通信的核心桥梁,如果缺失会导致PySpark无法正常启动。

四、Spark版本选择与部署

在CentOS 6环境中,Spark版本选择非常关键,不能盲目使用最新版本。一般推荐Spark 1.6.x 或 Spark 2.1以下版本,这些版本对旧系统兼容性较好,依赖也相对简单。

下载Spark二进制包后直接解压即可,不需要复杂编译过程。比如放在 /usr/local/spark 目录下,然后配置环境变量:

export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-*.zip:$PYTHONPATH

这里最容易出问题的是PYTHONPATH配置,如果路径不正确,PySpark会提示找不到spark模块或者py4j模块。很多初学者会误以为是Python问题,其实本质是Spark的Python绑定路径没有配置完整。

配置完成后,可以通过 spark-shell 测试Java版本Spark是否正常启动,也可以通过 pyspark 进入Python交互环境测试。如果进入REPL没有报错,说明基础环境已经打通。

五、PySpark开发环境联调

真正开始使用Python开发Spark任务时,重点在于PySpark与本地Python解释器的匹配问题。在CentOS 6中,如果同时存在多个Python版本,很容易出现Spark调用错误Python的问题。

一种常见做法是显式指定Python路径:

export PYSPARK_PYTHON=/usr/local/python27/bin/python
export PYSPARK_DRIVER_PYTHON=/usr/local/python27/bin/python

这样可以保证driver和executor使用同一个Python环境,避免出现序列化或模块缺失问题。

进入pyspark后,可以简单测试:

sc.parallelize([1,2,3,4]).map(lambda x: x*2).collect()

如果能正常输出 [2,4,6,8],说明整个链路已经通了,从Python → Spark → JVM → Python的闭环已经建立。

在实际开发中,还需要注意一个问题,就是日志级别和输出干扰。CentOS 6环境中终端较旧,建议在 conf/log4j.properties 中调整日志级别为WARN或ERROR,否则大量INFO日志会刷屏,影响调试效率。

六、常见问题与踩坑记录

在CentOS 6上搭建Spark+Python环境,最常见的问题其实并不是安装失败,而是“能启动但不能用”。比如pyspark可以进入,但执行任务时报py4j gateway错误,这通常是PYTHONPATH或版本不匹配导致的。

另一个常见问题是Java版本冲突。即使你安装了JDK 1.7,如果系统PATH中仍然优先使用OpenJDK 1.6,也会导致Spark启动异常。解决方法是强制修改alternatives并检查 echo $JAVA_HOME 是否正确。

还有一种情况是内存问题。CentOS 6很多服务器配置较低,Spark默认内存参数可能过高,导致直接OOM退出。可以在 spark-env.sh 中调整:

export SPARK_DRIVER_MEMORY=512m
export SPARK_EXECUTOR_MEMORY=512m

虽然看起来性能不高,但在测试环境中稳定运行比性能更重要。

七、总结与实际使用体验

整体来看,在CentOS 6上搭建Spark+Python环境属于典型的“老系统兼容性工程”。它不像现代环境那样一键安装,而是需要在Java、Python、Spark三个体系之间不断做版本协调和路径修正。整个过程更像是在拼一套可以运行的组合,而不是简单安装软件。

但一旦环境跑通之后,它的稳定性其实是不错的,尤其是在一些离线计算任务或者内部数据处理场景中,Spark 1.x/2.x配合Python 2.7仍然可以长期稳定运行。只是从开发效率角度来说,它确实不如现在的Docker或Kubernetes环境方便。

未经允许不得转载:全球服务器测评 » CentOS6下配置Spark+Python开发环境