1 新建Maven项目

image
特别提醒,Maven项目中有GropId和ArtifactId。GroupId是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构。一般GruopId形如ncepu.com.cn。ArtifactId是项目的唯一的标识符,实际对应项目的名字,就是项目根目录的名称。
image

2 添加依赖包

spark-assembly-1.6.3-hadoop2.6.0.jar路径:/home/hadoop/spark-1.6.3-bin-hadoop2.6/lib(虚拟机中)
先将spark-assembly-1.6.3-hadoop2.6.0.jar从虚拟机中复制到本机。
File→Project Structure→Libraries→“+”→Java,将spark-assembly-1.6.3-hadoop2.6.0.jar添加进来。
image

3 测试IDEA和Spark的连通性

在src/main/java目录下新建Java类ConnectionUtil。
image
Run→Edit Confugurations
image
在Main class右侧点击“..."选择想要运行的类。
image

点击图示位置进行编译。
Run→Run"Connection Util“运行Connection Util类。
image
出现如图结果说明运行成功。

4 IDEA打包运行

准备一个txt文档,上传到HDFS上。
image
之前已经上传过,所以在此仅用text命令查看。
新建java类JavaWordCount。

import scala.Tuple2;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
public final class JavaWordCount {
    private static final Pattern SPACE = Pattern.compile(" ");
    public static void main(String[] args) throws Exception {
//      if (args.length < 1) {
//        System.err.println("Usage: JavaWordCount <file>");
//        System.exit(1);
//      }
        SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount")
                .setMaster("spark://master:7077")
                .set("spark.executor.memory", "512M");
        JavaSparkContext ctx = new JavaSparkContext(sparkConf);
        ctx.addJar("D:\\Users\\NCEPU\\IdeaProjects\\Test\\out\\artifacts\\Test_jar\\JavaWordCount.jar");
        String path = "hdfs://master:9000/user/hadoop/wordcount.txt";
        JavaRDD<String> lines = ctx.textFile(path);
        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterable<String> call(String s) {
                return Arrays.asList(SPACE.split(s));
            }
        });
        JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(String s) {
                return new Tuple2<String, Integer>(s, 1);
            }
        });
        JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer i1, Integer i2) {
                return i1 + i2;
            }
        });
        List<Tuple2<String, Integer>> output = counts.collect();
        for (Tuple2<?,?> tuple : output) {
            System.out.println(tuple._1() + ": " + tuple._2());
        }
        ctx.stop();
    }
}

将JavaWordCount类打包。
File→Project Structure→Artifacts→“+”→JAR→From module with dependencies。
image
特别需要注意的是,Output Directory是打包的jar包的输出路径。
输入main class入口函数名,将Output Layout下所有jar包删掉(因为spark运行环境已经包含了这些包),如果已经存在 META‐INF 要先将这个文件夹删除。
Build→Build Artifact进行打包。打包生成的jar包如图所示。
image

运行程序后,出现以下结果说明程序运行成功。
image

5 出现的问题

问题一:提示WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

++原因++:这个问题是因为内存不够。

++解决++:有如下两种可能的解决方法。
一是修改设置的内存
image
将这里的内存设置得小一点。
二是重启虚拟机。
问题二:java无法访问scala.Cloneable 找不到scala.Cloneable的类文件

++原因++:原来使用的是 spark‐2.1.0‐bin‐hadoop2.4 没有 spark‐assembly‐1.6.3‐hadoop2.6.0.jar 依赖包所致。

++解决++:因为原来是用的hadoop版本为 2.5.2 相应的依赖包官网已经不再支持,所以更新的平台的hadoop环境为 2.6.5 ,spark 2.X相应的文档很少,更改版本为 1.6.3 。

posted on 2017-08-18 16:40  lalabola  阅读(487)  评论(0编辑  收藏  举报