《Spark》-----Sparkの基本

目次

1. Spark の概要

1.1 スパークとは何ですか?

1.2. スパークの特徴

1.3. Spark エコシステム

1.4. Spark コアのコンポーネント

1.5. Spark のインストールプロセス

1.5.1. 基本環境、Linux システム、Java 環境、Hadoop 環境のインストール

1.5.2. Spark ファイルをダウンロードして解凍します。

1.5.3、プロファイルの編集

1.5.4、Spark シェルの実行

2. スパーククラスターの構築

2.1. Spark デプロイメントモード

2.2. Spark On YARN を選ぶ理由

2.3. Spark On YARN モード

2.4. Sparkの開始

3. Scalaの基本構文とメソッド関数

3.1. Scalaの変数定義やループなどの基本的な構文

3.1.1. 変数の定義

 3.1.2、If ループ

 3.1.3、Forループ

 3.1.4、Do while ループ

3.2. 変更可能なコレクションと不変のコレクション

3.2.1. 不変コレクションの基本構文

 3.2.2. 可変コレクションの基本構文

3.3. 可変配列と不変配列

3.3.1. 不変配列の基本文法

3.3.2. 変数配列の基本構文

3.4. 変更可能リストと不変更リスト

3.4.1. 不変リストの基本文法

3.4.2. 変数Listの基本構文

3.5、タプル

3.6. 変更可能および不変更のマッピング (マップ)

3.6.1. 不変マップの基本文法

3.6.2. 変数 Map の基本構文

4、オブジェクト指向

4.1、オブジェクト指向とは

4.2、クラスとは

4.3、オブジェクトとは何か

4.4、クラスとオブジェクトの基本構造

4.5. コンストラクター

4.6. サンプルクラスとサンプルオブジェクト

5、Spark RDD プログラミング

5.1、RDD変換動作

5.2、RDDアクション動作

5.3、RDDパーティション

5.4、RDDキャッシュ(永続化)

5.5. RDDキーと値のペアの操作と読み書き方法

5.6. 実験

6. スパークSQL

6.1、データフレームとは何ですか

6.2、DataFrame、DataSet、RDD間の変換

6.2.1. RDD から DataFrame へ

6.2.2. データフレームからRDDへ


1. Spark の概要

1.1 スパークとは何ですか?

Apache Spark は、大規模なデータ処理用に設計された高速かつ汎用のコンピューティング エンジンです。

1.2. スパークの特徴

1. 高速な実行速度: メモリ内のデータの反復計算をサポートします。

2. 優れた使いやすさ: Scala、Java、Python、その他の言語での簡潔な構文での記述をサポート

3. 強力な汎用性: Spark エコシステムには豊富なコンポーネントが含まれています

4. どこでも実行: Spark は適応性が高く、さまざまなデータ ソースにアクセスできます。

1.3. Spark エコシステム

Spark エコシステムは、Spark Core をコアとして採用し、HDFS、Amazon S3、および HBase からデータを読み取り、MESOS、YARN、および独自のスタンドアロンをリソース マネージャーとして使用して、アプリケーションの計算を完了するジョブをスケジュールします。アプリケーションは、Spark Shell/Spark Submit バッチ処理、Spark Streaming リアルタイム処理アプリケーション、SparkSQL クエリ、MLlib 機械学習、GraphX グラフ処理などのさまざまなコンポーネントから派生します。

1.4. Spark コアのコンポーネント

Spark コアは Spark フレームワークの中核部分であり、タスク スケジューリング、メモリ管理、エラー回復、ストレージ システム対話モジュールなどの Spark の基本機能を実現します。

1) 有向非巡回グラフ (DAG) 用の分散並列コンピューティング フレームワークを提供し、複数の反復計算またはデータ共有をサポートするキャッシュ メカニズムを提供します。これにより、反復計算間のデータ読み取りのオーバーヘッドが大幅に削減されます。

