我正在尝试使用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();
}
}
答案 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
我使用的代码:
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");
等等。