以本地模式运行Spark时,以下简单的json DataFrame测试工作正常。这是Scala片段,但我也成功地使用Java和Python工作:
sparkContext.addFile(jsonPath)
val sqlContext = new org.apache.spark.sql.SQLContext(sparkContext)
val dataFrame = sqlContext.jsonFile(jsonPath)
dataFrame.show()
我确保jsonPath既可以在驱动程序端也可以在工作者端工作。我正在调用addFile ... json文件非常简单:
[{"age":21,"name":"abc"},{"age":30,"name":"def"},{"age":45,"name":"ghi"}]
当我切换出本地模式并使用单个主服务器和单个主服务器的单独Spark服务器时,完全相同的代码会失败。我在Scala,Java和Python中尝试过相同的测试,试图找到一些有效的组合。他们都得到了基本相同的错误。以下错误来自Scala驱动程序,但Java / Python错误消息几乎相同:
15/04/17 18:05:26 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 10.0.2.15): java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2747)
at java.io.ObjectInputStream.readFully(ObjectInputStream.java:1033)
at org.apache.hadoop.io.DataOutputBuffer$Buffer.write(DataOutputBuffer.java:63)
at org.apache.hadoop.io.DataOutputBuffer.write(DataOutputBuffer.java:101)
at org.apache.hadoop.io.UTF8.readChars(UTF8.java:216)
at org.apache.hadoop.io.UTF8.readString(UTF8.java:208)
这非常令人沮丧。我基本上试图从官方文档中获取代码片段。
更新:感谢Paul的深度回应。我在做同样的步骤时遇到错误。仅供参考,我之前使用的是驱动程序,因此名称为sparkContext,而不是sc的shell默认名称。这是一个删除了多余日志记录的缩写代码段:
➜ spark-1.3.0 ./bin/spark-shell --master spark://172.28.128.3:7077
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.3.0
/_/
Using Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc.
SQL context available as sqlContext.
scala> val dataFrame = sqlContext.jsonFile("/private/var/userspark/test.json")
15/04/20 18:01:06 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 10.0.2.15): java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2747)
at java.io.ObjectInputStream.readFully(ObjectInputStream.java:1033)
at org.apache.hadoop.io.DataOutputBuffer$Buffer.write(DataOutputBuffer.java:63)
at org.apache.hadoop.io.DataOutputBuffer.write(DataOutputBuffer.java:101)
at org.apache.hadoop.io.UTF8.readChars(UTF8.java:216)
at org.apache.hadoop.io.UTF8.readString(UTF8.java:208)
at org.apache.hadoop.mapred.FileSplit.readFields(FileSplit.java:87)
at org.apache.hadoop.io.ObjectWritable.readObject(ObjectWritable.java:237)
(...)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 6, 10.0.2.15): java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2747)
答案 0 :(得分:0)
虽然我可以让你的简单例子起作用,但我同意火花可能令人沮丧...
这里我有spark 1.3.0,源自openjdk 8。
将文件与spark-shell
或spark-submit
一起使用失败的原因各不相同,可能的示例/文档与发布的代码相比已经过时,需要稍微调整一下。
例如,在spark-shell中,sparkContext
已作为sc
提供,而不是sparkContext
,并且有一个类似的预定义sqlContext
。 spark-shell发出INFO消息,宣布创建这些上下文。
对于spark-submit
,我遇到了某种jar错误。这可能是一个本地问题。
无论如何,如果我缩短它,它运行正常。为了执行这个简短的例子,json文件是否每行有一个对象,这似乎并不重要。对于将来的测试,生成一个大型示例并确定它是否跨核心并行运行以及每行需要一个对象(没有逗号或顶部括号)来完成此任务可能很有用。
so1-works.sc
val dataFrame = sqlContext.jsonFile("/data/so1.json")
dataFrame.show()
输出,抑制INFO等消息...
paul@ki6cq:~/spark/spark-1.3.0$ ./bin/spark-shell --master spark://192.168.1.10:7077 <./so1-works.sc 2>/dev/null
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.3.0
/_/
Using Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.8.0_40-internal)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc.
SQL context available as sqlContext.
scala>
scala> val dataFrame = sqlContext.jsonFile("/data/so1.json")
dataFrame: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
scala> dataFrame.show()
age name
21 abc
30 def
45 ghi
scala> Stopping spark context.
paul@ki6cq:~/spark/spark-1.3.0$ paul@ki6cq:~/spark/spark-1.3.0$
奇怪的注意事项:之后,我必须执行reset
才能使我的linux终端恢复正常。
好的,首先,尝试按照我的说法缩短示例。
如果没有解决问题,您可以尝试复制我的环境。
这可能很简单,因为我使用docker作为master和worker,并将图像发布到公共dockerhub。
请注意未来的读者:我的公共dockerhub图片不是火花的官方图片,可能会更改或删除。
在家庭防火墙路由器设备后面需要两台计算机(一台运行Linux或与docker兼容的操作系统来托管docker容器中的master和worker,另一台也最好运行Linux或具有spark-1.3.0版本的东西) (DLink,Netgrear等......)我假设本地网络是192.168.1。*,192.168.1.10和.11是免费的,并且路由器将正确路由,或者您知道如何使其正确路由。您可以在下面的运行脚本中更改这些地址。
如果您只有一台计算机,由于我在这里使用的网络连接方法的细节,可能无法正常与主机通信。
它可以工作,但比我想添加到已经很长的帖子要多一点。
在一台Linux计算机上,install docker,pipework utility和这些shell脚本(调整内存授予spark,编辑额外的工作人员似乎没有必要):
./运行搬运工火花
#!/bin/bash
sudo -v
MASTER=$(docker run --name="master" -h master --add-host master:192.168.1.10 --add-host spark1:192.168.1.11 --add-host spark2:192.168.1.12 --add-host spark3:192.168.1.13 --add-host spark4:192.168.1.14 --expose=1-65535 --env SPARK_MASTER_IP=192.168.1.10 -d drpaulbrewer/spark-master:latest)
sudo pipework eth0 $MASTER 192.168.1.10/24@192.168.1.1
SPARK1=$(docker run --name="spark1" -h spark1 --add-host master:192.168.1.10 --add-host spark1:192.168.1.11 --add-host spark2:192.168.1.12 --add-host spark3:192.168.1.13 --add-host spark4:192.168.1.14 --expose=1-65535 --env mem=10G --env master=spark://192.168.1.10:7077 -v /data:/data -v /tmp:/tmp -d drpaulbrewer/spark-worker:latest)
sudo pipework eth0 $SPARK1 192.168.1.11/24@192.168.1.1
./停止搬运工火花
#!/bin/bash
docker kill master spark1
docker rm master spark1
另一台Linux计算机将是您的用户计算机,需要构建spark-1.3.0。在两台计算机上创建一个/ data目录并在那里安装json文件。然后在计算机上运行./run-docker-spark一次,该计算机充当容纳主服务器和工作服务器的容器(如VM)的组合主机。要停止火花系统,请使用停止脚本。如果重新启动,或者出现错误,则需要在运行脚本再次运行之前运行停止脚本。
检查主人和工作人员是否在http://192.168.1.10:8080
配对如果是这样,那么你最好先尝试一下spark-shell命令行。
您不需要这些dockerfiles,因为构建版本发布在公共dockerhub上,并且在docker run中自动下载。但是在这里它们是为了你想要看看如何构建东西,JDK,maven命令等。
我从一个名为spark-roasted-elephant
的目录中放置了一个常见的Docker文件,因为这是一个非hadoop版本,而hadoop的O&#39; Reilley书中有一只大象。您需要来自spark网站的spark-1.3.0源代码tarball才能使用Dockerfile进入目录。这个Dockerfile可能没有暴露足够的端口(火花对于它的端口的使用是非常混乱的,而不幸的是,docker旨在包含和记录端口的使用),并且在运行master的shell脚本中覆盖了公开和工人。如果您要求docker列出正在运行的内容,这将导致一些不愉快,因为这包括端口列表。
paul@home:/Z/docker$ cat ./spark-roasted-elephant/Dockerfile
# Copyright 2015 Paul Brewer http://eaftc.com
# License: MIT
# this docker file builds a non-hadoop version of spark for standalone experimentation
# thanks to article at http://mbonaci.github.io/mbo-spark/ for tips
FROM ubuntu:15.04
MAINTAINER drpaulbrewer@eaftc.com
RUN adduser --disabled-password --home /spark spark
WORKDIR /spark
ADD spark-1.3.0.tgz /spark/
WORKDIR /spark/spark-1.3.0
RUN sed -e 's/archive.ubuntu.com/www.gtlib.gatech.edu\/pub/' /etc/apt/sources.list > /tmp/sources.list && mv /tmp/sources.list /etc/apt/sources.list
RUN apt-get update && apt-get --yes upgrade \
&& apt-get --yes install sed nano curl wget openjdk-8-jdk scala \
&& echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >>/etc/environment \
&& export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" \
&& ./build/mvn -Phive -Phive-thriftserver -DskipTests clean package \
&& chown -R spark:spark /spark \
&& mkdir /var/run/sshd
EXPOSE 2222 4040 6066 7077 7777 8080 8081
master是使用dockerfile和shell脚本从目录./spark-master构建的,包含在容器中。这是dockerfile和shell脚本。
paul@home:/Z/docker$ cat ./spark-master/Dockerfile
FROM drpaulbrewer/spark-roasted-elephant:latest
MAINTAINER drpaulbrewer@eaftc.com
ADD my-spark-master.sh /spark/
USER spark
CMD /spark/my-spark-master.sh
paul@home:/Z/docker$ cat ./spark-master/my-spark-master.sh
#!/bin/bash -e
cd /spark/spark-1.3.0
# set SPARK_MASTER_IP to a net interface address, e.g. 192.168.1.10
export SPARK_MASTER_IP
./sbin/start-master.sh
sleep 10000d
对于工人:
paul@home:/Z/docker$ cat ./spark-worker/Dockerfile
FROM drpaulbrewer/spark-roasted-elephant:latest
MAINTAINER drpaulbrewer@eaftc.com
ADD my-spark-worker.sh /spark/
CMD /spark/my-spark-worker.sh
paul@home:/Z/docker$ cat ./spark-worker/my-spark-worker.sh
#!/bin/bash -e
cd /spark/spark-1.3.0
sleep 10
# dont use ./sbin/start-slave.sh it wont take numeric URL
mkdir -p /Z/data
mkdir -p /user/hive/warehouse
chown -R spark:spark /user
su -c "cd /spark/spark-1.3.0 && ./bin/spark-class org.apache.spark.deploy.worker.Worker --memory $mem $master" spark
虽然到目前为止,这篇文章已经变成了#34;如何为火花制作Dockerfiles?&#34;它并不打算成为。这些Dockerfiles对我来说是实验性的,我不会在生产中使用它们并且不保证它们的质量。我不喜欢Docker上一个备受好评的火花源,因为他们参与了将一堆容器链接在一起的懒惰做法,而且它非常庞大并且需要永远下载。在这里,层数更少,下载更小。这不是一个docker示例,但是您可以确定您自己环境中的不同之处。