2) Spark で導入された RDD は、複数のコンピューティング ノードに分散された読み取り専用オブジェクトのコレクションです。これらのコレクションは弾力性があり、データ セットの一部が失われた場合でも、「リネージ」に従って再構築できるため、高い障害が保証されます。許容範囲。

3) モバイル データの代わりにモバイル コンピューティングを使用すると、RDD パーティションは分散ファイル システム内のデータ ブロックを各ノードのメモリに読み込んで計算できます。

1.5. Spark のインストールプロセス

1.5.1. 基本環境、Linux システム、Java 環境、Hadoop 環境のインストール

1.5.2. Spark ファイルをダウンロードして解凍します。

tar -zxvf spark-3.0.3-bin-hadoop2.7.tgz

1.5.3、プロファイルの編集

vim /etc/profile

Spark 構成コンテンツを追加します。上書きしないように注意してください

export SPARK_HOME=/home/spark/spark-3.0.3-bin-hadoop2.7
export PATH=$PATH:${SPARK_HOME}/bin

最後に、構成を更新します

source /etc/profile

1.5.4、Spark シェルの実行

Spark Shell が正常に起動すると、出力情報の最後にコマンド プロンプト シンボル「Scala>」が表示されます。

コマンド「:quit」を使用して Spark Shell を終了するか、「Ctrl + D」キーの組み合わせを使用して Spark Shell を終了します


2. スパーククラスターの構築

2.1. Spark デプロイメントモード

1) スタンドアロン モード: ローカル モード: Spark は単一のマシン上で実行されます。

2) 擬似分散モード: スタンドアロン モード: Spark に付属するシンプルなクラスター マネージャーを使用します。

3) 分散モード: Spark On YARN モード: YARN をクラスターマネージャーとして使用します

                           Spark On Mesos モード: Mesos をクラスター マネージャーとして使用する

2.2. Spark On YARN を選ぶ理由

Spark On YARN モードの構築は比較的単純です。YARN クラスター内の 1 つのノードに Spark をインストールするだけで済みます。このノードは、Spark アプリケーションを YARN クラスターに送信するためのクライアントとして使用できます。

2.3. Spark On YARN モード

Spark On YARN モードにはクライアントとクラスターの 2 つのモードがあり、主な違いはドライバー プログラムの実行ノードが異なることです。

client: ドライバー プログラムはクライアント上で実行されます。これは対話やデバッグに適しており、操作の出力をすぐに確認したい場合に適しています。

クラスター: ドライバー プログラムは、RM (ResourceManager) によって開始される AM (AplicationMaster) 上で実行され、実稼働環境に適しています。        

2.4. Sparkの開始

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
/home/spark/spark-3.0.3-bin-hadoop2.7/examples/jars/spark-examples_2.12-3.0.3.jar

3. Scalaの基本構文とメソッド関数

3.1. Scalaの変数定義やループなどの基本的な構文

3.1.1. 変数の定義

 3.1.2、If ループ

 3.1.3、Forループ

 3.1.4、Do while ループ

 

3.2. 変更可能なコレクションと不変のコレクション

可変コレクション: 必要に応じて更新または拡張できます。これは、コレクションの要素を変更および削除できることを意味します。簡単に言えば、コレクション自体を動的に変更できるということです。

不変コレクション: 対照的に、決して変更されません。ただし、追加、削除、更新の操作をシミュレートすることは可能です。ただし、これらの操作では、いずれの場合も新しいコレクションが返され、元のコレクションは変更されません。簡単に言えば、コレクション自体を動的に変更することはできません。

3.2.1. 不変コレクションの基本構文

var/val 变量名 = Set[类型]()
var/val 变量名 = Set(元素1, 元素2, 元素3,..)

 3.2.2. 可変コレクションの基本構文

変数セットは要素を参照し、長さが可変であり、作成方法は不変セットと同じですが、最初に変数コレクション クラスをインポートする必要があります。

3.3. 可変配列と不変配列

3.3.1. 不変配列の基本文法

var/val 变量名 = new Array[元素类型](数组长度)
var/val 变量名 = Array(元素1,元素2,...)

