我在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工作得很好。
提前致谢
答案 0 :(得分:0)
我知道这是一个已知错误:https://issues.apache.org/jira/browse/SPARK-18281
它应该在版本2.0.3和2.1.1中修复(它们都没有发布,2.1似乎还有bug)。
与此同时,如果内存不是问题,则toLocalIterator
替换collect
应该有效。