伴随着梦想前行

分类 技术技巧 下的文章

15/6
2021

python代码分析工具

Scalene:简洁的内存 / CPU/GPU 分析器

首先要讨论的是 Scalene,它是一个 Python 的高性能 CPU 和内存分析器,由马萨诸塞大学研发。其 GitHub 页面是这样介绍的:「 Scalene 是适用于 Python 的高性能 CPU、GPU 和内存分析器,它可以执行许多其他 Python 分析器无法做到的事情,提供详细信息比其他分析器快几个数量级。」

安装

它是一个 Python 包,所以按照通常方法安装:

pip install scalene

这样适用于 Linux OS,作者没有在 Windows 10 上进行测试。

在 CLI 或 Jupyter Notebook 内部使用

Scalene 的使用非常简单:

scalene

也可以使用魔术命令在 Jupyter notebook 中使用它

+ MORE

30/12
2020

php兼容gz格式数据

function gzuncompress_crc32($data) {
file_put_contents('/tmp/abc.gz', "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $data);
$res = file_get_contents('compress.zlib:///tmp/abc.gz');
return $res;
}

+ MORE

22/10
2019

shell脚本实现的多进程管理

#mgr.sh
#!/bin/bash

base_dir=$(cd dirname "$0" && pwd)

TASK_COUNT=24
MUTEX_FILE=${base_dir}/count.mutex
BIN=/usr/bin/php

function maybe_wait() {
    while :
    do
        cnt=lsof ${MUTEX_FILE} | awk '$1=="sh"' | wc -l
        echo "LIMIT_TASK_COUNT: $TASK_COUNT, CURRENT: $cnt"
        if (( $cnt < $TASK_COUNT )); then
            break
        fi
        sleep 10
    done
}

for day in cat ${base_dir}/days.list
do
    echo "wait: $day, $hour"
    maybe_wait

    sh ${base_dir}/task.sh ${day} &> ${base_dir}/logs/${day}.log &
done
#task.sh
#!/bin/bash

base_dir=$(cd dirname "$0" && pwd)

MUTEX_FILE=
exec 7<>${MUTEX_FILE} 

if (( 1 > $# )); then
    echo $0 yyyy-mm-dd
    exit
fi

day=$1

echo $day

+ MORE

15/2
2019

pyspark使用自定义的python

出于种种原因,spark集群节点中的环境会不一致,会出现一些莫名其妙的错误,在没有root权限的情况下,可以使用自己配置好的python包分发到集群节点上使用;

比方说,本机是python2.7,节点是python2.6的错误:

Exception: Python in worker has different version 2.6 than that in driver 2.7, PySpark cannot run with different minor versions.Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.
at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.handlePythonException(PythonRunner.scala:298)

修改后的 /spark2.3/python/pyspark/shell.py,默认的脚本会用/spark2.3/conf/spark-env.sh覆盖自己设置的环境变量

export PYTHONSTARTUP="/data/src/shell.py"

本机调用的python环境

export PYSPARK_PYTHON=/data/python27_ml/bin/python2.7

不用python的shell,用jupyter做为交互环境

export PYSPARK_DRIVER_PYTHON=/data/python27_ml/bin/jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --ip 0.0.0.0 --port 8888 --notebook-dir /data/notebook --config /data/src/notebook_config.json"

运行, /data/python27_ml.tgz是本地路径,要分发到节点上的python包

exec "${SPARK_HOME}"/bin/spark-submit \
pyspark-shell-main \
--name "PySparkShell" \
--conf "spark.yarn.dist.archives=/data/python27_ml.tgz" \
"$@"

/data/src/shell.py
需要在SparkContext初始化之前设置环境变量PYSPARK_PYTHON
os.environ['PYSPARK_PYTHON'] = './python27_ml.tgz/python27_ml/bin/python'

分发的python包找不到对应python可执行文件的错误:

19/02/15 14:55:43 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 10.160.108.154, executor 9): java.io.IOException: Cannot run program "./python27/bin/python": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at org.apache.spark.api.python.PythonWorkerFactory.startDaemon(PythonWorkerFactory.scala:168)

+ MORE