Spark の基本的な学習ノート: Spark RDD ケース分析

1. ケース分析: Spark RDD は単語カウントを実装します

(1) 事例概要

ワードカウンティングは分散コンピューティングを学習するためのエントリープログラムです.MapReduceなど実装方法はたくさんあります.Sparkが提供するRDD演算子を使うとより簡単にワードカウンティングを実装できます.
IntelliJ IDEA で Maven によって管理される新しい Spark プロジェクトを作成し、Scala 言語を使用してプロジェクトに Spark の WordCount プログラムを記述し、最後にプロジェクトをパッケージ化して Spark クラスター (スタンドアロン モード) に送信して操作します。

(2) 実施手順

1. Maven によって管理される新しい Spark プロジェクトを作成する

IDEA で File→new→Project... を選択し、ポップアップ ウィンドウの左側で Maven アイテムを選択し、右側で Create fromarchetype チェック ボックスをオンにして、org.scala-tools.archetypes:scala-archetype を選択します。 -simple アイテムの下に表示されます (Maven プロジェクトのビルドに scala-archetype-simple テンプレートが使用されることを示します)。
ここに画像の説明を挿入

ポップアップ ウィンドウに GroupId と ArtifactId を入力し、バージョンのデフォルト設定をそのままにして、[次へ] ボタンをクリックします。
ここに画像の説明を挿入

ここに画像の説明を挿入

2. Scala と Spark の依存関係を追加する


ここに画像の説明を挿入
spark-shell を開始すると、Spark2.4.4 が Scala2.11.12 を使用してPom.xml ファイルに Scala2.11.12 と Spark 2.4.4 の依存関係を追加し、Maven ビルド プラグインを追加することがわかります。

<?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>net.py.spark</groupId>
    <artifactId>WordCount</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>2.4.4</version>
        </dependency>
    </dependencies>
    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!--设置Spark应用的入口类-->
                            <mainClass>net.hw.spark.WordCount</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.3.2</version>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

3. WordCount オブジェクトを作成する

net.py.spark パッケージに wordcount オブジェクトを作成する
ここに画像の説明を挿入

package net.py.spark

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object WordCount {
  def main(args: Array[String]): Unit = {
    // 创建SparkConf对象,存储应用程序配置信息
    val conf = new SparkConf()
      .setAppName("Spark-WordCount") // 设置应用程序名称,可在Spark WebUI中显示
      .setMaster("spark://master:7077") // 设置集群Master节点访问地址
    // 创建SparkContext对象,该对象是提交Spark应用程序的入口
    val sc = new SparkContext(conf)
    // 读取指定路径(程序执行时传入的第一个参数)的文件内容,生成一个RDD
    val rdd: RDD[String] = sc.textFile(args(0))
    // 对rdd进行处理
    rdd.flatMap(_.split(" ")) // 将RDD的每个元素按照空格进行拆分并将结果合并为一个新RDD
      .map((_, 1)) //将RDD中的每个单词和数字1放到一个元组里,即(word,1)
      .reduceByKey(_ + _) //对单词根据key进行聚合,对相同的key进行value的累加
      .sortBy(_._2, false) // 按照单词数量降序排列
      .saveAsTextFile(args(1))   //保存结果到指定的路径(取程序执行时传入的第二个参数)
    //停止SparkContext,结束该任务
    sc.stop();
  }
}

4. Spark アプリケーションをマスター仮想マシンにアップロードする

WordCount-1.0-SNAPSHOT.jar をマスター仮想マシンの /home/py ディレクトリにアップロードします。

5. HDFS サービスを開始する

コマンドを実行します: start-dfs.sh
ここに画像の説明を挿入

6.Spark クラスターを開始する

コマンドを実行します: $SPARK_HOME/sbin/start-all.sh
ここに画像の説明を挿入

7.ワードファイルをHDFSの指定ディレクトリにアップロード

ワードファイルを作成 word.txt

ここに画像の説明を挿入
HDFS の /wordcount ディレクトリにアップロード

8. WordCount プログラムを実行する

(1) クラスターで実行するアプリケーションを送信します

注文の実行:

[root@master home]# spark-submit --master spark://master:7077 -class net.py.spark.WordCount WordCount-1.0-SNAPSHOT.jar hdfs://master:9000/wordcount hdfs://master:9000/wordcount_output

(2) コマンドパラメータ解析

–master: Spark マスター ノードのアクセス パス。WordCountプログラムのsetMaster()メソッドでパスが指定されているので、このパラメータは省略できます。
–class: SparkWordCount プログラムのメイン クラスのフル アクセス パス (パッケージ名.クラス名)。
hdfs://master:9000/wordcount: 単語数のソース パス。このパスの下にあるすべてのファイルが統計に参加します。
hdfs://master:9000/wordcount_output: 統計結果の出力パス。MapReduce と同様に、このディレクトリは事前に存在してはならず、Spark が自動的に作成します。

(3) Spark WebUI インターフェイスでアプリケーション情報を表示する

アプリケーションの実行中に、Spark の WebUI http://master:8080/ にアクセスして、実行中のプログラムのステータス情報を表示できます (完成したアプリケーションを表示することもできます)。

おすすめ

転載: blog.csdn.net/py20010218/article/details/125366361