CDH-Spark1.6及配置python虚拟环境

406 阅读2分钟

资料

Common errors and fixes with Spark 1.6 running with Python3 (Anaconda Version)

环境

namedtuple() missing 3 required keyword-only arguments: 'rename', 'defaults', and 'module'

Spark1.6不支持Python3.5以上的版本,因此计划配置虚拟环境。

虚拟环境配置

Miniconda Installing on Linux

Python Environments for PySpark, Part 1: Using Condas

Miniconda安装

官网下载miniconda的安装包

docs.conda.io/en/latest/m…

上传至/tmp目录,并执行。

修改安装目录

安装完成后需要重启terminal或source

source /root/.bashrc

虚拟环境管理

查看

# 查看已安装的python环境
# 当前环境会通过一个星号 (*) 标识
conda info -e
conda env list

新建

conda create --name env_name python=x.x

激活

conda activate env_name

删除

conda env remove -n env_name
conda remove -n env_name --all

4月10日,只在主节点上配置了虚拟环境,其他两台机器并未配置。

5月20日,已经在子节点上配置了虚拟环境。

Spark配置

在虚拟环境中,已经可以运行spark。

修改默认Python路径

找到Spark_Install_Dir/conf/spark-env.sh

find / -name spark-env.sh

备份原config,猜测应该在类似/opt/cloudera/parcels/CDH/lib/spark/conf/spark-env.sh的目录下

cd /opt/cloudera/parcels/CDH-5.15.0-1.cdh5.15.0.p0.21/etc/spark/conf.dist/
cp spark-env.sh spark-env.sh.bak

定位虚拟环境位置

find / -name ps_env

在系统环境中修改路径

vi /etc/profile


export PYSPARK_PYTHON=/opt/miniconda3/envs/ps_env/bin/python
export PYSPARK_DRIVER_PYTHON=/opt/miniconda3/envs/ps_env/bin/python

激活

source /etc/profile

子节点

通过rsync和脚本分发到子节点上。

xsync

#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi


#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname


#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir


#4 获取当前用户名称
user=`whoami`


#5 循环
for((host=2; host<4; host++)); do
    echo ------------------- hadoop$host --------------
    rsync -rvl $pdir/$fname $user@ljw$host:$pdir
d

需要修改权限

chmod 777 xsync

分发

xsync /opt/miniconda3
xsync /etc/profile

子节点加载

source /etc/profile

测试

/opt/cloudera/parcels/CDH/lib/spark/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster "/opt/cloudera/parcels/CDH-5.15.0-1.cdh5.15.0.p0.21/lib/spark/lib/spark-examples.jar"

在master节点上运行

client wordcount1

上传文件

hdfs dfs -copyFromLocal "/tmp/input.txt" /user/spark/test/

pyspark "/tmp/WordCount.py"

client wordcount2

#!/usr/bin/env python
#-*-conding:utf-8-*-


import logging
from operator import add
from pyspark import SparkContext


logging.basicConfig(format='%(message)s', level=logging.INFO)  


#import local file
test_file_name = "file:///tmp/input.txt"  
out_file_name = "file:///tmp/spark_test/"


sc = SparkContext("local","wordcount app")


# text_file rdd object
text_file = sc.textFile(test_file_name)


# counts
counts = text_file.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile(out_file_

提交

spark-submit "/tmp/WordCount2.py"

结果

集群 word count

考虑到集群模式并非关键部分,且其产生的日志文件不易查询,所以先不研究。

修改系统环境配置后测试

spark-submit "/tmp/WordCount2.py"

可行。

报错

Application report for application_ (state: ACCEPTED) never ends

杀掉一些yarn的进程

yarn application -list


yarn application -kill application_1586413310917_0012 

杀掉一些spark进程

ps -aux | grep spark


kill -9