Databrick(Spark)にて、TPC-H、および、TPC-DSのデータを生成する方法

## 概要
Databrick(Spark)にて、TPC-H、および、TPC-DSのデータを生成する方法を共有します。

DatabircksがGithub上で公開しているコードを利用するため、TPCにて公開されているコードより古いバージョンを利用する手順となっております。

詳細は下記のGithub pagesのページをご確認ください。

https://manabian-.github.io/databricks_tecks_for_qiita/#generate_data_tpch_and_tpcds/generate_data_tpch_and_tpcds.html

コードを実行したい方は、下記のdbcファイルを取り込んでください。

```URL
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/generate_data_tpch_and_tpcds/generate_data_tpch_and_tpcds.dbc
```

## TPC-Hのデータを生成する手順
### 1. スケールファクター等の変数をセット

```python
scale_factor  = '10' # Scale Factor数をセット
chunks_number = '10' # 出力ファイル数と並列処理数をセット

import os

# shellスクリプトに渡す引数をセット
os.environ['scale_factor']=scale_factor
print(os.getenv('scale_factor'))

os.environ['chunks_number']=chunks_number
print(os.getenv('chunks_number'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/715d80ce-90e7-f1cb-4a59-073c5283e06b.png)


### 2. TPC-Hのセットアップとデータの生成

```sh
%sh
sudo apt-get install -y make gcc yacc
cd /tmp
rm -r ./tpch-dbgen -f
git clone https://github.com/databricks/tpch-dbgen.git
cd tpch-dbgen
make OS=LINUX WORKLOAD=TPCH
cd ..
rm -r ./tpch_data -f
mkdir tpch_data
cd tpch_data

for i in $( seq 1 ${chunks_number} ) ; do
    ../tpch-dbgen/dbgen -b ../tpch-dbgen/dists.dss -f -s ${scale_factor} -C ${chunks_number} -S ${i} &
done
wait
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/34055a73-9c4a-5dfb-dd95-f48cbd7dc8e2.png)

### 3. 生成したデータを確認

```python
path = 'file:/tmp/tpch_data'

file_list =dbutils.fs.ls(path)

# ファイル一覧を表示
display(file_list)

# ファイルサイズを表示
spark.createDataFrame(file_list).groupBy().sum('size').display()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f9eea112-6be7-13d8-82b3-d9312f3c0d17.png)


## TPC-DSのデータを生成する手順
### 1. スケールファクター等の変数をセット

```python
scale_factor  = '10' # Scale Factor数をセット
chunks_number = '10' # 出力ファイル数と並列処理数をセット


import os
 
# shellスクリプトに渡す引数をセット
os.environ['scale_factor']=scale_factor
print(os.getenv('scale_factor'))
 
os.environ['chunks_number']=chunks_number
print(os.getenv('chunks_number'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/45053f1b-a546-c832-59b3-a8777827cde4.png)


### 2. TPC-DSのセットアップとデータの生成

```sh
%sh
sudo apt-get install -y gcc make flex bison byacc
cd /tmp
rm -r ./tpcds_data -f
mkdir tpcds_data
git clone https://github.com/databricks/tpcds-kit.git
cd tpcds-kit/tools
make OS=LINUX
 
for i in $( seq 1 ${chunks_number} ) ; do
    ./dsdgen -FORCE Y -DIR ../../tpcds_data -SCALE ${scale_factor} -PARALLEl ${chunks_number} -CHILD ${i} &
done
wait
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/882ed6eb-95f0-4644-736e-4c3e9631f8b8.png)

### 3. 生成したデータを確認

```python
path = 'file:/tmp/tpcds_data'
 
file_list = dbutils.fs.ls(path)
 
# ファイル一覧を表示
display(file_list)
 
# ファイルサイズを表示
spark.createDataFrame(file_list).groupBy().sum('size').display()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ac3678ba-b88d-5b05-8659-b80a3a9717ff.png)


## 注意事項
### 注意事項1 クラスターを構築する際には、Cluster Modeをsingle Nodeに、Node TypeをMomory OptimizedのVMに設定することがおすすめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/680c7ede-114c-0b29-ac4c-901b977a0669.png)

### 注意事項2 メモリのSwapやCPU負荷が高い場合には処理がエラーとなる場合があるため、VMサイズアップが要検討

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b0bab407-d8bb-2a50-b068-048a62480964.png)

下記のようなエラーが発生します。

> The spark driver has stopped unexpectedly and is restarting. Your notebook will be automatically reattached.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c473b3b7-bda5-7a01-01fc-1de35a627c6d.png)