2014-10-31 245 views
18

我有一个主集群和3个工人的Spark集群设置。我还在CentOS虚拟机上安装了Spark。我试图从本地虚拟机运行一个Spark shell,它将连接到主机,并允许我执行简单的Scala代码。所以,下面是我在本地虚拟机上运行的命令:如何远程运行Apache Spark shell?

bin/spark-shell --master spark://spark01:7077 

shell运行到可以输入Scala代码的程度。它说执行者已被授予(x3 - 每个工人一个)。如果我偷看Master的UI,我可以看到一个正在运行的应用程序,Spark shell。所有工作人员都很活跃,使用了2/2个内核,并且为应用程序分配了512 MB(5 GB内存)。所以,我尝试执行下面的Scala代码:

sc.parallelize(1 to 100).count  

不幸的是,该命令不起作用。外壳将只打印相同的警告不休:

INFO SparkContext: Starting job: count at <console>:13 
INFO DAGScheduler: Got job 0 (count at <console>:13) with 2 output partitions (allowLocal=false) 
INFO DAGScheduler: Final stage: Stage 0(count at <console>:13) with 2 output partitions (allowLocal=false) 
INFO DAGScheduler: Parents of final stage: List() 
INFO DAGScheduler: Missing parents: List() 
INFO DAGScheduler: Submitting Stage 0 (Parallel CollectionRDD[0] at parallelize at <console>:13), which has no missing parents 
INFO DAGScheduler: Submitting 2 missing tasts from Stage 0 (ParallelCollectionRDD[0] at parallelize at <console>:13) 
INFO TaskSchedulerImpl: Adding task set 0.0 with 2 tasks 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 

继我研究这个问题,我已经证实,我现在用的主URL是相同的Web界面上的一个。我可以ping和ssh两种方式(集群到本地VM,反之亦然)。此外,我玩过执行器 - 内存参数(增加和减少内存)都无济于事。最后,我尝试禁用双方的防火墙(iptables),但我一直得到相同的错误。我正在使用Spark 1.0.2。

TL; DR是否可以远程运行Apache Spark shell(并且本能地远程提交应用程序)?如果是这样,我错过了什么?

编辑:我接过一看,工人日志,发现工人们已经很难找到星火:

ERROR org.apache.spark.deploy.worker.ExecutorRunner: Error running executor 
java.io.IOException: Cannot run program "/usr/bin/spark-1.0.2/bin/compute-classpath.sh" (in directory "."): error=2, No such file or directory 
... 

星火安装在不同的目录在我的本地虚拟机超过群集上。工作人员尝试查找的路径是本地虚拟机上的路径。有没有办法让我指定这个路径?或者他们必须到处都是一样的?

目前,我调整了我的目录以规避此错误。现在,在我有机会输入计数命令(Master removed our application: FAILED)之前,我的Spark Shell失败。所有的工人都有同样的错误:

