我正在做一个简单的示例示例,其中引用了Internet中Java的Apache Spark中的单词计数,并且出现了以下错误:
引起原因:java.net.UnknownHostException:my.txt
您可以看到下面的代码作为参考!
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
public class MyCount {
public static void main(String[] args) {
// TODO Auto-generated method stub
String file = "hdfs://my.txt";
JavaSparkContext sc = new JavaSparkContext("local", "Simple App");
JavaRDD<String> lines = sc.textFile(file);
long nums = lines.count();
System.out.println(nums);
}
}
最佳答案
老问题,但是答案从未被接受,在我读这篇文章时,我的错误是将Spark的“本地”概念与“本地主机”混合在一起。
使用以下构造函数:JavaSparkContext(java.lang.String master, java.lang.String appName)
,您将需要使用:
JavaSparkContext sc = new JavaSparkContext("localhost", "Simple App");
但问题是使用“本地”。此外,HDFS文件名didn't specify a hostname:
"hdfs://SomeNameNode:9000/foo/bar/"
或"hdfs://host:port/absolute-path"
从1.6.2版本开始,JavaSparkContext的Javadoc并未显示任何让您直接指定集群类型的构造函数:
http://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/api/java/JavaSparkContext.html
JavaSparkContext的最佳构造函数需要一个SparkConf对象。为了使人们更容易理解,请构建一个SparkConf对象,然后将其传递给JavaSparkContext,以下示例设置了应用名称,指定Kryo序列化程序并设置了主模板:
SparkConf sparkConf = new SparkConf().setAppName("Threshold")
//.setMaster("local[4]");
.setMaster(getMasterString(masterName))
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.registerKryoClasses(kryoClassArray);
// create the JavaSparkContext now:
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
注意:备用
.setMaster("local[4]");
将使用OP可能正在尝试的本地模式。我有一个more extended answer here that addresses using hostnames vs. IP addresses以及更多用于设置您的SparkConf的信息