3.3.2. 変数配列の基本構文

var/val 变量名 = new ArrayBuffer[元素类型](数组长度)
var/val 变量名 = ArrayBuffer(元素1,元素2,...)

3.4. 変更可能リストと不変更リスト

リストの要素と長さは不変です

3.4.1. 不変リストの基本文法

val/var 变量名 = List(元素1,元素2,元素3,...)

3.4.2. 変数Listの基本構文

val/var 变量名 = ListBuffer[数据类型]()
val/var 变量名 = ListBuffer(元素1,元素2,元素3,..)

3.5、タプル

val/var 元组名 = (元素 1, 元素 2, 元素 3....)
val/var 元组名 = 元素 1 -> 元素 2

3.6. 変更可能および不変更のマッピング (マップ)

3.6.1. 不変マップの基本文法

val/var map = Map(键->值, 键->值, 键->值...)
val/var map = Map((键, 值), (键, 值), (键, 值), (键, 值)...)

3.6.2. 変数 Map の基本構文

定義構文は不変 Map の構文と一致していますが、最初にパッケージを手動でインポートする必要があります: import scala.collection.mutable.Map

4、オブジェクト指向

4.1、オブジェクト指向とは

オブジェクト指向はプログラミングの考え方の一種で、プロセス指向に基づいており、オブジェクト、つまりクラスのインスタンスに基づいてプログラミングを完了します。

4.2、クラスとは

クラスは属性と動作の集合であり、抽象的な概念です。

4.3、オブジェクトとは何か

オブジェクトはクラスの具体的なインスタンスです

4.4、クラスとオブジェクトの基本構造

クラス作成構文: class クラス名 {属性と動作} 注: クラスが空でメンバーがない場合は、{} を省略できます。

オブジェクトの作成構文: val オブジェクト名 = new class ()

4.5. コンストラクター

オブジェクトが作成されると、クラスのコンストラクターが自動的に呼び出されます。デフォルトのコンストラクターは以前に使用されていました。主なコンストラクターの定義に加えて、必要に応じて補助コンストラクターも定義できます。主コンストラクター以外のコンストラクターは補助コンストラクターと呼ばれます

分類: 1. メインコンストラクター。2. 補助コンストラクター

4.6. サンプルクラスとサンプルオブジェクト

サンプル クラス: Scala では、サンプル クラスはデータを保存するために一般に使用される特別なクラスであり、同時プログラミングや Spark や Flink などのフレームワークでよく使用されます。

サンプル オブジェクト: Scala では、case で装飾されたシングルトン オブジェクトはサンプル オブジェクトと呼ばれ、プライマリ コンストラクターはありません。


5、Spark RDD プログラミング

5.1、RDD変換動作

filter(func): 関数 func を満たす要素をフィルターで除外し、新しいデータ セットを返します。

map(func): 各要素を関数 func に渡し、結果を新しいデータセットとして返します。

flatMap(func):map() と似ていますが、各入力要素を 0 個以上の出力結果にマッピングできます。

groupByKey(): (K, V) のキーと値のペアのデータセットに適用すると、(K, Iterable) の形式で新しいデータセットを返します。

reduceByKey(func): (K, V) のキーと値のペアのデータ セットに適用すると、(K, V) の形式で新しいデータ セットが返され、各値が各キーの関数 func に渡されます。集計の場合、次の結果

5.2、RDDアクション動作

count(): データセット内の要素の数を返します。

collect(): データセット内のすべての要素を配列として返します。

first(): データセット内の最初の要素を返します。

take(n): データセット内の最初の n 要素を配列として返します。

reduce(func): 関数 func を使用してデータセット内の要素を集計します (2 つのパラメーターを入力し、値を返します)。

foreach(func): データセット内の各要素を関数 func に渡して実行します。

  

5.3、RDDパーティション

RDD は弾力性のある分散データ セットであり、通常、RDD は非常に大きく、多くのパーティションに分割され、異なるノードに保存されます。

