web-dev-qa-db-ja.com

ImportError:spark workersにnumpyという名前のモジュールはありません

クライアントモードでのpysparkの起動。 bin/pyspark --master yarn-client --num-executors 60シェルのインポートnumpyは正常に動作しますが、kmeansでは失敗します。どういうわけか、executorにはnumpyがインストールされていません。 numpyを労働者に知らせる良い解決策はどこにも見つかりませんでした。 PYSPARK_PYTHONを設定しようとしましたが、それも機能しませんでした。

import numpy
features = numpy.load(open("combined_features.npz"))
features = features['arr_0']
features.shape
features_rdd = sc.parallelize(features, 5000)
from pyspark.mllib.clustering import KMeans, KMeansModel

from numpy import array
from math import sqrt
clusters = KMeans.train(features_rdd, 2, maxIterations=10, runs=10, initializationMode="random")

スタックトレース

 org.Apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.Zip/pyspark/worker.py", line 98, in main
    command = pickleSer._read_with_length(infile)
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.Zip/pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.Zip/pyspark/serializers.py", line 422, in loads
    return pickle.loads(obj)
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.Zip/pyspark/mllib/__init__.py", line 25, in <module>

ImportError: No module named numpy

        at org.Apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:166)
        at org.Apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:207)
        at org.Apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125)
        at org.Apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70)
        at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.Apache.spark.rdd.RDD.iterator(RDD.scala:264)
        at org.Apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.Apache.spark.CacheManager.getOrCompute(CacheManager.scala:69)
        at org.Apache.spark.rdd.RDD.iterator(RDD.scala:262)
        at org.Apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:99)
        at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.Apache.spark.rdd.RDD.iterator(RDD.scala:264)
        at org.Apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.Apache.spark.rdd.RDD.iterator(RDD.scala:264)
        at org.Apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
        at org.Apache.spark.scheduler.Task.run(Task.scala:88)
        at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
        at Java.lang.Thread.run(Thread.Java:745)
        enter code here
14
ajkl

YarnクライアントモードでSparkを使用するには、Yarnがexecutorを起動するマシンへの依存関係をインストールする必要があります。これが唯一の確実な方法です。

SparkとYarnクラスターモードを使用するのは別の話です。python依存関係をspark-submitで配布できます。

spark-submit --master yarn-cluster my_script.py --py-files my_dependency.Zip

ただし、numpyの状況は、それを非常に高速にするのと同じことによって複雑になります。Cで重い作業を行うという事実です。それがインストールされる方法のため、numpyをこの方法で配布することはできません。

18
dayman

numpyはワーカー(仮想)マシンにインストールされていません。 anacondaを使用する場合は、アプリケーションをクラスターモードでデプロイするときに、このようなpython依存関係をアップロードするのが非常に便利です。まず、anacondaを圧縮し、Zipファイルをクラスターに配置してから、次のスクリプトを使用してジョブを送信できます。

 spark-submit \
 --master yarn \
 --deploy-mode cluster \
 --archives hdfs://Host/path/to/anaconda.Zip#python-env
 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pthon-env/anaconda/bin/python 
 app_main.py

Yarnはanaconda.Zipをhdfsパスから各ワーカーにコピーし、そのpthon-env/anaconda/bin/pythonを使用してタスクを実行します。

VirtualenvでPySparkを実行する を参照して、詳細を確認してください。

1
sincosmos

同じ問題がありました。 Python3を使用している場合、pip3にnumpyをインストールしてみてください

pip3 install numpy

0
shashank rai

Numpyをすべてのワーカーにインストールする必要があることに注意する必要があり、マスター自体にも(コンポーネントの配置に応じて)インストールする必要があります。

また、umaskを022(pip install numpy)に強制した後、ルートアカウントからumask 022コマンドを起動して(Sudoでは十分ではありません)、Sparkへの権限をカスケードします(またはZeppelin)ユーザー

0
Mehdi LAMRANI
Sudo pip install numpy

numpyを「Sudo」で再インストールしたようで、このモジュールが見つかりました。

0
maroon912

私は同様の問題を抱えていましたが、ワーカーマシン(apt-getまたはyum)にnumpyをインストールする代わりにPYSPARK_PYTHONを設定する必要はないと思います。このエラーは、インポートが欠落しているマシンも示します。

0
Somum

私にとってそれを解決したのは(macで)実際にこのガイドでした(これはpython through Jupyter Notebooks- https: //medium.com/@yajieli/installing-spark-pyspark-on-mac-and-fix-of-some-common-errors-355a9050f735

簡単に言えば:(spark with brew install spark)をインストールしたと仮定します)

  1. SPARK_PATHを使用してbrew info Apache-sparkを見つけます
  2. これらの行を~/.bash_profileに追加します
# Spark and Python
######
export SPARK_PATH=/usr/local/Cellar/Apache-spark/2.4.1
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
#For python 3, You have to add the line below or you will get an error
export PYSPARK_PYTHON=python3
alias snotebook='$SPARK_PATH/bin/pyspark --master local[2]'
######
  1. pysparkを呼び出すだけで、Jupyter Notebookを開くことができるはずです。

Spark Contextを設定する必要はなく、代わりに単に呼び出すだけでよいことを覚えておいてください。

sc = SparkContext.getOrCreate()
0
Gal Bracha