无法在java spark中读取文件

时间:2016-08-03 11:15:03

标签: java hadoop apache-spark

我正在尝试使用eclipse在java上运行spark程序。它正在运行,如果我只是在控制台上打印的东西,但我无法使用textFile函数读取任何文件。 我在某处读过,只能使用HDFS读取文件,但我无法在本地系统中完成。 让我知道如何访问/读取文件,如果使用HDFS,那么如何在我的本地系统中安装HDFS,以便我可以发送文本文件。

这是我正在测试的代码,虽然这个程序工作正常,但是无法读取文件说输入路径不存在。

package spark;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;

import org.apache.spark.api.java.function.Function;

public class TestSpark {

    public static void main(String args[])
    {
        String[] jars = {"D:\\customJars\\spark.jar"};
        System.setProperty("hadoop.home.dir", "D:\\hadoop-common-2.2.0-bin-master");
        SparkConf sparkConf = new SparkConf().setAppName("spark.TestSpark")
                .setMaster("spark://10.1.50.165:7077")
                .setJars(jars);

        JavaSparkContext jsc = new JavaSparkContext(sparkConf);
        SQLContext sqlcon = new SQLContext(jsc);
        String inputFileName = "./forecaster.txt" ;
        JavaRDD<String> logData = jsc.textFile(inputFileName);
        long numAs = logData.filter(new Function<String, Boolean>() {

            @Override
            public Boolean call(String s) throws Exception {
                return s.contains("a");
            }
        }).count();

        long numBs = logData.filter(new Function<String, Boolean>() {
              public Boolean call(String s) { return s.contains("b"); }
            }).count();

         System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
        System.out.println("sadasdasdf");

        jsc.stop();
        jsc.close();
    }

}

我的文件结构: enter image description here

2 个答案:

答案 0 :(得分:1)

更新:您的文件名中没有.txt扩展名,并且您在应用程序中使用它。您应该将其用作String inputFileName = "forecaster" ;

如果file与java class TestSpark$APP_HOME)位于同一文件夹中:

String inputFileName = "forecaster.txt" ;

如果文件位于您的项目spark:

下的Data目录中
String inputFileName = "Data\\forecaster.txt" ;

或者使用完全限定的路径日志来自以下测试:

16/08/03 08:25:25 INFO HadoopRDD: Input split: file:/C:/Users/user123/worksapce/spark-java/forecaster.txt
~~~~~~~
String inputFileName = "file:/C:/Users/user123/worksapce/spark-java/forecaster.txt" ;

例如:我复制了您的代码并在我的本地环境中运行:

这是我的项目升级的方式,我将其作为:

运行
 String inputFileName = "forecaster.txt" ;

测试文件:

this is test file
aaa
bbb
ddddaaee
ewwww
aaaa
a
a
aaaa
bb

enter image description here

我使用的代码:

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;

public class TestSpark {

    public static void main(String args[])
    {
       // String[] jars = {"D:\\customJars\\spark.jar"};
       // System.setProperty("hadoop.home.dir", "D:\\hadoop-common-2.2.0-bin-master");
        SparkConf sparkConf = new SparkConf().setAppName("spark.TestSpark").setMaster("local");
                //.setMaster("spark://10.1.50.165:7077")
                //.setJars(jars);

        JavaSparkContext jsc = new JavaSparkContext(sparkConf);
        //SQLContext sqlcon = new SQLContext(jsc);
        String inputFileName = "forecaster.txt" ;
        JavaRDD<String> logData = jsc.textFile(inputFileName);
        long numAs = logData.filter(new Function<String, Boolean>() {

            @Override
            public Boolean call(String s) throws Exception {
                return s.contains("a");
            }
        }).count();

        long numBs = logData.filter(new Function<String, Boolean>() {

            public Boolean call(String s) { return s.contains("b"); }
            }).count();

         System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
        System.out.println("sadasdasdf");

        jsc.stop();
        jsc.close();
    }

}

答案 1 :(得分:1)

Spark需要架构和正确的路径才能理解如何读取文件。因此,如果您正在阅读HDFS,则应使用:

jsc.textFile("hdfs://host/path/to/hdfs/file/input.txt");

如果您正在读取本地文件(工作节点的本地文件,而不是驱动程序正在运行的计算机),则应使用:

jsc.textFile("file://path/to/hdfs/file/input.txt");

要阅读Hadoop存档文件(HAR),您应该使用:

jsc.textFile("har://archive/path/to/hdfs/file/input.txt");

等等。