TiSpark ユーザーガイド
TiSpark vs TiFlash
ティスパーク 、複雑な OLAP クエリに答えるために、TiDB/TiKV 上で Apache Spark を実行するために構築されたシンレイヤーです。 Spark プラットフォームと分散 TiKV クラスターの両方の利点を活用し、分散 OLTP データベースである TiDB にシームレスに接続して、オンライン トランザクションと分析の両方のワンストップ ソリューションとして機能するハイブリッド トランザクション/分析処理 (HTAP) ソリューションを提供します。 。
TiFlashは、HTAP を有効にする別のツールです。 TiFlashと TiSpark ではどちらも、複数のホストを使用して OLTP データに対して OLAP クエリを実行できます。 TiFlash はデータを列形式で保存するため、より効率的な分析クエリが可能になります。 TiFlashと TiSpark は併用できます。
タイスパークとは
TiSpark は TiKV クラスターと PD クラスターに依存します。 Spark クラスターをセットアップする必要もあります。このドキュメントでは、TiSpark のセットアップ方法と使用方法について簡単に説明します。 Apache Spark の基本的な知識が必要です。詳細については、 Apache Spark Web サイトを参照してください。
Spark Catalyst Engine と緊密に統合されている TiSpark は、コンピューティングを正確に制御します。これにより、Spark は TiKV からデータを効率的に読み取ることができます。 TiSpark はインデックス シークもサポートしており、高速なポイント クエリを可能にします。 TiSpark は、コンピューティングを TiKV にプッシュすることでデータ クエリを高速化し、Spark SQL によって処理されるデータ量を削減します。一方、TiSpark は、TiDB の組み込み統計を使用して、最適なクエリ プランを選択できます。
TiSpark と TiDB を使用すると、ETL を構築および保守することなく、トランザクション タスクと分析タスクの両方を同じプラットフォーム上で実行できます。これにより、システムアーキテクチャが簡素化され、メンテナンスのコストが削減されます。
TiDB でのデータ処理には、Spark エコシステムのツールを使用できます。
- TiSpark: データ分析と ETL
- TiKV: データの取得
- スケジュールシステム: レポート生成
また、TiSpark は TiKV への分散書き込みをサポートします。 Spark および JDBC を使用した TiDB への書き込みと比較して、TiKV への分散書き込みはトランザクション (すべてのデータの書き込みが成功するか、すべての書き込みが失敗するか) を実装でき、書き込みが高速になります。
要件
- TiSpark は Spark 以降 2.3 をサポートします。
- TiSpark には JDK 1.8 および Scala 2.11/2.12 が必要です。
- TiSpark は、
YARN、Mesos、Standaloneなどの任意の Spark モードで実行されます。
Spark の推奨展開構成
TiSpark は Spark の TiDB コネクタであるため、これを使用するには、実行中の Spark クラスターが必要です。
このドキュメントでは、Spark のデプロイに関する基本的なアドバイスを提供します。ハードウェアの推奨事項の詳細については、 スパーク公式サイトを参照してください。
Spark クラスターの独立したデプロイメントの場合:
- Spark には 32 GB のメモリを割り当てることをお勧めします。オペレーティング システムとバッファ キャッシュ用にメモリの少なくとも 25% を予約します。
- Spark にはマシンごとに少なくとも 8 ~ 16 コアをプロビジョニングすることをお勧めします。まず、すべての CPU コアを Spark に割り当てる必要があります。
以下はspark-env.sh構成に基づく例です。
SPARK_EXECUTOR_MEMORY = 32g
SPARK_WORKER_MEMORY = 32g
SPARK_WORKER_CORES = 8
TiSpark を入手
TiSpark は、TiKV の読み取りおよび書き込み機能を提供する Spark 用のサードパーティ jar パッケージです。
mysql-connector-j を取得する
mysql-connector-java依存関係は、GPL ライセンスの制限により提供されなくなりました。
TiSpark の jar の次のバージョンには、 mysql-connector-java含まれなくなります。
- TiSpark > 3.0.1
- TiSpark > 2.5.1 (TiSpark 2.5.x 用)
- TiSpark > 2.4.3 (TiSpark 2.4.x 用)
ただし、TiSpark は書き込みと認証にmysql-connector-java必要です。このような場合は、次のいずれかの方法を使用してmysql-connector-java手動でインポートする必要があります。
Spark jar ファイルに
mysql-connector-javaを入れます。Spark ジョブを送信するときに
mysql-connector-javaインポートします。次の例を参照してください。
spark-submit --jars tispark-assembly-3.0_2.12-3.1.0-SNAPSHOT.jar,mysql-connector-java-8.0.29.jar
TiSpark のバージョンを選択してください
TiDB と Spark のバージョンに応じて、TiSpark のバージョンを選択できます。
TiSpark 2.4.4、2.5.2、3.0.2、および 3.1.1 は最新の安定バージョンであり、強く推奨されます。
TiSpark の瓶を入手する
TiSpark jar は、次のいずれかの方法を使用して取得できます。
- メイブンセントラルから取得して
pingcapを検索 - TiSpark リリースから取得
- 以下の手順でソースからビルドします。
注記:
現在、TiSpark をビルドするには java8 が唯一の選択肢であり、 mvn -version を実行して確認してください。
git clone https://github.com/pingcap/tispark.git
TiSpark ルート ディレクトリで次のコマンドを実行します。
// add -Dmaven.test.skip=true to skip the tests
mvn clean install -Dmaven.test.skip=true
// or you can add properties to specify spark version
mvn clean install -Dmaven.test.skip=true -Pspark3.2.1
TiSpark jar のアーティファクト ID
TiSpark のアーティファクト ID は、TiSpark のバージョンによって異なります。
はじめる
このドキュメントでは、Spark-Shell で TiSpark を使用する方法について説明します。
スパークシェルを開始する
スパークシェルで TiSpark を使用するには:
spark-defaults.confに次の構成を追加します。
spark.sql.extensions org.apache.spark.sql.TiExtensions
spark.tispark.pd.addresses ${your_pd_adress}
spark.sql.catalog.tidb_catalog org.apache.spark.sql.catalyst.catalog.TiCatalog
spark.sql.catalog.tidb_catalog.pd.addresses ${your_pd_adress}
--jarsオプションを指定して Spark-Shell を開始します。
spark-shell --jars tispark-assembly-{version}.jar
TiSpark バージョンを取得する
TiSpark のバージョン情報を取得するには、spark-shell で次のコマンドを実行します。
spark.sql("select ti_version()").collect
TiSpark を使用してデータを読み取る
Spark SQL を使用して TiKV からデータを読み取ることができます。
spark.sql("use tidb_catalog")
spark.sql("select count(*) from ${database}.${table}").show
TiSpark を使用してデータを書き込む
Spark DataSource API を使用して、 ACIDが保証されている TiKV にデータを書き込むことができます。
val tidbOptions: Map[String, String] = Map(
"tidb.addr" -> "127.0.0.1",
"tidb.password" -> "",
"tidb.port" -> "4000",
"tidb.user" -> "root"
)
val customerDF = spark.sql("select * from customer limit 100000")
customerDF.write
.format("tidb")
.option("database", "tpch_test")
.option("table", "cust_test_select")
.options(tidbOptions)
.mode("append")
.save()
詳細についてはデータソースAPIユーザーガイド参照してください。
TiSpark 3.1 以降は Spark SQL を使用して記述することもできます。詳細についてはSQLを挿入参照してください。
JDBC データソースを使用してデータを書き込む
TiSpark を使用せずに、Spark JDBC を使用して TiDB に書き込むこともできます。
これは TiSpark の範囲を超えています。このドキュメントでは例のみを示します。詳細については、 JDBC から他のデータベースへを参照してください。
import org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions
val customer = spark.sql("select * from customer limit 100000")
// you might need to repartition the source to make it balanced across nodes
// and increase concurrency
val df = customer.repartition(32)
df.write
.mode(saveMode = "append")
.format("jdbc")
.option("driver", "com.mysql.jdbc.Driver")
// replace the host and port with yours and be sure to use rewrite batch
.option("url", "jdbc:mysql://127.0.0.1:4000/test?rewriteBatchedStatements=true")
.option("useSSL", "false")
// as tested, setting to `150` is a good practice
.option(JDBCOptions.JDBC_BATCH_INSERT_SIZE, 150)
.option("dbtable", s"cust_test_select") // database name and table name here
.option("isolationLevel", "NONE") // set isolationLevel to NONE
.option("user", "root") // TiDB user here
.save()
TiDB OOM につながる可能性のある大きな単一トランザクションを回避し、 ISOLATION LEVEL does not supportエラーも回避するには、 isolationLevelからNONEに設定します (TiDB は現在REPEATABLE-READのみをサポートします)。
TiSparkを使用してデータを削除する
Spark SQL を使用して、TiKV からデータを削除できます。
spark.sql("use tidb_catalog")
spark.sql("delete from ${database}.${table} where xxx")
詳細については機能の削除参照してください。
他のデータソースを操作する
次のように、複数のカタログを使用して、さまざまなデータ ソースからデータを読み取ることができます。
// Read from Hive
spark.sql("select * from spark_catalog.default.t").show
// Join Hive tables and TiDB tables
spark.sql("select t1.id,t2.id from spark_catalog.default.t t1 left join tidb_catalog.test.t t2").show
TiSpark 構成
次の表の構成は、 spark-defaults.confでまとめるか、他の Spark 構成プロパティと同じ方法で渡すことができます。
TLS 構成
TiSpark TLS には、TiKV クライアント TLS と JDBC コネクタ TLS の 2 つの部分があります。 TiSpark で TLS を有効にするには、両方を構成する必要があります。 spark.tispark.tikv.xxx 、TiKV クライアントが PD および TiKVサーバーとの TLS 接続を作成するために使用されます。 spark.tispark.jdbc.xxxは、JDBC が TLS 接続で TiDBサーバーに接続するために使用されます。
TiSpark TLS が有効な場合、X.509 証明書をtikv.trust_cert_collection 、 tikv.key_cert_chain 、およびtikv.key_file構成で構成するか、JKS 証明書をtikv.jks_enable 、 tikv.jks_trust_path 、およびtikv.jks_key_pathで構成する必要があります。 jdbc.server_cert_storeとjdbc.client_cert_storeはオプションです。
TiSpark は TLSv1.2 と TLSv1.3 のみをサポートします。
- 以下は、TiKV クライアントで X.509 証明書を使用して TLS 構成を開く例です。
spark.tispark.tikv.tls_enable true
spark.tispark.tikv.trust_cert_collection /home/tispark/root.pem
spark.tispark.tikv.key_cert_chain /home/tispark/client.pem
spark.tispark.tikv.key_file /home/tispark/client.key
- 以下は、TiKV クライアントで JKS 構成を使用して TLS を有効にする例です。
spark.tispark.tikv.tls_enable true
spark.tispark.tikv.jks_enable true
spark.tispark.tikv.jks_key_path /home/tispark/config/tikv-truststore
spark.tispark.tikv.jks_key_password tikv_trustore_password
spark.tispark.tikv.jks_trust_path /home/tispark/config/tikv-clientstore
spark.tispark.tikv.jks_trust_password tikv_clientstore_password
JKS 証明書と X.509 証明書の両方が設定されている場合、JKS の優先順位が高くなります。つまり、TLS ビルダーは最初に JKS 証明書を使用します。したがって、共通の PEM 証明書を使用するだけの場合はspark.tispark.tikv.jks_enable=trueを設定しないでください。
- 以下は、JDBC コネクタで TLS を有効にする例です。
spark.tispark.jdbc.tls_enable true
spark.tispark.jdbc.server_cert_store /home/tispark/jdbc-truststore
spark.tispark.jdbc.server_cert_password jdbc_truststore_password
spark.tispark.jdbc.client_cert_store /home/tispark/jdbc-clientstore
spark.tispark.jdbc.client_cert_password jdbc_clientstore_password
- TiDB TLS を開く方法の詳細については、 TiDB クライアントとサーバーの間で TLS を有効にするを参照してください。
- JAVA キー ストアの生成方法の詳細については、 SSLを使用した安全な接続を参照してください。
Log4j 構成
spark-shellまたはspark-sql開始してクエリを実行すると、次の警告が表示される場合があります。
Failed to get database ****, returning NoSuchObjectException
Failed to get database ****, returning NoSuchObjectException
ここで、 ****はデータベース名です。
この警告は無害であり、Spark が独自のカタログ内で****を見つけられないために発生します。これらの警告は無視して構いません。
ミュートするには、次のテキストを${SPARK_HOME}/conf/log4j.propertiesに追加します。
# tispark disable "WARN ObjectStore:568 - Failed to get database"
log4j.logger.org.apache.hadoop.hive.metastore.ObjectStore=ERROR
タイムゾーンの設定
-Duser.timezoneシステム プロパティ (たとえば、 -Duser.timezone=GMT-7 ) を使用してタイム ゾーンを設定します。これはTimestampタイプに影響します。
spark.sql.session.timeZone使用しないでください。
特徴
TiSpark の主な機能は次のとおりです。
式インデックスのサポート
TiDB v5.0 は式インデックスをサポートします。
TiSpark は現在expression indexを使用したテーブルからのデータの取得をサポートしていますが、 expression index TiSpark のプランナーによって使用されません。
TiFlashを使用する
TiSpark は、設定spark.tispark.isolation_read_enginesを介してTiFlashからデータを読み取ることができます。
パーティション化されたテーブルのサポート
TiDB からパーティション化されたテーブルを読み取る
TiSpark は、TiDB からレンジ分割テーブルとハッシュ分割テーブルを読み取ることができます。
現在、TiSpark は MySQL/TiDB パーティション テーブル構文select col_name from table_name partition(partition_name)をサポートしていません。ただし、 where条件を使用してパーティションをフィルタリングすることはできます。
TiSpark は、テーブルに関連付けられたパーティション タイプとパーティション式に応じて、パーティション プルーニングを適用するかどうかを決定します。
TiSpark は、パーティション式が次のいずれかの場合にのみ、範囲パーティション化にパーティション プルーニングを適用します。
- 列式
YEAR($argument)引数は列で、その型は日時または日時として解析できる文字列リテラルです。
パーティション プルーニングが適用できない場合、TiSpark の読み取りは、すべてのパーティションに対してテーブル スキャンを実行することと同じになります。
パーティション化されたテーブルへの書き込み
現在、TiSpark は、次の条件下でレンジ パーティション テーブルとハッシュ パーティション テーブルへのデータの書き込みのみをサポートしています。
- パーティション式は列式です。
- パーティション式は
YEAR($argument)で、引数が列で、その型が日時または日時として解析できる文字列リテラルです。
パーティション化されたテーブルに書き込むには 2 つの方法があります。
- データソース API を使用して、置換セマンティクスと追加セマンティクスをサポートするパーティション テーブルに書き込みます。
- Spark SQL で delete ステートメントを使用します。
注記:
現在、TiSpark は、utf8mb4_bin照合順序が有効になっているパーティション化されたテーブルへの書き込みのみをサポートしています。
Security
TiSpark v2.5.0 以降のバージョンを使用している場合は、TiDB を使用して TiSpark ユーザーを認証および認可できます。
認証および認可機能はデフォルトでは無効になっています。これを有効にするには、次の構成を Spark 構成ファイルspark-defaults.confに追加します。
// Enable authentication and authorization
spark.sql.auth.enable true
// Configure TiDB information
spark.sql.tidb.addr $your_tidb_server_address
spark.sql.tidb.port $your_tidb_server_port
spark.sql.tidb.user $your_tidb_server_user
spark.sql.tidb.password $your_tidb_server_password
詳細については、 TiDBサーバーを介した認可と認証を参照してください。
その他の機能
統計情報
TiSpark は次の統計情報を使用します。
- クエリ プランで使用するインデックスを最小の推定コストで決定します。
- 効率的なブロードキャスト参加を可能にする小規模テーブルブロードキャスト。
TiSpark が統計情報にアクセスできるようにするには、関連するテーブルが分析されていることを確認してください。
テーブルの分析方法の詳細については、 統計入門参照してください。
TiSpark 2.0 以降、統計情報はデフォルトで自動的にロードされます。
FAQ
TiSpark FAQを参照してください。
