对于一个bash大师来说,这将是一个非常简单的免费赠品:
题
使用bash,如何从目录中的所有文件中创建类路径?
细节
给定一个目录:
LIB=/path/to/project/dir/lib
Run Code Online (Sandbox Code Playgroud)
它只包含*.jar文件,例如:
junit-4.8.1.jar
jurt-3.2.1.jar
log4j-1.2.16.jar
mockito-all-1.8.5.jar
Run Code Online (Sandbox Code Playgroud)
我需要在表单中创建一个冒号分隔的classpath变量:
CLASSPATH=/path/to/project/dir/lib/junit-4.8.1.jar:/path/to/project/dir/lib/jurt-3.2.1.jar:/path/to/project/dir/lib/log4j-1.2.16.jar:/path/to/project/dir/lib/mockito-all-1.8.5.jar
Run Code Online (Sandbox Code Playgroud)
一些几乎表达我正在寻找的逻辑的seudo代码将遵循:
for( each file in directory ) {
classpath = classpath + ":" + LIB + file.name
}
Run Code Online (Sandbox Code Playgroud)
通过bash脚本实现此目的的简单方法是什么?
我在独立群集上运行spark应用程序时遇到问题.(我使用spark 1.1.0版本).我通过命令成功运行主服务器:
bash start-master.sh
Run Code Online (Sandbox Code Playgroud)
然后我按命令运行一个worker:
bash spark-class org.apache.spark.deploy.worker.Worker spark://fujitsu11:7077
Run Code Online (Sandbox Code Playgroud)
在master的web UI上:
http://localhost:8080
Run Code Online (Sandbox Code Playgroud)
我明白了,那个主人和工人正在奔跑.
然后我从Eclipse Luna运行我的应用程序.我成功连接到cluster by命令
JavaSparkContext sc = new JavaSparkContext("spark://fujitsu11:7077", "myapplication");
Run Code Online (Sandbox Code Playgroud)
并且在该应用程序工作之后,但当程序实现以下代码时:
JavaRDD<Document> collectionRdd = sc.parallelize(list);
Run Code Online (Sandbox Code Playgroud)
它崩溃了以下错误消息:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 7 in stage 0.0 failed 4 times, most recent failure: Lost task 7.3 in stage 0.0 (TID 11, fujitsu11.inevm.ru):java.lang.ClassNotFoundException: maven.maven1.Document
java.net.URLClassLoader$1.run(URLClassLoader.java:366)
java.net.URLClassLoader$1.run(URLClassLoader.java:355)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:354)
java.lang.ClassLoader.loadClass(ClassLoader.java:425)
java.lang.ClassLoader.loadClass(ClassLoader.java:358)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:270)
org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:59)
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
java.io.ObjectInputStream.readArray(ObjectInputStream.java:1706)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1344)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:500)
org.apache.spark.rdd.ParallelCollectionPartition.readObject(ParallelCollectionRDD.scala:74) …Run Code Online (Sandbox Code Playgroud) 在Spark文档中提交应用程序时,从1.6.0及更早版本开始,目前尚不清楚如何指定--jars参数,因为它显然不是冒号分隔的类路径而不是目录扩展.
文档说"捆绑jar的路径,包括你的应用程序和所有依赖项.URL必须在集群内部全局可见,例如,hdfs://路径或所有节点上都存在的file://路径. "
问题:在$ SPARK_HOME/bin的spark-submit脚本中使用--jars提交类路径的所有选项有哪些?任何未记录的内容可以作为文档的改进提交?
我问,因为当我测试 - 今天的时候,我们必须明确地提供每个jar的路径:
/usr/local/spark/bin/spark-submit --class jpsgcs.thold.PipeLinkageData ---jars=local:/usr/local/spark/jars/groovy-all-2.3.3.jar,local:/usr/local/spark/jars/guava-14.0.1.jar,local:/usr/local/spark/jars/jopt-simple-4.6.jar,local:/usr/local/spark/jars/jpsgcs-core-1.0.8-2.jar,local:/usr/local/spark/jars/jpsgcs-pipe-1.0.6-7.jar /usr/local/spark/jars/thold-0.0.1-1.jar
Run Code Online (Sandbox Code Playgroud)
我们选择在每个worker上的/ usr/local/spark/jars中使用所有jar预填充集群,似乎如果没有提供local:/ file:/或hdfs:那么默认为file:/并且驱动程序使驱动程序运行的Web服务器上的jar可用.我选择了本地,如上所述.
而且似乎我们不需要将主jar放在--jars参数中,我还没有测试过最后一个参数中的其他类(application-jar arg per docs,即/ usr/local/spark/jars/thold-0.0.1-1.jar)被发送给worker,或者如果我需要将application-jar放在-jars路径中以获取未在--class之后命名的类.
(并且使用--deploy-mode客户端使用Spark独立模式授予,您还必须在每个worker上放置驱动程序的副本,但您不知道哪个worker会运行驱动程序)