在群集模式下读取文本文件时发生异常

时间:2018-08-21 12:56:05

标签: apache-spark cluster-computing rdd

我使用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)

2 个答案:

答案 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)

我找到了解决方案。我正在通过计算机执行代码,而我的主服务器和从服务器却在远程服务器上运行。我将代码导出到远程服务器,最终能够处理数据。