Spark从Blob中读取文本文件

时间:2019-07-01 13:37:36

标签: java apache-spark blob hdinsight

编写代码以通过Spark读取文本文件...在本地工作正常...但是在HDInsight中运行时会产生错误->从Blob读取文本文件

  

org.apache.spark.SparkException:作业由于阶段故障而中止:阶段0的任务0失败4次,最近一次失败:阶段0.0的任务0.3丢失(TID 5,wn1-hchdin.bpqkkmavxs0ehkfnaruw4ed03d.dx.internal .cloudapp.net,执行程序2):java.lang.AbstractMethodError:com.journaldev.sparkdemo.WordCounter $$ Lambda $ 17 / 790636414.call(Ljava / lang / Object;)Ljava / util / Iterator;       在org.apache.spark.api.java.JavaRDDLike $$ anonfun $ fn $ 1 $ 1.apply(JavaRDDLike.scala:125)       在org.apache.spark.api.java.JavaRDDLike $$ anonfun $ fn $ 1 $ 1.apply(JavaRDDLike.scala:125)       在scala.collection.Iterator $$ anon $ 12.nextCur(Iterator.scala:434)       在scala.collection.Iterator $$ anon $ 12.hasNext(Iterator.scala:440)       在scala.collection.Iterator $ class.foreach(Iterator.scala:893)       在scala.collection.AbstractIterator.foreach(Iterator.scala:1336)       在org.apache.spark.rdd.RDD $$ anonfun $ foreach $ 1 $ anonfun $ apply $ 28.apply(RDD.scala:927)       在org.apache.spark.rdd.RDD $$ anonfun $ foreach $ 1 $ anonfun $ apply $ 28.apply(RDD.scala:927)       在org.apache.spark.SparkContext $$ anonfun $ runJob $ 5.apply(SparkContext.scala:2074)       在org.apache.spark.SparkContext $$ anonfun $ runJob $ 5.apply(SparkContext.scala:2074)       在org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)       在org.apache.spark.scheduler.Task.run(Task.scala:109)       在org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:345)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)       在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)       在java.lang.Thread.run(Thread.java:748)

这是我的代码

    JavaSparkContext ct = new JavaSparkContext();
        Configuration config = ct.hadoopConfiguration();
        config.set("fs.azure", "org.apache.hadoop.fs.azure.NativeAzureFileSystem");
        config.set("org.apache.hadoop.fs.azure.SimpleKeyProvider", "<<key>>");

        JavaRDD<String> inputFile = ct.textFile("wasb://<<container-nam>>@<<account>>.blob.core.windows.net/directory/file.txt");

        JavaRDD<String> wordsFromFile = inputFile.flatMap(content -> Arrays.asList(content.split(" ")));

        wordsFromFile.foreach(cc ->{System.out.println("p :"+cc.toString());});

1 个答案:

答案 0 :(得分:0)

对于在本地运行的Spark,有一个官方的blog,其中介绍了如何从Spark访问Azure Blob存储。关键是您需要将Azure存储帐户配置为core-site.xml文件中与HDFS兼容的存储,并将两个jar hadoop-azure和azure-storage添加到您的类路径中,以便通过协议wasb [s]访问HDFS。您可以参考官方的tutorial来了解与wasb兼容的HDFS,以及有关blog的HDInsight配置的详细信息。

对于在Azure上运行的Spark,不同之处仅在于使用wasb访问HDFS,而在使用Spark创建HDInsight群集时,Azure已完成其他准备工作。列出文件的方法是listContext或SparkContext的wholeTextFiles

希望有帮助。