5.4、RDDキャッシュ(永続化)

Spark では、RDD は遅延評価メカニズムを採用しており、操作が発生するたびに計算が最初から実行されます。アクションを呼び出すたびに、最初から計算がトリガーされます。これは、同じデータセットを複数回再利用する必要があることが多い反復計算にとってコストがかかります。

キャッシュの重要性: 2 番目のアクション操作では、計算の繰り返しを避けるために、最初のアクション操作でキャッシュされた値のみを使用する必要があります。

5.5. RDDキーと値のペアの操作と読み書き方法

1) キーと値のペア RDD の作成

val pairRDD = lines.flatMap(line => line.split("")).map(word => (word, 1))
pairRDD.foreach(println)

2) ファイルからデータを読み取り、RDD を作成します

val textFile = sc.textFile(".....")

5.6. 実験

1. ローカル ファイル word.txt があります。このファイルには多数のテキスト行が含まれています。テキストの各行は複数の単語で構成され、単語はスペースで区切られています。次のステートメントは、単語の頻度統計 (つまり、各単語の出現数をカウントする) に使用できます。

2. キー値の最後の桁に応じて異なるファイルに書き込みます

package com.qst.rdd

import org.apache.spark.{Partitioner, SparkConf, SparkContext}

//自定义分区类,需要继承org.apache.spark.Partitioner类
class MyPartitioner(numParts: Int) extends Partitioner {

  //覆盖分区数
  override def numPartitions: Int = numParts

  //覆盖分区号获取函数
  override def getPartition(key: Any): Int = {
    key.toString.toInt % 10
  }
}

object MyPartitioner {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("persistDemo")
    val sc = new SparkContext(conf)
    // 模拟5个分区的数据
    val data = sc.parallelize(1 to 10, 5)
    // 将每个元素转化为 (元素, 1) 的形式
    data.map((_, 1))
      // MyPartitioner的构造函数需要传入分区数,这里传入的是10,将原本的5个分区转变为10个分区
      .partitionBy(new MyPartitioner(10))
      // 对集合中的每个元组取第一个元素进行映射操作,返回一个包含映射结果的新集合。
      // 也就是只保留元素,去除分区前加的1
      .map(_._1)
      // 使用saveAsTextFile方法将结果保存到HDFS中。
      // Spark 会自动将数据写到多个文件中,每个文件对应一个分区。
      .saveAsTextFile("hdfs://192.168.74.80:9000/output6")
    sc.stop()
  }
}

6. スパークSQL

6.1、データフレームとは何ですか

RDD と同様に、DataFrame も分散データ コンテナーです。ただし、DataFrame は従来のデータベースの 2 次元テーブルに似ており、データに加えて、データの構造情報、つまりスキーマも記録します。

6.2、DataFrame、DataSet、RDD間の変換

6.2.1. RDD から DataFrame へ

object SparkSQLDemo03 {
// 样例类
case class Person(id: Int, name: String, age: Int)
def main(args: Array[String]): Unit = {
// 准备工作:创建 SparkSession
val spark = SparkSession.builder().appName(this.getClass.getName).master("local[*]").getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("WARN")
// 1. 通过样例类进行转换
val linesRDD = sc.textFile("file/person.txt")
// 1.1. RDD[String] 变为 RDD[Person]
课程内容页
val personRDD: RDD[Person] = linesRDD.map(x => {
val arr = x.split(",")
Person(arr(0).toInt, arr(1), arr(2).toInt)
})
import spark.implicits._ // 隐式转换
// 1.2. RDD+样例类 => DataFrame
val personDF: DataFrame = personRDD.toDF()
val personDS: Dataset[Person] = personRDD.toDS()
personDF.show()
personDS.show()
// 关闭
spark.stop()
}
}

 6.2.2. データフレームからRDDへ

val rdd = pDF.rdd
println(rdd)
println(rdd.collect())
// 关闭
spark.stop()
}
}

おすすめ

転載: blog.csdn.net/m0_60964321/article/details/131153681