大数据框架学习-spark (1)

170 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

spark 简介和安装

首先我们下载一下scala, hadoop的环境安装在前文的几个部分已经有介绍,这里就不再多言了。 找到官网:www.scala-lang.org/download/2.… 点击下载以后解压。之后编辑一下配置

#编辑配置文件
vim ~/.bash_profile

#增加环境变量
SCALA_HOME=/Users/xxx/Documents/Develop/scala-2.11.12
export PATH=$PATH:$SCALA_HOME/bin

#使环境变量生效
source  ~/.bash_profile

然后查看一下:

scala -version

屏幕快照 2022-06-07 下午10.54.18.png

在 镜像站下载一下spark mirrors.bfsu.edu.cn/apache/spar… 执行如下命令打开配置文件:

source ~/.bash_profile

添加如下配置

export SPARK_HOME=你的spark路径
export PATH=$PATH:$SPARK_HOME/bin

使用下述命令使配置生效

source ~/.bash_profile

使用spark-shell就可以启动:

屏幕快照 2022-06-07 下午11.35.05.png 用浏览器访问http://localhost:4040/jobs/ 可以查看spark的任务信息;

spark rdd-api简单研究

RDD,是 Spark 中最基础的抽象。它表示了一个可以并行操作的、不可变的、被分区了的元素集合。用户不需要关心底层复杂的抽象处理,直接使用方便的算子处理和计算就可以了

首先我们要研究一下spark rdd-api的一些简单的运用,只有了解了api才好进行下面的计算。

flatMap方法:

public static void flatMap() {
    final List<String> list = Arrays.asList("BANNA APPLE", "MElON ORANGE");
    final JavaRDD<String> rdd = sc.parallelize(list);

    System.out.println("Lambda表达式实现:");
    rdd.flatMap(names -> Arrays.asList(names.split(" ")).iterator())
            .map(name -> "Hello " + name)
            .foreach(name -> println(name));
}

rdd.flatMap主要用于处理原来的初始JavaRDD,输入输出为一比多

运行的结果如下

屏幕快照 2022-06-13 下午11.05.17.png

mapToPair方法 以及aggregateByKey方法:

    final List<String> list = Arrays.asList("you,jump", "i,jump");
    final JavaRDD<String> rdd = sc.parallelize(list);

    System.out.println("Lambda表达式实现:");
    rdd.flatMap(lines -> Arrays.asList(lines.split(",")).iterator())
            .mapToPair(word -> new Tuple2<>(word, 1))
            .aggregateByKey(0, (v1, v2) -> v1 + v2, (v1, v2) -> v1 + v2)
            .foreach(v -> println(v._1 + " -> " + v._2));

}

mapToPair方法 返回Tuple类型的数据,把原有的 rdd类型返回为 javaPairRdd,对数据进行初步的处理。 aggregateByKey()是先对每个partition中的数据根据不同的Key进行aggregate,然后将结果进行shuffle,完成各个partition之间的aggregate。

屏幕快照 2022-06-13 下午11.09.01.png

方法进行了一个简单的统计。上文的两个rdd方法已经可以支持我们完成这次需要的功能。

spark rdd-索引

首先我们创建好spark rdd的上下文:

//创建sparkconf 和JavaSparkContext
public static  SparkConf conf = new SparkConf().setMaster("local").setAppName("test");
public static JavaSparkContext sc = new JavaSparkContext(conf);

然后通过地址把数据导入我们的javaRdd 也就是spark的java rddapi数据结构:

String input = "/Users/xuejiameng/java_big_data/spark/data/";
JavaRDD<String> unionrdd = sc.emptyRDD();
JavaPairRDD<String, String> wordFileNameRDD = null;
int num =0;
    while (num<=2){
        String file_name = input+num; //文件名称
        JavaRDD<String> rdd1 = sc.textFile(file_name);
        int fileName = num;
        //4.将遍历的多个rdd拼接成1个Rdd
        unionrdd=unionrdd.union(rdd1);;
       wordFileNameRDD=
                unionrdd.flatMap(lines -> Arrays.asList(lines.split(" ")).iterator()).mapToPair(word -> new Tuple2<>(word,String.valueOf(fileName)));
        num++;
    }

导入以后把文件的名称直接拼在我们的数据后面

JavaPairRDD<Tuple2<String, String>, Integer> wordFileNameCountPerPairs = wordFileNameRDD.mapToPair(wordFileNamePair -> new Tuple2<>(wordFileNamePair, 1))
        .reduceByKey(Integer::sum);
JavaPairRDD<String, Tuple2<String, Integer>> wordCountPerFileNamePairs = wordFileNameCountPerPairs.mapToPair(wordFileNameCountPerPair -> new Tuple2<>(wordFileNameCountPerPair._1._1, new Tuple2<>(wordFileNameCountPerPair._1._2, wordFileNameCountPerPair._2)));
JavaPairRDD<String, String> result = wordCountPerFileNamePairs.groupByKey().mapToPair(wordCountPerFileNamePairIterator -> new Tuple2<>(wordCountPerFileNamePairIterator._1, StringUtils.join(wordCountPerFileNamePairIterator._2.iterator(), ','))).sortByKey();

然后计算,文件中出现的词频,以及文件的顺序进行倒排

然后最后打印出我们的结果:

结果如图所示 屏幕快照 2022-06-13 上午12.29.13.png

打包jar以后运行:

./spark-submit --class Test.Test
--master spark://你的ip:7077
--deploy-mode cluster
/Users/xuejiameng/java_big_data/spark/out/artifacts/test/test.jar

首先我尝试了使用Structure的artifacts 打jar 包,一直报一个异常:

Error: Failed to load class Test.

找了很多办法也难以解决,直接在pom文件下添加:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

然后用maven package打包运行

./spark-submit --class Test.SparkCount --master spark://192.168.2.40:7077 /Users/xuejiameng/java_big_data/spark/target/spark-1.0-SNAPSHOT.jar

直接就运行成功了。有时候网上找的这些文章可能是比较过时的,要举一反三,利用平时经验进行汇总使用。

屏幕快照 2022-06-14 上午12.19.17.png