从Spark中获取数据 - Python

时间:2016-10-01 22:33:55

标签: python apache-spark

我在Spark 2.0中拥有大约5000万个dicd的rdd。它们非常小,内存中只占用大约12Gb(Spark Web UI中的每个存储选项卡)。我在这个RDD上运行了我想要的所有处理过程,现在我想从Spark中取出它,因为我现在需要将这些数据提供给另一个系统。

我无处可去,需要一些帮助。理想情况下,我想要做的是将每个分区发送到驱动程序并让它通过另一个python模块在本地转储数据。这将需要最少的额外编码。

我希望像这样的东西能起作用:

for x in processed_data.toDF().toLocalIterator():
    index.add(x)

但是没有快乐,我得到了这个方便的堆栈跟踪:

<ipython-input-20-b347e9bd2075> in <module>()
----> 1 for x in processed_data.toDF().toLocalIterator():
      2     index.add(x)

/apps/spark2/python/pyspark/rdd.py in _load_from_socket(port, serializer)
    140     try:
    141         rf = sock.makefile("rb", 65536)
--> 142         for item in serializer.load_stream(rf):
    143             yield item
    144     finally:

/apps/spark2/python/pyspark/serializers.py in load_stream(self, stream)
    137         while True:
    138             try:
--> 139                 yield self._read_with_length(stream)
    140             except EOFError:
    141                 return

/apps/spark2/python/pyspark/serializers.py in _read_with_length(self, stream)
    154 
    155     def _read_with_length(self, stream):
--> 156         length = read_int(stream)
    157         if length == SpecialLengths.END_OF_DATA_SECTION:
    158             raise EOFError

/apps/spark2/python/pyspark/serializers.py in read_int(stream)
    541 
    542 def read_int(stream):
--> 543     length = stream.read(4)
    544     if not length:
    545         raise EOFError

/usr/lib/python3.4/socket.py in readinto(self, b)
    372         while True:
    373             try:
--> 374                 return self._sock.recv_into(b)
    375             except timeout:
    376                 self._timeout_occurred = True

timeout: timed out

我检查了所有日志文件,我不知道它可能是什么。我甚至试图重新划分rdd,所以我有更小的分区,但仍然没有运气。

由于我的驱动程序分配了大约40GB的RAM,然后我尝试收集它,然后我开始得到一堆这些:

ExecutorLostFailure (executor 3 exited caused by one of the running
tasks) Reason: Remote RPC client disassociated. Likely due to 
containers exceeding thresholds, or network issues. Check driver logs 
for WARN messages.

我检查了日志,甚至没有看到任何问题。 甚至远程完成执行的唯一事情是将DF写入hdfs:

processed_data.toDF().write.json()

然而问题是,我只是在没有适当的JSON语法的情况下获取数据的转储,比如在每个对象之后使用逗号....

我在这里遗漏了什么吗?这真是令人沮丧,因为我用较小的数据集尝试了这一点,并且toLocalIterator工作得很好。

提前致谢

1 个答案:

答案 0 :(得分:0)

我知道这是一个已知错误:https://issues.apache.org/jira/browse/SPARK-18281

它应该在版本2.0.3和2.1.1中修复(它们都没有发布,2.1似乎还有bug)。

与此同时,如果内存不是问题,则toLocalIterator替换collect应该有效。