1.安装原因
公司最有在搞一个项目,项目中的etl沿用了旧版本的etl,而旧版本的etl是通过pyspark做的,略坑的是旧版的pyspark用的python依赖的是centos7自带的,也就是python2.7,作为曾经被python2.7一通好坑的我,想着说啥得把python版本换了,因为低版本的python2.7官方都早已不维护了,缺少sparksql中各种api以及python里的api,总之我是不换不行了。由于以后的实施环境都是内网,所以不能采用在线安装方式,所以这里需要离线安装python3.6.11和spark2.4.7
2.前置环境
公司的大数据集群环境采用的是ambari管理,这里我直接调用就可,在这里提前说一下,ambari安装集群是方便,但是当你遇到坑的时候真的是一头包(仅仅吐槽)
已有组件:
1.hadoop 3.1.1.3.1.0.0-78(基于ambari)
2.jdk1.8.0_144
3.配置了master到slave的免密登录,单向免密登录
集群环境,三台机器,相信通过名字大家就能知道他们是干嘛的
192.168.23.2 master.hdp2.com
192.168.23.3 slave.hdp3.com
192.168.23.4 slave.hdp4.com
3.安装python3.6.11
安装python是通过make&&install离线安装
1.python安装前置小条件(仅仅针对我们环境,如果你们碰不到这个问题,可以忽略这个前置条件,我所遇到的是如果没自己手动安装这两个组件,那么在安装python的时候会提示你缺少zlib工具,其实不影响python的使用,但是看到报错就是不开心)
zip-3.0-11.el7.x86_64.rpm
zlib-devel-1.2.7-18.el7.x86_64.rpm
安装命令:rpm -ivh XXX.rpm
这两个包,我们的基础环境缺少这两个组件,在centos系统下需要手动安装他们两个,如果是ubantu系统,他们的名字就不是这个了,它们都可以zlib的官方查看到
2.安装python3.6.11
有情提示:我把所有的需要的这些个都拷贝在服务器的/usr/pyspark_package路径下
Python-3.6.11.tgz
安装命令如下:
tar -xvf Python-3.6.11.tgz
cd /usr/pyspark_package/Python-3.6.11
./configure --prefix=/usr/local/python3.6 (注意这一步中的路径需要提前建好)
make (编译)
make&&make install (安装)
别忘了更改环境变量呀,友情提示:python3.6下的bin中已经将python替换为python3,所以当你更改好环境变量后,重新source /etc/profile后 应该输入python3 --version来查看版本,而不是python --version
PYTHON_HOME=/usr/local/python3.6
export PYTHON_HOME
PATH=$PATH:$PYTHON_HOME/bin:$PATH
4.安装spark2.4.7-bin-hadoop2.7
spark-2.4.7-bin-hadoop2.7.tgz
1.tar -xvf spark-2.4.7-bin-hadoop2.7.tgz 解压路径为/usr/pyspark_package/spark-2.4.7-bin-hadoop2.7
2.解压后你需要关注以下几个路径,这几个路径在下面会用到
bin (pyspark提交任务脚本所在)
conf (spark的基本配置文件所在)
jars (spark运行过程中需要的jar的路径,和你java项目中的lib一个意思)
python (spark和flink等计算引擎是scala开发的,而我们写的是python代码,所以会有个中间转换的把python解析成jvm能跑起来的,这个工具就是py4j,这个工具就在python/lib中,后面会说到)
sbin (spark集群启停脚本所在)
3.修改spark-en.sh文件 这个文件在conf路径下,是通过cp spark-en.sh.template spark-en.sh的来的,在其中增加如下配置,我的spark是即将在yarnclient执行的所以相信你能明白下面的配置的意思
export SPARK_HOME=/usr/pyspark_package/spark-2.4.7-bin-hadoop2.7
export JAVA_HOME=/usr/local/jdk1.8.0_144
export HADOOP_HOME=/usr/hdp/3.1.0.0-78/hadoop
export SPARK_MASTER_IP=192.168.23.2
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=7070
#export SPARK_WORKER_CORES=2
#export SPARK_WORKER_MEMORY=9096m
#export SPARK_WORKER_INSTANCES=2
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_YARN_USER_ENV="CLASSPATH=$HADOOP_HOME/etc/hadoop"
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
4.修改slaves文件,这个文件在conf路径下,通过cp slaves.template slaves得到,需要增加如下配置
slave.hdp3.com
slave.hdp4.com
5.修改spark-defaults.conf,这个文件在conf路径下,通过copy spark-default.conf.template spark.default.conf得来,我是通过yarn作为spark的资源管理器,所以我增加了这个配置,这里指明hadoop
的版本号,否则在启动的时候会出错,如果你不需要集群yarn模式运行,那么请忽略,配置如下
spark.driver.extraJavaOptions -Dhdp.version=3.1.1.3.1.0.0-78
spark.yarn.am.extraJavaOptions -Dhdp.version=3.1.1.3.1.0.0-78
spark.yarn.historyServer.address=192.168.23.2:18080
spark.history.ui.port=18080
7.修改pyspark文件,文件在bin路径下,增加如下配置,将spark调用的python调整为python3,也就是我们自己安装的python3
export PYSPARK_PYTHON=python3
8.还记得我们上面提到过的py4j么,把py4j的东西弄到python3.6的安装路径下,我对应的就是之前 --prefixi那个参数所对应的 /usr/local/python3.6/lib/python3.6/site-package里,方式如下
py4j.zip和python.zip这两个文件在spark的python/lib路径下
分别 unzip 他们,把两个解压后的文件夹丢到自定义安装的python里 /usr/local/python3.6/lib/python3.6/site-package(这里)
9.修改hdfs的文件权限
实际上这是hdfs的问题和spark关系不大,主要是因为hdfs的用户默认不包括root在内,所以当我们通过spark去搞事情的时候,有时候会把文件放到 hdfs的 /user/root路径下,为了省事儿,赋予个权限吧
su - hdfs
hdfs dfs -mkdir /user/root
hdfs dfs -chown root:root /user/root
到了这一步 spark就算是可算装完了,注意哦,你需要操作的是三个节点,所以这些配置什么的你也要同步到其他节点上,但是要注意域名之类的别弄错了
5.启停spark,并测试
sbin路径还记得嘛
./start-all.sh 启动spark集群脚本
./stop-all.sh 停止集群脚本
不用担心spark的启动后端口问题,spark的启动脚本中会自动增加端口号的
启动spark后,你可以把某个jar或者某个py文件提交给spark通过yarnclient进行基本的计算了,在这里我就不拿自己的py脚本了,而是直接跑spark自带的示例wordcount吧
spark的bin路径
./spark-submit
--master yarn
--deploy-mode client
--num-executors 20
--executor-memory 8g
--executor-cores 2
--conf spark.yarn.executor.memoryoverhead=4096 /usr/pyspark_package/spark-2.4.7-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.7.jar
http://192.168.23.2:8080/ 这是我们的ambari集群地址
http://192.168.23.2:50070/ 这个是hdfs
http://192.168.23.2:8081/ 这个是你亲爱的spark的地址了,当你启动spark后,你就可以访问它了
http://192.168.23.2:8088/ 任务是spark以yarn方式运行的,所以我们可以访问hadoop下的记录
6.小优化
spark在运行的时候,不知你发现没有,你每次跑任务的时候,好像总有个把spark的jar传到hdfs缓存的过程,这个大约耗费十几到几十秒钟,有些讨厌对吧,所以我们在spark的配置文件直接指定会好很多
1.在spark的jars路径下
zip spark.zip
2.在hdfs上创建路径
hdfs dfs -mkdir /spark-yarn-jars
3.把压缩后的zip文件上传至hdfs
hdfs dfs -put spark.zip /spark-yarn-jars/
4.在spark-default.conf中添加
spark.yarn.archive hdfs://master.hdp2.com:8020/spark-yarn-jars/spark.zip (如果是子节点那么就是 spark.yarn.archive hdfs://slave.hdp2.com:8020/spark-yarn-jars/spark.zip,分别对应自己的就可以)
写在后面的话:这里涉及到的各种包,我不知道怎么传到csdn,可联系525711580,当然这只是针对当前版本的,希望对你有所帮助,安装过程里面涉及到环境变量的我没细化,但我想你一定可以自己搞定的。