ERROR akka.remote.EndpointWriter: AssociationError [akka.tcp://[email protected]:7078] -> [akka.tcp://[email protected]:53633]: 
Error [Association failed with [akka.tcp://[email protected]:53633]] 
[akka.remote.EndpointAssociationException: Association failed with [akka.tcp://[email protected]:53633] 
Caused by: akka.remote.transport.netty.NettyTransport$$anonfun$associate$1$$annon2: Connection refused: spark02/192.168.64.2:53633 

由于怀疑,我遇到了网络问题。我现在应该看什么?

+0

请问您可以尝试以下两件事情。 1.尝试从正在运行主节点的节点连接到主节点。 2.尝试用“IP地址”替换主机名。 – 2014-11-02 00:12:41

+0

您可以从远程机器连接到Spark群集。 Spark shell只是集群上运行的另一个Scala程序。 – 2014-11-02 00:14:03

+0

是的,这是可能的,应该工作。我怀疑网络问题。我不确定我的头顶,但我认为工作人员会尝试通过某个端口连接到本地计算机。从这些症状来看,我猜这是行不通的。也许你可以在工作日志中找到更多信息! – 2014-11-02 15:37:35

回答

2

我在火花的客户和火花集群解决这个问题。

检查您的网络,客户端A可以ping集群对方!然后在你的spark-env.sh客户端A

第一

export SPARK_MASTER_IP=172.100.102.156 
export SPARK_JAR=/usr/spark-1.1.0-bin-hadoop2.4/lib/spark-assembly-1.1.0-hadoop2.4.0.jar 

测试你的火花外壳采用集群模式中添加两个线路配置!

+0

第二个建议没有任何意义:运行'spark-shell'用' --deploy-mode cluster'导致'错误:集群部署模式不适用于Spark shell',并且该问题专门解决运行远程shell的问题。 – bluenote10 2016-08-14 10:01:54

0

我会建议编写一个简单的Scala或Java程序,在IDE中制作一个项目。

比方说,你已经创建了一个叫做“simpleapp”的项目,它具有这样的目录结构。

simpleapp 
- src/main/java 
    - org.apache.spark.examples 
    -SimpleApp.java 
- lib 
    - dependent.jars (you can put all dependent jars inside lib directory) 
- target 
    - simpleapp.jar (after compiling your source) 

在“SimpleApp.java”中创建SparkConf和SparkContext对象。

SparkConf conf = new SparkConf().setAppName(appName).setMaster("local[2]"); 
JavaSparkContext sc = new JavaSparkContext(conf); 

使用以下命令创建JAR文件。您可以在“target/classes”文件夹中找到SimpleApp.class文件。 cd到这个目录。

jar cfve file.jar SimpleApp.class 

将这个JAR文件放到您的项目的目标目录中。此JAR文件包含将您的作业提交给Spark时您的SimpleApp类的依赖关系。 现在进入你的spark目录。我正在使用spark-1.4.0-bin-hadoop2.6。你的cmd看起来像这样。

spark-1.4.0-bin-hadoop2.6> 

使用以下命令启动主站和辅助站。

spark-1.4.0-bin-hadoop2.6> ./sbin/start-all.sh 

如果这不起作用,那么分别启动主站和从站。

spark-1.4.0-bin-hadoop2.6> ./sbin/start-master.sh 
spark-1.4.0-bin-hadoop2.6> ./sbin/start-slaves.sh 

使用Spark Submit提交您的Spark程序。如果你有像我解释的结构,然后在课堂上传递这个论点。

--class org.apache.spark.examples.SimpleApp 

其他

--class SimpleApp 

最后提交你的星火计划项目。

spark-1.4.0-bin-hadoop2.6>./bin/spark-submit --class SimpleApp --master local[2] /home/hadoopnod/Spark_Java/target/file.jar 
+3

不想downvote,但这并没有解决“远程运行shell”的问题。 – bluenote10 2016-08-14 10:08:23

1

此问题可能是由网络配置引起的。它看起来像错误TaskSchedulerImpl: Initial job has not accepted any resources可以有好几个原因(见this answer):

  • 实际资源短缺
  • 主与工人之间的
  • 断开的通信主/工人和司机之间
  • 断开的通信

排除第一种可能性的最简单方法是使用直接在主服务器上运行的Spark shell运行测试。如果这样做,群集内的群集通信本身就很好,问题是由与驱动程序主机的通信引起的。为了进一步分析可以帮助寻找到工人的日志,其中包含的条目类似

16/08/14 09:21:52 INFO ExecutorRunner: Launch command: 
    "/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java" 
    ... 
    "--driver-url" "spark://[email protected]:37752" 
    ... 

和测试者是否可以建立与驾驶者的IP /端口的连接问题。除了一般的防火墙/端口转发问题之外,驱动程序可能会绑定到错误的网络接口。在这种情况下,您可以在启动Spark shell之前在驱动程序上导出SPARK_LOCAL_IP以绑定到不同的接口。

一些额外的引用: