このブログは、2023 年 4 月 4 日に SAP ジャパン公式ブログに掲載されたものを SAP ジャパン公式ブログ閉鎖に伴い転載したものです。
このブログは、Ronit Nagwekar が執筆したブログ「Using HANA Cloud, data lake Files with a Jupyter Notebook and PySpark」(2022 年 11 年 9 日)の抄訳です。最新の情報は、SAP Community の最新ブログやマニュアルを参照してください。
SAP HANA Cloud, data lake Files(HDLFS)には、Spark からのファイルへの直接のアクセスを可能にするドライバーが含まれています。これにより、Hadoop FileSystem インターフェースを実装し、Hadoop エコシステム内のプラットフォームとアプリケーションをデータ格納用の HDLFS と連携することができます。このブログでは、HDLFS との接続設定、File ストア内のファイルからの書き込み、読み込み、削除がいかに容易に行えるのか紹介します。
マニュアルの「SAP HANA Cloud, data lake Filesへのアクセス設定(英語)」に掲載されているように、クライアント認証とキーを作成します。Jupyter Notebook から HDLFS へ通信するためにclient.crt と client.key をキーストアパッケージに提供する必要があります。このパッケージは、Jupyter Notebook インスタンスにアップロードする必要があります。
以下は、Openssl を使用したクライアント認証とキーからの pkcs12 package の作成方法の一例です。
openssl pkcs12 \
-export \
-inkey </path/to/client-key-file> \
-in </path/to/client-certificate-file> \
-out </path/to/client-keystore.p12> \
-password pass:<password-p12-file> \
コマンドプロンプトでは以下のようになります。
これが完了すると、以下のように. pkcs12 ファイルが任意のパスに作成されます。後ほど必要になるので、キーストアパスワードをメモしておいてください。
HDLFS ディレクトリーから Spark Driver と. pkcs12 ファイルを Jupyter Notebook インスタンスにアップロードします。
upload の矢印をクリックし、2つのファイルをアップロードします。これで workbook ホームにアップロードされます。
全コードを「このブログの最後」に掲載しています。Notebook のコードブロックにこれを貼り付けて実行してください。
以下のコードブロックは、SAP HANA Cloud, data lake Files ストアとの接続の設定方法を示します。
下のコードブロックでは、SSL の設定、Operations config、ドライバーの設定、URI のフォーマットの設定方法を説明しています。
Note : 特定のパラメータープロパティを参照するため、sc.jsc.hadoopConfiguartion().set() を呼び出して、Sparks Global Hadoop Configuration を設定します。「_jsc」は、その JVM 内のSparkContext へのプロキーシーである Java Spark Context です。
# —– ssl 設定 — クライアントキーストアの場所、クライアントキーストアのパスワード、トラストストアファイルのタイプを定義します。
sc._jsc.hadoopConfiguration().set(“fs.hdlfs.ssl.keystore.location”, keystoreLocation)
sc._jsc.hadoopConfiguration().set(“fs.hdlfs.ssl.keystore.password”, keystorePwd)
sc._jsc.hadoopConfiguration().set(“fs.hdlfs.ssl.keystore.type”, “PKCS12”)
# —– オペレーション設定 — ファイルの読み込み、書き込み、削除を行う CREATE モードがDEFAULT として設定されるオペレーションパラメーターを設定します。
sc._jsc.hadoopConfiguration().set(“fs.hdlfs.operation.create.mode”, “DEFAULT”)
# —– ドライバー設定 — SAP HANA Cloud, data lake Files をターゲットしているorg.apache.hadoop.fs.FileSystem を実装します。Spark によるドライバーのロードを可能にするには、システムが新しい hdlfs://スキーマを認識し、data lake Files のファイルを参照するよう設定パラメーターを指定します。
sc._jsc.hadoopConfiguration().set(“fs.AbstractFileSystem.hdlfs.impl”, “com.sap.hana.datalake.files.Hdlfs”)
sc._jsc.hadoopConfiguration().set(“fs.hdlfs.impl”, “com.sap.hana.datalake.files.HdlfsFileSystem”)
sc._jsc.hadoopConfiguration().set(“mapreduce.fileoutputcommitter.algorithm.version”,”2″)
#— uri のフォーマットは hdlfs://<filecontainer>.<endpointSuffix>/path/to/file — Spark にドライバーが認識されると、ファイルは hdlfs://<files-rest-api-endpoint>/path/to/file として Spark の URI に参照されます。
sc._jsc.hadoopConfiguration().set(“fs.defaultFS”, “hdlfs://” + hdlfsEndpoint)
sc._jsc.hadoopConfiguration().set(“fs.hdlfs.filecontainer”, filecontainer)
Apache Spark のための Data Lake Filesドライバー設定のマニュアル:Apache Spark のための Data Lake Files ドライバー設定(英語)
下のコードブロックは、前述で HDLFS に接続し、(存在する場合には)HDLFS からファイルを読み込むための設定をした hadoop 設定をどう使用するのか示しています。
追加のコードブロックは、任意のディレクトリーからのファイルの書き込み、読み込み、削除方法について示しています。
前述のディレクトリーパスの中にある PySpark を使用して、ファイルの読み込み方法を示すコードブロックをみてみます。
ディレクトリーを csv () メソッドへのパスとしてバイパスすることで全ての CSV ファイルをディレクトリーから DataFrame に読み込むことが可能です。delimiter オプションを使用して、CSV ファイルの列区切を指定します。デフォルトでは、これは カンマ(,) ですが、このオプションを使用することでパイプ (|)、タブ (\t)、スペースなど、どの文字にも設定できます。
以下は、前述のディレクトリーパス内で PySpark を使用した「書き込み」方法を示すコードブロックです。
File Container にファイルが作成されているか確認するには、HANA Database Explorer (DBX) に切り替えることでファイルが作成されているかどうかを確認できます。以下のスクリーンショットを参照してください。
HDFS からファイル/ディレクトリーを削除するには、読み込みや書き込みのオペレーションと同様のステップに従います。 ファイルを削除するには、– fs.delete(path, true) を使用します。true はパス内のファイルが正常に削除されていることを示し、false はファイルが再帰的に削除されていないことを示します。
Delete関数使用前は Ordersdata.csv が File Container に存在することを DBX で確認できます。
Delete 関数使用後は、Ordersdata.csv は File Container から削除されています。
全体コードは以下のとおりです:
import os
#include hdlfs spark driver in pyspark shell
os.environ['PYSPARK_SUBMIT_ARGS'] = '--jars /home/jovyan/work/sap-hdlfs-1.1.9.jar pyspark-shell'
import pyspark
from pyspark.sql.session import SparkSession
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
spark = SparkSession(sc)
keystoreLocation = "/home/jovyan/work/mycert.p12"; # ----- the location of the keystore p.12 file in the home directory
keystorePwd = "Password1"; # ----- the password that you entered while creating the keystore file
hdlfsEndpoint = "<your HANA Data Lake Files endpoint>"; # ----- the Rest API Endpoint of the Data Lake instance
filecontainer = "<your HANA Data Lake Files instance ID>"; # ----- This is the Instance ID
# ----- ssl configuration ---
sc._jsc.hadoopConfiguration().set("fs.hdlfs.ssl.keystore.location", keystoreLocation)
sc._jsc.hadoopConfiguration().set("fs.hdlfs.ssl.keystore.password", keystorePwd)
sc._jsc.hadoopConfiguration().set("fs.hdlfs.ssl.keystore.type", "PKCS12")
# ----- operations configuration ----
sc._jsc.hadoopConfiguration().set("fs.hdlfs.operation.create.mode", "DEFAULT")
# ----- driver configuration ----
sc._jsc.hadoopConfiguration().set("fs.AbstractFileSystem.hdlfs.impl", "com.sap.hana.datalake.files.Hdlfs")
sc._jsc.hadoopConfiguration().set("fs.hdlfs.impl", "com.sap.hana.datalake.files.HdlfsFileSystem")
sc._jsc.hadoopConfiguration().set("mapreduce.fileoutputcommitter.algorithm.version","2")
# uri is in format hdlfs://<filecontainer>.<endpointSuffix>/path/to/file
sc._jsc.hadoopConfiguration().set("fs.defaultFS", "hdlfs://" + hdlfsEndpoint)
sc._jsc.hadoopConfiguration().set("fs.hdlfs.filecontainer", filecontainer)
# -- Read the files from the File Container
hadoop = sc._jvm.org.apache.hadoop
fs = hadoop.fs.FileSystem
conf = sc._jsc.hadoopConfiguration()
path = hadoop.fs.Path('/')
[str(f.getPath()) for f in fs.get(conf).listStatus(path)]
# -- Read a File
df = spark.read.options(delimiter='|').csv("/Ordersdata.csv")
# -- Write a File
df.write.csv("TPCH_SF100/ORDERS/File.csv")
# -- Delete a File
path = hadoop.fs.Path('/File.csv')
fs.get(conf).delete(path, True)
Jupyter Notebook と Pyspark を使用して、HDLFS との接続を簡単に設定・確立できること、そしてFilesストアからのファイルの書き込み、読み込み、削除方法について説明しました。