• Spark3学习入门【基于Java】


    Spark 是离线数据处理的一种大数据技术,和Flick相比数据处理要延后,因为Flick是实时数据处理,而Spark需要先读取数据到内存。

    Spark的库是基于Scala写的,虽然Scala也是运行在jvm上的,但是Spark提供的Java  api的能力和原生api并不完全相同,据说执行效率也有微弱差异。

    但是scala语法比较难,编码也不如Java规范,用的人和企业越来越少。为了更好推广和更好交接,我们也选择Java API。

    环境搭建

    要用spark的库有两种方法:官方下载或maven依赖。

    官方下载

    到apache下载网站 Downloads | Apache Spark 点击链接下载

    下载后解压到某位置。比如我放在 D:\Programs\spark-3.2.0-bin-hadoop3.2,这里就是SPARK_HOME,可以加到系统的环境变量里。

    里面的bin是可执行文件和脚本,jar就是Java的api包:

    里面有200+个jar,其中以spark开头的有21个。使用的时候把这个jar目录或者里面特定的jar包引入到项目即可:

    maven依赖进来

    在上面的下载页面可以同时看到maven的坐标

    依赖进来

    1. </dependencies><dependencies>
    2.     <dependency> <!-- Spark dependency -->
    3.         <groupId>org.apache.spark</groupId>
    4.         <artifactId>spark-core_2.12</artifactId>
    5.         <version>3.2.0</version>
    6.     </dependency>
    7. </dependencies>

    spark-core只是spark的核心和最重要的部分,但是它一般不能独立使用。它里面定义了spark的工作流程和算法,比较底层,提供给其他spark模块使用。

    安装hadoop

    spark不少功能都是依赖hadoop的,因为spark不提供数据存储的能力(它提供的能力是和map-reduce阶段类似的),那它读取的数据通常都是hdfs来的(当然也可以从其他路径来)。为了以后方便,可以提前安装好hadoop。

    从spark下载页面可以看到,和我们这个版本搭配的hadoop是版本3.3。

    Hadoop下载页面是 Apache Hadoop,下载后解压到特定目录,并添加环境变量HADOOP_HOME。

    小试牛刀

    1. 通过IDEA创建一个Maven项目,引入jar包或通过maven导入:<dependencies>
    2.     <dependency> <!-- Spark dependency -->
    3.         <groupId>org.apache.spark</groupId>
    4.         <artifactId>spark-sql_2.12</artifactId>
    5.         <version>3.2.0</version>
    6.     </dependency>
    7. </dependencies>

    注意这里引入的是最常用的spark-sql包,解压目录里也能找到。sql模块提供了数据帧和数据集 DataFrame和DataSet的处理,针对的是结构化数据。

    > 除了sql模块,还有streaming模块处理流式计算,MLlib处理机器学习,和处理图数据的GraphX。可能有之前就接触过spark的会说RDD,著名的弹性分布式数据集,这个已经过时了,被spark-sql取代

    编写程序:

    1. import org.apache.spark.sql.SparkSession;
    2. import org.apache.spark.sql.Dataset;
    3.  
    4. public class SimpleApp {
    5.     public static void main(String[] args) {
    6.         String logFile = "D:\\Programs\\spark-3.2.0-bin-hadoop3.2\\README.md";
    7.         SparkSession spark = SparkSession.builder().appName("Simple Application").master("local").getOrCreate();
    8.         Dataset<String> logData = spark.read().textFile(logFile).cache();
    9. rr
    10.         String a1 = "scala";
    11.         String a2 = "Scala";
    12.         long numAs = logData.filter((org.apache.spark.api.java.function.FilterFunction<String>) s -> s.contains(a1)).count();
    13.         long numBs = logData.filter((org.apache.spark.api.java.function.FilterFunction<String>) s -> s.contains(a2)).count();
    14.  
    15.         System.out.println("Lines with " + a1 + ": " + numAs + ", lines with " + a2 + ": " + numBs);
    16.  
    17.         spark.stop();
    18.     }
    19. }

    程序运行

    执行上面的main方法就可以看到控制台打印出某个文件里有某个单词的行数。

    > 这个程序经过我的改造,官方 Quick Start - Spark 3.2.0 Documentation (apache.org) 给的例子直接运行会报错,连编译都报错。另外只能使用Java8,刚开始使用的java 16总报错也修不好。
    

    任务提交

    spark运行的都是一个个任务,需要提交给spark环境。接下来我们把项目打包成jar提交给spark。

    执行mvn package,就会在target目录下生成Jar包。拿到它的绝对路径

    通过SPARK_HOME\bin\spark-submit.bat来提交:

    .\bin\spark-submit --class "SimpleApp" --master local[4] 绝对路径.jar

    这样可以执行完并打印计数,但是我本地会报错,执行完的时候要删除零时文件删不掉

    在IDEA中可以成功删掉,在cmd中用管理员也删不掉

    下一步

    接下来开始学习spark sql和spark streaming。

    学习网站:Spark SQL and DataFrames - Spark 3.2.0 Documentation (apache.org)

    学习视频:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili

  • 相关阅读:
    Maven报错,没有有效的生命周期
    6张图解释IO流
    传统Java JDBC
    快速杀死占用8080端口进程的批处理(kill-8080.bat)
    ubuntu环境配置终极解答
    Linux系统下Java开发环境的配置(未完...)
    Linux常用命令及操作(第二弹)
    Linux下安装Mysql
    Linux常用命令及操作
    int转LPCTSTR
  • 原文地址:https://www.cnblogs.com/somefuture/p/15636947.html
Copyright © 2020-2023  润新知