阿里云业务卖的这么好,但是文档的完整度上真是不太行,而且文档之间关联性差,作为一枚“技术人员”,最怕看到这种:你写了文档,但是跟没写一样…
基于
20240407日志
根据线人来报,Dataphin解决了当下文件夹权限问题,不会出现read only
文图
@resource_reference{"XXX"}
os.system("mkdir -p ./tmp/chars")
os.system("cp -i XXX XXX.tar.gz")
os.system("pip install --no-deps -v --target=./tmp/chars XXX.tar.gz")
同时,dataphin 4.0之前的版本,每次执行都要重复导入安装, dataphin 4.0开始一次安装永久生效
唤起流程参考:创建PYTHON计算任务
这里文档写的很差,就当每个用户都是开发工程师肚里的蛔虫,底层逻辑一点不交代。 笔者自己探索下来的几个观察:
pip install
一些依赖,不是安装一次就行,每次都要安装os.system()
的指令,执行运算的优先级会更高Package Version
---------------------- ---------
bcrypt 3.2.0
certifi 2020.12.5
cffi 1.14.5
chardet 4.0.0
configparser 5.0.2
cryptography 3.4.6
cycler 0.10.0
DateTime 4.3
docopt 0.6.2
hdfs 2.6.0
idna 2.10
joblib 1.0.1
jumpssh 1.6.5
kiwisolver 1.3.1
matplotlib 3.3.4
mysql-connector-python 8.0.23
numpy 1.20.1
pandas 1.2.3
paramiko 2.7.2
Pillow 8.1.2
pip 21.0.1
protobuf 3.15.5
psycopg2 2.8.6
py4j 0.10.9
pycparser 2.20
PyHDFS 0.3.1
pyhs2 0.6.0
PyNaCl 1.4.0
pyodps 0.10.6
pyparsing 2.4.7
pyspark 3.1.1
python-dateutil 2.8.1
pytz 2021.1
requests 2.25.1
sasl 0.2.1
scikit-learn 0.24.1
scipy 1.6.1
setuptools 54.1.1
simplejson 3.17.2
six 1.15.0
threadpoolctl 2.1.0
thrift 0.13.0
urllib3 1.26.3
wheel 0.29.0
xgboost 1.1.1
yarn-api-client 1.0.2
zope.interface 5.2.0
['/mnt/executor/sandbox', '/dataphin/python3/ENV3.7/lib/python37.zip', '/dataphin/python3/ENV3.7/lib/python3.7', '/dataphin/python3/ENV3.7/lib/python3.7/lib-dynload', '/usr/local/python3/lib/python3.7', '/dataphin/python3/ENV3.7/lib/python3.7/site-packages']
通过上传资源,可以实现的几个功能:
pip install
比较麻烦,可以直接上传固定在【资源】里面参考:上传资源及引用
大致步骤:
引用资源:
笔者自己的第一个疑问,
@resource_reference{"资源名称"}
这个语句背后到底是什么?
def funcion_for_dataphin(num):
return num + 1
假如笔者在资源里新建了一个名字叫local_func_matt_test.py
的任务名称,上传了一个python函数代码,如上代码块,只有一个简单的函数funcion_for_dataphin
@resource_reference{"local_func_matt_test.py"}
import sys
print('资源存储位置每次执行任务都会更新,本次为:',os.path.dirname(os.path.abspath("local_func_matt_test.py")))
# /mnt/executor/sandbox/resources/0000062240288
print('资源存储位置每次执行任务都会更新,本次为:',os.path.abspath("local_func_matt_test.py"))
# /mnt/executor/sandbox/resources/0000062240289/resource.local_func_matt_test.py
@resource_reference()
在python环境中 是 这个文件的 路径 !!!
并不是一个函数,也不是一个文件,只是这个上传文件的路径回到【计算任务】中的python编译空间:
如果我要引用我上传的local_func_matt_test.py
文件,该如何正确应用:
from local_func_matt_test import funcion_for_dataphin
from local_func_matt_test.py import funcion_for_dataphin
以上两种都是不行的,因为按照之前说的local_func_matt_test.py
是一个路径,而且这个实际文件的路径是 /mnt/executor/sandbox/resources/0000062240289/resource.local_func_matt_test.py
,
理论上笔者感觉可以正常调用的方式应该是:
import os
sys.path.append(os.path.dirname(os.path.abspath("local_func_matt_test.py")))
from local_func_matt_test.py import funcion_for_dataphin
from local_func_matt_test import funcion_for_dataphin # 或者这样
我先将local_func_matt_test.py
这个路径的上级目录加到sys.path
中,然后就可以直接调用了,但实际很坑,还是不行
笔者,第二次尝试,将这个文件挪到某一个可被访问到的路径
# os.system("mv local_func_matt_test.py /mnt/executor/sandbox/resources/000006224029/test_matt.py")
# 不可用,这个文件夹没有访问权限,只读
os.system("cp local_func_matt_test.py /tmp/chars/test_matt.py")
from test_matt import funcion_for_dataphin
print('函数计算:',funcion_for_dataphin(10))
以上就是可用的版本,先把@resource_reference()
资源挪到一个方便访问的地方,然后在sys.path
新增路径名称,这样就可以顺利请求到了
文章【Dataphin计算任务python脚本如何执行资源包】,有这么一段: Dataphin计算任务python执行资源包的脚本如下所示。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
@resource_reference{"zbr_tar_gz"}
from odps.tunnel import TableTunnel
from odps import ODPS
import json
import datetime
import os
import sys
os.system("mv zbr_tar_gz ibm_db.tar.gz")
os.system("pip install ibm_db.tar.gz")
这个文档写的,好像懂代码的,都可以看懂,一点注释也不给,厉害厉害的!
来解读一下:
@resource_reference{"zbr_tar_gz"}
,导入资源名为 zbr_tar_gz
文件路径os.system("mv zbr_tar_gz ibm_db.tar.gz")
将该文件重命名 ,我就纳闷,你开发者当然有读写文件夹的权限,我这没有啊。。pip install
安装#coding=utf-8
import sys
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder.appName("spark sql").config("spark.hadoop.odps.project.name", "your_project_name").config("spark.hadoop.odps.access.id", "your_id").config("spark.hadoop.odps.access.key", "your_key").config("spark.hadoop.odps.end.point", "your_odps_end_point").config("spark.sql.catalogImplementation", "odps").getOrCreate()
rdf = spark.sql("select * from table limit 10 ")
print("success")
print(rdf)
写好pyspark.py脚本,上传为资源并发布
新建spark_jar_on_max_compute任务,配置账号密码参数,调用pyspark.py
脚本
@resource_reference{"pyspark.py"}
spark-submit
--deploy-mode cluster
--conf spark.hadoop.odps.task.major.version=cupid_v2
--conf spark.hadoop.odps.end.point=http://service.cn.maxcompute.aliyun.com/api
--conf spark.hadoop.odps.runtime.end.point=http://service.cn.maxcompute.aliyun-inc.com/api
--master yarn
pyspark.py
类似在shell中记sh代码,@resource_reference{"pyspark.py"}
导入文件路径,
直到pyspark.py
执行代码
不过,不确定这段代码,是否可以直接访问到?