我使用spark读取了一个文本文件并将其保存在JavaRDD中,并尝试打印保存在RDD中的数据。我在具有一个主设备和两个从设备的集群中运行我的代码。但是我遇到了异常,例如, 容器超出阈值,同时遍历RDD。该代码可以在独立模式下完美运行。
我的代码:
SparkContext sc = new SparkContext("spark://master.com:7077","Spark-Phoenix");
JavaSparkContext jsc = new JavaSparkContext(sc);
JavaRDD<String> trs_testing = jsc.textFile("hdfs://master.com:9000/Table/sample");
//using iterator
Iterator<String> iStr= trs_testing.toLocalIterator();
while(iStr.hasNext()){ //here I am getting exception
System.out.println("itr next : " + iStr.next());
}
//using foreach()
trs_testing.foreach(new VoidFunction<String>() {//here I am getting exception
private static final long serialVersionUID = 1L;
@Override public void call(String line) throws Exception {
System.out.println(line);
}
});
//using collect()
for(String line:trs_testing.collect()){//here I am getting exception
System.out.println(line);
}
//using foreachPartition()
trs_testing.foreachPartition(new VoidFunction<Iterator<String>>() {//here I am getting exception
private static final long serialVersionUID = 1L;
@Override public void call(Iterator<String> arg0) throws Exception {
while (arg0.hasNext()) {
String line = arg0.next();
System.out.println(line);
}
}
});
例外:
错误 TaskSchedulerImpl master.com上的执行程序0丢失:远程RPC 客户已取消关联 。可能是由于 容器超出阈值 或网络问题。检查驱动程序日志中是否有WARN消息。错误 TaskSchedulerImpl在slave1.com上丢失了执行程序1:远程RPC客户端 解散。可能是由于容器超出阈值,或者 网络问题。检查驱动程序日志中是否有WARN消息。错误 TaskSchedulerImpl在master.com上丢失了执行器2:远程RPC客户端 解散。可能是由于容器超出阈值,或者 网络问题。检查驱动程序日志中是否有WARN消息。错误 TaskSchedulerImpl在slave2.com上丢失了执行程序3:远程RPC客户端 解散。可能是由于容器超出阈值,或者 网络问题。检查驱动程序日志中是否有WARN消息。错误 0.0阶段中的TaskSetManager任务0失败4次;放弃工作 线程“主要” org.apache.spark.SparkException中的异常:作业 由于阶段失败而中止:阶段0.0中的任务0失败4次,大多数 最近失败:在阶段0.0中丢失任务0.3(TID 3,slave1.com): ExecutorLostFailure(执行程序3退出,原因之一是正在运行 任务)原因:远程RPC客户端已取消关联。可能是由于 容器超过阈值或网络问题。检查驱动程序日志 用于警告消息。驱动程序堆栈跟踪:位于 org.apache.spark.scheduler.DAGScheduler.org $ apache $ spark $ scheduler $ DAGScheduler $$ failJobAndIndependentStages(DAGScheduler.scala:1454) 在 org.apache.spark.scheduler.DAGScheduler $$ anonfun $ abortStage $ 1.apply(DAGScheduler.scala:1442) 在 org.apache.spark.scheduler.DAGScheduler $$ anonfun $ abortStage $ 1.apply(DAGScheduler.scala:1441) 在 scala.collection.mutable.ResizableArray $ class.foreach(ResizableArray.scala:59) 在scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) 在 org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1441) 在 org.apache.spark.scheduler.DAGScheduler $$ anonfun $ handleTaskSetFailed $ 1.apply(DAGScheduler.scala:811) 在 org.apache.spark.scheduler.DAGScheduler $$ anonfun $ handleTaskSetFailed $ 1.apply(DAGScheduler.scala:811) 在scala.Option.foreach(Option.scala:257)在 org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:811) 在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1667) 在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1622) 在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1611) 在org.apache.spark.util.EventLoop $$ anon $ 1.run(EventLoop.scala:48) 在 org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:632) 在org.apache.spark.SparkContext.runJob(SparkContext.scala:1890)处 org.apache.spark.SparkContext.runJob(SparkContext.scala:1903)在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1916)在 org.apache.spark.rdd.RDD $$ anonfun $ take $ 1.apply(RDD.scala:1324)在 org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:151) 在 org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:112) 在org.apache.spark.rdd.RDD.withScope(RDD.scala:358)在 org.apache.spark.rdd.RDD.take(RDD.scala:1298)在 org.apache.spark.rdd.RDD $$ anonfun $ first $ 1.apply(RDD.scala:1338)在 org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:151) 在 org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:112) 在org.apache.spark.rdd.RDD.withScope(RDD.scala:358)在 org.apache.spark.rdd.RDD.first(RDD.scala:1337)在 com.test.java.InsertE.main(InsertE.java:147)
答案 0 :(得分:0)
当您在本地系统/独立模式下运行Spark Job时,所有数据将位于同一台计算机上,因此您可以迭代并打印数据。
当Spark Job在集群模式/环境下运行时,数据将被拆分成多个片段并分发到集群中的所有计算机(RDD-弹性分布式数据集)。因此,要以这种方式进行打印,您将必须使用 foreach() 函数。
尝试一下:
trs_testing.foreach(new VoidFunction<String>(){
public void call(String line) {
System.out.println(line);
}
});
答案 1 :(得分:0)
我找到了解决方案。我正在通过计算机执行代码,而我的主服务器和从服务器却在远程服务器上运行。我将代码导出到远程服务器,最终能够处理数据。