Python 2.7 将bitarray库导入SparkContext
我正在尝试将bitarray库导入SparkContext 为此,我压缩了位数组文件夹中的上下文,然后尝试将其添加到python文件中。但是,即使在我将库推送到节点之后,我的RDD也找不到库。这是我的密码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
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
。您可以尝试的另一个技巧是在用户空间的运行时实际安装所需的库(请参阅)。感谢您的帮助!