软件环境:
spark-1.6.3-bin-hadoop2.6、hadoop-2.6.4、jdk1.7.0_67、IDEA14.1.5 ;
Hadoop集群采用伪分布式安装,运行过程中只启动HDFS;Spark只启动一个Worker;使用虚拟机搭建Hadoop、Spark集群;Idea直接安装在Win10上;192.168.128.128是虚拟机ip;本机ip是:192.168.0.183;
Java连接Spark集群,如果采用YARN的方式,可以参考:Java Web提交任务到Spark ;写此篇的初衷是,在使用的过程中发现使用YARN调用Spark集群效率太低,所以尝试使用Java直接连接Spark Standalone集群。同时,需要说明一点,这里使用的是一个节点,如果使用多个节点情况可能有所不同。
本次测试一共进行了5次实验,最终达到一个既可以连接Spark Standalone集群,同时可以监控该任务的目的。所有代码可以在 https://github.com/fansy1990/JavaConnectSaprk01 下载。
任务1:设置master直接连接
1.1. 创建Scala工程
设置SDK、JDK以及spark-assembly的jar包到Classpath,创建好的工程如下:
1.2 创建示例程序
这里使用的是单词计数程序,代码如下:
package demo
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by fansy on 2017/7/5.
*/
object WordCount {
def main(args: Array[String]) {
val input = "hdfs://192.168.128.128:8020/user/root/magic"
val output =""
val appName = "word count"
val master = "spark://192.168.128.128:7077"
val conf = new SparkConf().setAppName(appName).setMaster(master)
val sc = new SparkContext(conf)
val line = sc.textFile(input)
line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect().foreach(println)
sc.stop()
}
}
这里面直接设置spark集群中的地址,然后连接运行任务,运行完成后,执行sc.stop,关闭SparkContext,但是运行后出现错误:
ClassNotFound错误,出现这个错误,肯定是类找不到了,为什么找不到呢?
1.3 问题分析
如果要分析这个问题,那么需要连接Spark执行过程,看日志:
从日志中可以看出,程序运行后,会先去连接Master