spark流處理入門實踐,初體驗跟flink差不多

1.spark簡介

彌補了hoodop流處理不足,性能優於hoodop,活躍度高於flink,提供了一站式大數據處理方案:

支持批處理(Spark Core)。Spark Core 是 Spark 的核心功能實現,包括:SparkContext 的初始化(DriverApplication 通過 SparkContext 提交)、部署模式、存儲體系、任務提交與執行、計算引擎等。

支持交互式查詢(Spark SQL)。Spark SQL 是 Spark 來操作結構化數據的程序包,可以讓我們使用 SQL 語句的方式來查詢數據,Spark 支持多種數據源,包含 Hive 表,parquet 以及 JSON等內容。

支持流式計算(Spark Streaming)。與 MapReduce 只能處理離線數據相比,Spark 還支持實時的流計算。Spark 依賴 Spark Streaming 對數據進行實時的處理。

支持機器學習(Spark MLlib)。提供機器學習相關的統計、分類、迴歸等領域的多種算法實現。其一致的 API 接口大大降低了用戶的學習成本。

支持圖計算(Spark GraghX)。提供圖計算處理能力,支持分佈式, Pregel 提供的 API 可以解決圖計算中的常見問題。

支持 Python 操作--PySpark

支持 R 語言--SparkR 
————————————————
原文鏈接:https://blog.csdn.net/qq_1018944104/article/details/85629580

2.單機版安裝部署

官網http://spark.apache.org/downloads.html清華鏡像下載,wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz  解壓,啓動: ./sbin/start-all.sh ,瀏覽器訪問dashboard:http://192.168.203.132:8081(8080佔用port自動修改爲8081)

3.啓動官方demo 及交互終端,查看dashboard

進入bin目錄
方式1  ./run-example SparkPi 10
方式2:./spark-submit  --class org.apache.spark.examples.SparkPi --master spark://192.168.203.132:7077 --executor-memory 512m  --total-executor-cores 1 ../examples/jars/spark-examples_2.11-2.4.5.jar

spark-shell交互終端:可以直接使用sc 和spark兩個對象

1.啓動終端
./spark-shell  --master spark://192.168.203.132:7077 --executor-memory 512m 
--total-executor-cores 1 

2.修改日誌級別
sc.setLogLevel(“info”)  

3.運行wordcount標準輸出
sc.textFile("./test.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).foreach(print)

4.運行wordcount輸出到hdfs
sc.textFile("hdfs://myha01/spark/wc/input/words.txt").flatMap(_.split(" 
")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://192.168.203.132/spark/wc/output")

,控制檯看不到word count結果,需要去dashboard看,可以看已完成及正在進行的spark-shell,再點進入每個job,即可看到job的

stdout ,跟flink玩法基本一致。

 

4.自定義spark job,套路完全雷同flink

<?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>test-spark</groupId>
    <artifactId>test-spark</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <spark.version>2.4.5</spark.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
    </dependencies>

</project>

main方法定義job,api比flink豐富,且更像jdk8的api.如下爲本地啓動的wordcount,linux啓動注意修改輸入源,setMaster改爲dashboard的“spark://192.168.203.132:7077”即可被監控。啓動命令:

./spark-submit  --class test.SparkWordCount --master spark://192.168.203.132:7077 --executor-memory 512m     --total-executor-cores 1 ../examples/jars/spark.jar /root/test.txt /root/result

  最後兩個參數分別爲main方法的args[0] args[1] 。spark沒有flink的dashboard那樣的上傳jar啓動job操作

package test;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.mortbay.util.ajax.JSON;
import scala.Tuple2;

import java.util.Arrays;
import java.util.List;

public class SparkWordCount {
    public static void main(String[] args) {
        //輸入文件與輸出文件可以通過啓動命令傳入:args[0]
        String input = args.length >= 2 ? args[0] : "/root/test.txt";
        String output = args.length >= 2 ?args[1] : "/root/result";
        SparkConf conf = new SparkConf()
                .setMaster("local")  //linux設置爲dashboard的master地址即可被監控,設置錯也不會報錯
                .setAppName(SparkWordCount.class.getSimpleName());
        JavaSparkContext sparkContext = new JavaSparkContext(conf);
        //讀取文件wordcount後輸出
        List<Tuple2<Integer, String>> topK = sparkContext.textFile(input)
                .flatMap(str -> Arrays.asList(str.split("\n| ")).iterator())
                .mapToPair(word -> new Tuple2<String, Integer>(word, 1)) 
                .reduceByKey((integer1, integer2) -> integer1 + integer2)
                .filter(tuple2 -> tuple2._1.length() > 0)
                .mapToPair(tuple2 -> new Tuple2<>(tuple2._2, tuple2._1))  //單詞與頻數倒過來爲新二元組,按頻數倒排序取途topK
                .sortByKey(false)
                .take(10);
        for (Tuple2<Integer, String> tuple2 : topK) {
            System.out.println(JSON.toString(tuple2));
        };
        sparkContext.parallelize(topK).coalesce(1).saveAsTextFile(output);
        //關閉資源
        sparkContext.close();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章