Python 2.7 将bitarray库导入SparkContext

Python 2.7 将bitarray库导入SparkContext,python-2.7,apache-spark,pyspark,Python 2.7,Apache Spark,Pyspark,我正在尝试将bitarray库导入SparkContext 为此,我压缩了位数组文件夹中的上下文,然后尝试将其添加到python文件中。但是,即使在我将库推送到节点之后,我的RDD也找不到库。这是我的密码 zip bitarray.zip bitarray-0.8.1/bitarray/* // Check the contents of the zip file unzip -l bitarray.zip Archive: bitarray.zip Length Date

我正在尝试将bitarray库导入SparkContext

为此,我压缩了位数组文件夹中的上下文,然后尝试将其添加到python文件中。但是,即使在我将库推送到节点之后,我的RDD也找不到库。这是我的密码

zip bitarray.zip bitarray-0.8.1/bitarray/*

// Check the contents of the zip file 

unzip -l bitarray.zip
Archive:  bitarray.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
   143455  2015-11-06 02:07   bitarray/_bitarray.so
     4440  2015-11-06 02:06   bitarray/__init__.py
     6224  2015-11-06 02:07   bitarray/__init__.pyc
    68516  2015-11-06 02:06   bitarray/test_bitarray.py
    78976  2015-11-06 02:07   bitarray/test_bitarray.pyc
---------                     -------
   301611                     5 files
然后在火花中

import os 

# Environment
import findspark
findspark.init("/home/utils/spark-1.6.0/")

import pyspark
sparkConf = pyspark.SparkConf()

sparkConf.set("spark.executor.instances", "2") 
sparkConf.set("spark.executor.memory", "10g")
sparkConf.set("spark.executor.cores", "2")

sc = pyspark.SparkContext(conf = sparkConf)

from pyspark.sql import SQLContext
from pyspark.sql.types import *
from pyspark.sql import HiveContext
from pyspark.sql.types import StructType, StructField, StringType
from pyspark.sql.functions import udf

hiveContext = HiveContext(sc)

PYBLOOM_LIB = '/home/ryandevera/pybloom.zip'
sys.path.append(PYBLOOM_LIB)
sc.addPyFile(PYBLOOM_LIB)

from pybloom import BloomFilter
f = BloomFilter(capacity=1000, error_rate=0.001)
x = sc.parallelize([(1,("hello",4)),(2,("goodbye",5)),(3,("hey",6)),(4,("test",7))],2)


def bloom_filter_spark(iterator):
    for id,_ in iterator:
        f.add(id)
    yield (None, f)

x.mapPartitions(bloom_filter_spark).take(1)
这将产生错误-

ImportError: pybloom requires bitarray >= 0.3.4

我不确定我会错在哪里。任何帮助都将不胜感激

创建和分发egg文件可能是最简单的事情。假设您已从PyPI下载并解压缩源文件,并设置
PYBLOOM\u source\u DIR
BITARRAY\u source\u DIR
变量:

cd$PYBLOOM\u SOURCE\u DIR
python setup.py bdist_egg
cd$BITARRAY\u源\u目录
python setup.py bdist_egg
在PySpark中添加:

来自itertools导入链的

导入操作系统
导入glob
蛋=链。从([
中x的glob.glob(os.path.join(os.environ[x],“dist/*”))
[“PYBLOOM\u SOURCE\u DIR”、“BITARRAY\u SOURCE\u DIR”]
])
对于鸡蛋中的鸡蛋:sc.addPyFile(鸡蛋)
问题是,
BloomFilter
对象无法正确序列化,因此如果要使用它,您必须对其进行修补或提取
位数组
,并传递以下信息:

def buildFilter(iter):
    bf = BloomFilter(capacity=1000, error_rate=0.001)
    for x in iter:
        bf.add(x)
    return [bf.bitarray]

rdd = sc.parallelize(range(100))
rdd.mapPartitions(buildFilter).reduce(lambda x, y: x | y)

非常感谢。我将尝试一下。我已经按照您提供的代码进行了操作。我认为这将是一个很好的解决方案。然而,我遇到了麻烦。对
/home/.python egg
的访问似乎受到了限制。我已经将
os.['PYTHON\u EGG\u CACHE']
设置到另一个我也可以访问的临时文件夹,但我认为问题出在节点上。你知道怎么解决这个问题吗?我将发布错误。ExtractionError:无法将文件提取到egg缓存尝试将文件提取到Python egg缓存时发生以下错误:[Errno 13]权限被拒绝:'/home/.python-egs'python-egg缓存目录当前设置为:/home/.python-egs可能您的帐户没有对此目录的写入权限?您可以通过将PYTHON_EGG_cache环境变量设置为指向可访问的目录来更改缓存目录。
/home/.PYTHON EGG
有点麻烦。它应该位于当前用户的主目录中,而不是
/home/
根目录中。无论如何,如果您想使用
PYTHON\u EGG\u CACHE
,您必须在每个worker上设置它。在导入
bitarray
/
pybloom
之前,您可以尝试在
map
/
mapPartitions
函数中执行
os.environ['PYTHON\u EGG\u CACHE']=some\u dir
。您可以尝试的另一个技巧是在用户空间的运行时实际安装所需的库(请参阅)。感谢您的帮助!