Spark入門詳解(一)-Spark簡介

個人博客原文鏈接

簡介

Spark是基於內存計算的大數據分佈式計算框架。Spark基於內存計算,提供可交互查詢方式,提供近實時處理方式,同時保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量廉價硬件之上,形成集羣。

Spark使用Scala語言進行實現,它是一種面向對象、函數式編程語言,能夠像操作本地集合對象一樣輕鬆地操作分佈式數據集(Scala提供一個稱爲Actor的並行模型,其中Actor通過它的收件箱來發送和接收非同步信息而不是共享數據,該方式被稱爲:Shared Nothing模型)。

特點

  1. 運行速度快
    數據從內存中讀取,理論上速度可以高達HadoopMapReduce的100多倍。

  2. 適用性強

    • 支持3種語⾔言的API:scala、java、python,特別是Scala是一種高效、可拓展的語言,能夠用簡潔的代碼處理較爲複雜的處理工作。
    • 能夠讀取HDFS、Cassandra和HBase等離線數據。
    • 能夠讀取Kafka、Flume和Kinesis等實時數據。
    • 能夠以Mesos、YARN或Standalone作爲資源管理器調度JOB,進行集羣資源的合理分配和容錯,來完成Spark應用程序的計算。
  3. 通用性強
    Spark生態圈即BDAS(伯克利數據分析棧)包含了Spark Core、Spark SQL、MLLib、GraphX、Spark Streaming和Structured Streaming等組件,提供離線計算、實時計算、圖形化處理和機器學習等能力,能夠無縫的集成並提供一站式解決方案。
    Spark生態圈架構圖

    • Spark Core:包含Spark的基本功能。尤其是定義RDD的API、操作以及這兩者上的動作。其他Spark的庫都是構建在RDD和Spark Core之上的。

    • Spark SQL:提供Hive查詢語言(HiveQL)以及SQL查詢語言(如Mysql)與Spark進行交互的API。每個數據庫表被當做一個RDD,Spark SQL查詢被轉換爲Spark Core操作。

    • Spark Streaming:對實時數據流進行處理和控制。Spark Streaming允許程序能夠像普通RDD一樣處理實時數據。

    • Structured Streaming:以結構化的方式操作流式數據,能夠像使用Spark SQL處理批處理一樣,處理流數據。基於Event-Time,相比於SparkStreaming的Receive-Time更精確。

    • GraphX:控制圖、並行圖操作和計算的一組算法和工具的集合。GraphX擴展了RDD API,包含控制圖、創建子圖、訪問路徑上所有頂點的操作。

    • MLlib:一個常用機器學習算法庫,算法被實現爲對RDD的Spark操作。這個庫包含可擴展的學習算法,比如分類、迴歸等需要對大量數據集進行迭代的操作。

Spark和Hadoop的區別

  1. Hadoop有兩個核心模塊,分佈式存儲模塊HDFS和分佈式計算模塊MapReduce。

  2. Spark本身並沒有提供分佈式存儲能力,因此Spark的數據存儲大多依賴於Hadoop的分佈式文件系統HDFS。

  3. Hadoop的MapReduce與Spark都可以進行數據計算,而相比於MapReduce,Spark擁有DAG執行引擎,支持在內存中對數據進行迭代計算。官方提供的數據表明,如果數據由磁盤讀取,速度是MapReduce的10倍以上,如果數據從內存中讀取,速度可以高達100多倍。

  4. Spark的容錯性高,通用性好。

Spark的適用場景

  • Spark是基於內存的迭代計算框架,適用於需要多次操作特定數據集的應用場合。需要反覆操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小
  • 由於RDD的特性,Spark不適用那種異步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合
  • 數據量不是特別大,但是要求實時統計分析需求

Spark項目的pom.xml文件

環境:intellij idea 2017.3.4 + maven 3.5.0
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>spark</groupId>
    <artifactId>spark</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--<properties>-->
        <!--<scala.version>2.11.8</scala.version>-->
    <!--</properties>-->

    <!--引入依賴的jar包-->
    <dependencies>
        <!--spark-core在資源庫的座標信息-->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.3.2</version>
        </dependency>
        <!--spark-sql在資源庫的座標信息-->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.databricks</groupId>
            <artifactId>spark-avro_2.11</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>
    
    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-my-jar-with-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章