1. os.environ
executors数量增加后,出现以下问题:
TaskSetManager: Lost task 10.3 in stage 1.0 (TID 21) on executor OCDC-ARM-DN-160: org.apache.spark.SparkException (
Error from python worker:./python36/mlpy_env/bin/python: ./python36/mlpy_env/bin/python: 无法执行二进制文件python是在x86上编译打包的,要运行在arm机器上会报错。
需要交叉编译。交叉编译交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:
比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。
---
原文链接:https://blog.csdn.net/pengfei240/article/details/52912833
目前的环境是:
x86_64机器上只有python基础环境,arm机器上有需要的所有环境
根据机器的架构来判断,选择hdfs上指定的python库或直接使用本地环境
对提交的python代码进行了拆分,
由一个py文件拆成两个,
main文件用于创建sparkcontext,在executors中执行操作
mean_shift文件封装了聚类算法相关的操作,在这个文件中import相关库。在import之前做条件判断
-
- 判断cpu架构
现在先获取arm架构的机器的arch输出是什么?其实是platform.machine()的输出
- 判断cpu架构
设置环境变量,仅仅是设置某个值为指定字符串。
不奏效arch=platform.machine()
arch=str(arch).lower()
arm="ar"
if len(arm and arch) == 2:os.environ['PYSPARK_PYTHON'] = '/usr/bin/python'
else:os.environ['PYSPARK_PYTHON'] = './python36/mlpy_env/bin/python'
os.environ有四个执行位置
flowchart TB
client env --> main.py import --> main.py func() --> my.py import --> my.py func()
- client env
客户端环境 - main.py
driver程序中的代码在客户端本地执行
# -*- coding:utf-8 -*-
import os
from pyspark import SparkContext
import platform
from ms import add_arch, run# 客户端执行
#psenv=os.environ.get('PYSPARK_PYTHON', 'no python 1')
#env=os.environ.get('PYTHON_HOME', 'no python 2')
#print("psenv = " +psenv)
#print("env = " + env)
# os.environ['PYSPARK_PYTHON'] = './python36/mlpy_env/bin/python'
os.environ['PYSPARK_PYTHON'] = '/usr/bin/python'
2. sys.path
python中import某个A模块时,首先会从python的内置模块中查找是否含义该模块的定义若未查询到会从sys.path对应的模块路径查询是否含有对应模块的定义,如果搜索完成依然没有对应A模块时则抛出import的异常
python sys.path添加包路径
>>> import sys
>>> print(sys.path)>>> sys.path += ['path1', 'path2']
>>> print(sys.path)