【问题标题】:Spark (pyspark) having difficulty calling statistics methods on worker nodeSpark(pyspark)在工作节点上调用统计方法有困难
【发布时间】:2015-09-09 00:02:57
【问题描述】:

我在运行 pyspark(来自 ipython 笔记本)时遇到库错误,我想在包含 (key, list(int)) 的 RDD 上的 .mapValues 操作中使用来自 pyspark.mllib.statStatistics.chiSqTest(obs)对。

在主节点上,如果我将 RDD 作为地图收集,并像这样迭代这些值,我就没有问题

keys_to_bucketed = vectors.collectAsMap()
keys_to_chi = {key:Statistics.chiSqTest(value).pValue for key,value in keys_to_bucketed.iteritems()}

但如果我直接在 RDD 上做同样的事情,我会遇到问题

keys_to_chi = vectors.mapValues(lambda vector: Statistics.chiSqTest(vector))
keys_to_chi.collectAsMap()

导致以下异常

Traceback (most recent call last):
  File "<ipython-input-80-c2f7ee546f93>", line 3, in chi_sq
  File "/Users/atbrew/Development/Spark/spark-1.4.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/mllib/stat/_statistics.py", line 238, in chiSqTest
    jmodel = callMLlibFunc("chiSqTest", _convert_to_vector(observed), expected)
  File "/Users/atbrew/Development/Spark/spark-1.4.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/mllib/common.py", line 127, in callMLlibFunc
api = getattr(sc._jvm.PythonMLLibAPI(), name)
AttributeError: 'NoneType' object has no attribute '_jvm'

我在 spark 安装的早期遇到了一个问题,没有看到 numpy,mac-osx 有两个 python 安装(一个来自 brew,一个来自 OS),但我认为我已经解决了这个问题。奇怪的是,这是 spark install 附带的 python 库之一(我之前的问题是 numpy)。

  1. 安装详细信息
    • Max OSX 优胜美地
    • Spark spark-1.4.0-bin-hadoop2.6
    • python 通过 spark-env.sh 指定为
    • PYSPARK_PYTHON=/usr/bin/python
    • PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH:$EA_HOME/omnicat/src/main/python:$SPARK_HOME/python/
    • 别名 ipython-spark-notebook="IPYTHON_OPTS=\"notebook\" pyspark"
    • PYSPARK_SUBMIT_ARGS='--num-executors 2 --executor-memory 4g --executor-cores 2'
    • 声明 -x PYSPARK_DRIVER_PYTHON="ipython"

【问题讨论】:

  • 经过一番挖掘,我发现这是sc(火花上下文)是None,当抛出异常时。这是否意味着 pyspark 中的工作节点无权访问 sc 变量?

标签: python macos apache-spark pyspark


【解决方案1】:

正如您在评论中注意到的那样,工作节点上的 sc 为无。 SparkContext 只在驱动节点上定义。

【讨论】:

  • 是这样的吗?统计类的一个真正限制似乎是不能将这个计算分发到工作节点(尤其是对于向量上的卡方计算,特别重要,因为我想分发这个计算;))。这只是 pyspark 的一个限制,还是如果我在 scala 中实现我会面临同样的问题?
  • 这是有意使用 SparkContext 的。一般来说,大多数统计函数都适用于 RDD,在这种情况下,它们只能在驱动程序上调用(如果我们查看代码中的 doctest,我们可以看到它只在 rdd 上进行测试)。由于执行器的设置方式,它们调用 java 函数并不容易。我不确定此代码是打算从执行程序内部调用还是仅从驱动程序调用,您可以为此提出问题以使其可在执行程序上调用,但我不确定会涉及多少工作设置 py4j 桥。
  • 谢谢,我现在明白了。我会按照你的建议提出请求,看看会得到什么。我看到在 RDD 上应用该功能的用例并不能满足我的需求。虽然在工作人员内部使用 scipy scipy.stats.chisquare.html 可能更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多