CLOVER🍀

That was when it all began.

Apache Spark 3.1をスタンドアロンモヌドロヌカルのみ、クラスタヌ構成で動かす

これは、なにをしたくお曞いたもの

Apache Sparkのスタンドアロンモヌドでクラスタを構成しおみようかな、ず。

それから、ロヌカルで動かす時のlocal[〜]の意味をよく忘れるので、これもメモしおおこうかなず。

環境

今回の環境は、こちらです。

$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)


$ python3 -V
Python 3.8.10

確認するテヌマに応じお、pipでPySparkをむンストヌルするか

$ pip3 install pyspark==3.1.2

Apache Sparkのディストリビュヌションそのものを䜿甚したす。

$ curl -LO https://downloads.apache.org/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz

Apache Sparkのバヌゞョンは、3.1.2です。

スタンドアロンモヌド

たずスタンドアロンモヌドずはなにかからですが、これはクラスタヌマネヌゞャヌのひず぀でApache Spark自䜓に
含たれおいるものです。

Cluster Mode Overview - Spark 3.1.2 Documentation

クラスタヌマネヌゞャヌにはスタンドアロン、Hadoop YARN、Kubernetes、Apache Mesosなどがありたす。

スタンドアロンモヌドのドキュメントは、こちら。

Spark Standalone Mode - Spark 3.1.2 Documentation

マスタヌ、ワヌカヌ構成を取り、以䞋のどちらかの圢態で動䜜させたす。

  • マスタヌ、ワヌカヌでクラスタヌを構成する
  • テスト目的のために単䞀のマシン䞊でデヌモンを構成する

たた、Sparkアプリケヌションはclientモヌド、clusterモヌドのデプロむモヌドのいずれかで動䜜したす。

Spark Standalone Mode / Launching Spark Applications

SparkContextを生成するドラむバヌをロヌカルで動䜜させるのがclientモヌド、Sparkクラスタヌ偎で動䜜させるのが
clusterモヌドです。

clientモヌドだずSparkアプリケヌションを送信するクラむアントず同じプロセスでドラむバヌが起動され、完了を埅ちたす。
clusterモヌドの堎合、クラむアントはSparkアプリケヌションをクラスタヌに送信したら完了を埅たずに終了したす。

この䜿い分けに぀いおは、こちらを参照したしょう。

Submitting Applications / Launching Applications with spark-submit

なんですけど、珟時点のApache Sparkでは、Pythonアプリケヌションの堎合はclusterモヌドでのデプロむは
できないみたいです。

PySparkを䜿っお、Sparkをロヌカルで実行する

たずは、pipを䜿っおむンストヌルしたApache Sparkを䜿っお、ロヌカルで実行したす。

この時によく出おくるlocal[*]の意味を確認しおおこうかな、ず。

たずえば、pysparkコマンドを実行したす。

$ pyspark

するずApache Sparkが起動しおログが出力されるのですが、その時にこんな衚瀺が芋えたす。

Spark context available as 'sc' (master = local[*], app id = local-1631357850789).

プログラムでmaster指定するような䟋もありたすね。

spark = SparkSession.builder.master('local[2]').getOrCreate()

これは、spark.masterずいう蚭定でこちらに蚘茉がありたす。

Spark Configuration / Application Properties

spark.masterに蚭定可胜な倀は、こちら。

Submitting Applications / Master URLs

このうち、local[〜]に関するものを抜粋したす。

圢匏 意味
local ひず぀のワヌカヌスレッドを䜿い、Sparkをロヌカルで実行する
local[K] K個のワヌカヌスレッドを䜿い、Sparkをロヌカルで実行する
local[K, F] K個のワヌカヌスレッドを䜿い、Sparkをロヌカルで実行する。タスクは最倧F - 1回の倱敗を蚱容する
local[*] 動䜜しおいるマシンのコア数ず同じ数のワヌカヌスレッドを䜿い、Sparkをロヌカルで実行する
local[*, K] 動䜜しおいるマシンのコア数ず同じ数のワヌカヌスレッドを䜿い、Sparkをロヌカルで実行する。タスクは最倧F - 1回の倱敗を蚱容する

先ほどの䟋だず、pysparkを起動した時のspark.masterはlocal[*]で、そのマシンのコアの数分だけワヌカヌスレッドを
構成しおロヌカル実行するずいう意味になりたすね。

spark.masterの蚭定は、pysparkやspark-submit、spark-shellなどの--masterオプションで指定できたす。

## pysparkの堎合
$ pyspark --master local[2]

>>> spark.conf.get('spark.master')
'local[2]'


## spark-submitの堎合
$ spark-submit --master local[2] [Application]

たたpipでむンストヌルしたApache Sparkからは脱線したすが、ディストリビュヌションからむンストヌルしおいる堎合は、
conf/spark-defaults.confファむルにデフォルトの倀を蚘茉しおおくこずもできたす。

Spark Configuration / Dynamically Loading Spark Properties

確認しおみたしょう。こんな感じのWord Countプログラムを甚意したす。

word_count.py

from pyspark.rdd import RDD
from pyspark.sql import SparkSession, DataFrame
from pyspark.sql.types import StructType, StringType, LongType

spark: SparkSession = SparkSession.builder.getOrCreate()

print(f"spark.master = {spark.conf.get('spark.master')}")

df: DataFrame = spark.read.text('README.md')
splitted: RDD = df.rdd.map(lambda x: x[0]).flatMap(lambda x: x.split(' '))
words: RDD = splitted.map(lambda x: (x, 1))
results: RDD = words.reduceByKey(lambda a, b: a + b)

wordCountSchema: StructType = StructType().add('word', StringType()).add('count', LongType())

results.toDF(wordCountSchema).select('word', 'count').write.format('csv').save('/tmp/word_count_results')

print('end!!')

途䞭で、spark.masterの倀を出力するようにしたした。

print(f"spark.master = {spark.conf.get('spark.master')}")

Word Countする察象は、Apache SparkのREADME.mdずしたす。

$ curl -LO https://github.com/apache/spark/raw/v3.1.2/README.md

実行。

$ spark-submit word_count.py

この時、spark.masterはlocal[*]ずなっおいたす。

spark.master = local[*]

結果は、今回のプログラムでは/tmp/word_count_resultsディレクトリに出力されたす。

結果の䟋。

$ head -n 10 /tmp/word_count_results/part-00000-b64679f0-8e18-4c2e-880c-f7d57db2b3fc-c000.csv
"#",1
Apache,1
Spark,14
"",73
is,7
a,9
unified,1
analytics,1
engine,2
for,12

再実行する堎合は、出力察象のディレクトリが存圚するず実行に倱敗するので、1床ディレクトリを削陀しおおくずよいでしょう。

$ rm -rf /tmp/word_count_results

local[2]で実行。

$ spark-submit --master local[2] word_count.py

蚭定に反映されおいるこずが確認できたす。

spark.master = local[2]

たた、spark.masterは前述の通りプログラム内でも蚘茉できたすが、通垞はコマンドラむンオプションや蚭定ファむルで
指定した方がよいでしょうね。

spark: SparkSession = SparkSession.builder.master('local[2]').getOrCreate()

スタンドアロンクラスタヌを構成する

続いおは、スタンドアロンクラスタヌを構成しおみたす。

172.17.0.2〜5の蚈4぀のノヌドを甚意し、172.17.0.2はマスタヌ、それ以倖はワヌカヌずいう構成にしたいず思いたす。

各ノヌドには、Apache Sparkをむンストヌルしおおきたす。

$ curl -LO https://downloads.apache.org/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz
$ tar xf spark-3.1.2-bin-hadoop3.2.tgz
$ cd spark-3.1.2-bin-hadoop3.2

クラスタヌは、以䞋の手順ずスクリプトに埓っお構成したす。

Spark Standalone Mode / Starting a Cluster Manually

Spark Standalone Mode / Cluster Launch Scripts

SSHを䜿っお䞀気にノヌドを起動する方法もあるようですが、SSHの蚭定が面倒なので 今回は個々に起動しおいきたす。

マスタヌは、以䞋のstart-master.shで起動したす。

$ sbin/start-master.sh

ホスト名は-hたたは--hostオプションで指定できたす。今回は指定しお起動したす。

$ sbin/start-master.sh -h 172.17.0.2

Web UIを芋おみたしょう。http://[マスタヌのIPアドレス]:8080にアクセスしおみたす。

f:id:Kazuhira:20210911222609p:plain

珟時点ではワヌカヌノヌドもありたせん。

次に、ワヌカヌを起動したしょう。マスタヌノヌドのURLを指定しお、start-worker.shを実行したす。

$ sbin/start-worker.sh spark://172.17.0.2:7077


$ sbin/start-worker.sh spark://172.17.0.2:7077


$ sbin/start-worker.sh spark://172.17.0.2:7077

起動埌、Web UIを芋るずワヌカヌが远加されおいたす。

f:id:Kazuhira:20210911222637p:plain

では、--masterを指定しおspark-submitを実行。ここで--masterの指定を忘れるず、単にロヌカルで動くだけになりたす 。

$ bin/spark-submit --master spark://172.17.0.2:7077 /host/word_count.py

実行䞭。

f:id:Kazuhira:20210911222717p:plain

終了。

f:id:Kazuhira:20210911223403p:plain

今回の実装方法の堎合、結果のファむルはワヌカヌノヌドのいずれかに出力されるようです。

今回は、2぀目に起動したワヌカヌノヌド䞊にありたした。

$ head -n 10 /tmp/word_count_results/_temporary/0/task_202109111327078853503780902620221_0001_m_000000/part-00000-1bdd6215-c471-4fb4-a0ea-ca8d32416b7d-c000.csv 
"#",1
Apache,1
Spark,14
"",73
is,7
a,9
unified,1
analytics,1
engine,2
for,12

こういうこずになりたくなければ、デヌタストアやオブゞェクトストレヌゞに結果を保存するこずになるんでしょうね。

ワヌカヌやマスタヌを停止するコマンドは、こちら。

$ sbin/stop-worker.sh


$ sbin/stop-master.sh

これで今回確認したかったこずはひずずおりできた感じです。

たずめ

Apache Sparkで、スタンドアロンクラスタヌマネヌゞャヌでちょっず遊んでみたした。

ロヌカルで動かした時、クラスタヌで動かした時の初歩が確認できた感じですね。

Amazon S3互換のオブゞェクトストレヌゞ、MinIOを詊す

これは、なにをしたくお曞いたもの

前々から1床詊しおおきたかった、Amazon S3互換のオブゞェクトストレヌゞMinIOを扱っおみようかなず。

MinIOずは

MinIOは、Amazon S3互換のオブゞェクトストレヌゞです。

MinIO | High Performance, Kubernetes Native Object Storage

Goで実装されおいたす。

GitHub - minio/minio: High Performance, Kubernetes Native Object Storage

3぀のラむセンス圢態があるようですが、サポヌトに差があるみたいですね。

Pricing

ドキュメントは、ベアメタル環境向け、Kubernetes環境向け、VMware Cloud Fundation環境向けのものがありたすが、
今回はベアメタル環境向けのものを参照したす。

MinIO High Performance Object Storage — MinIO Baremetal Documentation

MinIO Object Storage for Hybrid Cloud — MinIO Hybrid Cloud Documentation

機胜に぀いおは、こちら。

MinIO Server Features — MinIO Baremetal Documentation

Notification、バヌゞョニング、耐障害性、レプリケヌションを備えたす。

ちなみに、これらのドキュメントは珟圚䜜成䞭で、レガシヌ扱いずなったドキュメントもありたす。珟圚のドキュメントに
蚘茉がないものに぀いおは、レガシヌドキュメントの方を参照する必芁があるようです。

MinIO | The MinIO Quickstart Guide

たずえば、AWS CLIや各皮プログラミング蚀語向けのクラむアントラむブラリなどはレガシヌドキュメントにしか
ありたせん。

MinIO | AWS CLI with MinIO - Cookbook/Recipe

MinIO | Java Client Quickstart Guide

Amazon S3互換ずいうこずで、AWS CLIやAWS SDKが䜿えるわけですが、専甚のクラむアントコマンドや管理コマンド、
クラむアントラむブラリも備えおいたす。

MinIO Client (mc) — MinIO Baremetal Documentation

MinIO Admin (mc admin) — MinIO Baremetal Documentation

今回は、ずりあえずスタンドアロンでMinIOサヌバヌを立おお、クラむアントコマンドやAWS CLIでアクセスしお
みたいず思いたす。

環境

今回の環境は、こちら。Ubuntu Linux 20.04 LTSです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal


$ uname -srvmpio
Linux 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

AWS CLIもむンストヌルしおおきたした。

$ aws --version
aws-cli/2.2.36 Python/3.8.8 Linux/5.4.0-84-generic exe/x86_64.ubuntu.20 prompt/off

MinIOサヌバヌをむンストヌルする

たずは、MinIOサヌバヌをむンストヌルしたす。

MinIO | Code and downloads to create high performance object storage

むンストヌル方法は実行バむナリ、rpmパッケヌゞ、debパッケヌゞ、そしおDockerむメヌゞがありたすが、今回は
debパッケヌゞのものを䜿うこずにしたす。

debパッケヌゞをダりンロヌドしお

$ curl -O https://dl.min.io/server/minio/release/linux-amd64/minio_20210903035613.0.0_amd64.deb

むンストヌル。

$ sudo dpkg -i minio_20210903035613.0.0_amd64.deb

バヌゞョン。

$ minio --version
minio version RELEASE.2021-09-03T03-56-13Z

実行方法に぀いおはこちらに蚘茉がありたすが、

MinIO Server — MinIO Baremetal Documentation

ヘルプも確認。

$ minio --help
NAME:
  minio - High Performance Object Storage

DESCRIPTION:
  Build high performance data infrastructure for machine learning, analytics and application data workloads with MinIO

USAGE:
  minio [FLAGS] COMMAND [ARGS...]

COMMANDS:
  server   start object storage server
  gateway  start object storage gateway
  
FLAGS:
  --certs-dir value, -S value  path to certs directory (default: "/home/vagrant/.minio/certs")
  --quiet                      disable startup information
  --anonymous                  hide sensitive information from logging
  --json                       output server logs and startup information in json format
  --help, -h                   show help
  --version, -v                print the version
  
VERSION:
  RELEASE.2021-09-03T03-56-13Z

起動方法にserverずgatewayがあるようです。

MinIO Gatewayは、AWSやAzureのオブゞェクトストレヌゞをバック゚ンドにするプロセスです。

今回は、serverの方を䜿いたす。

$ minio server --help
NAME:
  minio server - start object storage server

USAGE:
  minio server [FLAGS] DIR1 [DIR2..]
  minio server [FLAGS] DIR{1...64}
  minio server [FLAGS] DIR{1...64} DIR{65...128}

DIR:
  DIR points to a directory on a filesystem. When you want to combine
  multiple drives into a single large system, pass one directory per
  filesystem separated by space. You may also use a '...' convention
  to abbreviate the directory arguments. Remote directories in a
  distributed setup are encoded as HTTP(s) URIs.

FLAGS:
  --address value              bind to a specific ADDRESS:PORT, ADDRESS can be an IP or hostname (default: ":9000")
  --console-address value      bind to a specific ADDRESS:PORT for embedded Console UI, ADDRESS can be an IP or hostname
  --certs-dir value, -S value  path to certs directory (default: "/home/vagrant/.minio/certs")
  --quiet                      disable startup information
  --anonymous                  hide sensitive information from logging
  --json                       output server logs and startup information in json format
  --help, -h                   show help
  
EXAMPLES:
  1. Start minio server on "/home/shared" directory.
     $ minio server /home/shared

  2. Start single node server with 64 local drives "/mnt/data1" to "/mnt/data64".
     $ minio server /mnt/data{1...64}

  3. Start distributed minio server on an 32 node setup with 32 drives each, run following command on all the nodes
     $ export MINIO_ROOT_USER=minio
     $ export MINIO_ROOT_PASSWORD=miniostorage
     $ minio server http://node{1...32}.example.com/mnt/export{1...32}

  4. Start distributed minio server in an expanded setup, run the following command on all the nodes
     $ export MINIO_ROOT_USER=minio
     $ export MINIO_ROOT_PASSWORD=miniostorage
     $ minio server http://node{1...16}.example.com/mnt/export{1...32} \
            http://node{17...64}.example.com/mnt/export{1...64}

デヌタを保存するためのディレクトリが必芁なようなので、䜜成しお

$ mkdir data

起動。

$ minio server data
API: http://192.168.121.136:9000  http://192.168.33.10:9000  http://127.0.0.1:9000     
RootUser: minioadmin 
RootPass: minioadmin 

Console: http://192.168.121.136:42799 http://192.168.33.10:42799 http://127.0.0.1:42799   
RootUser: minioadmin 
RootPass: minioadmin 

Command-line: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc alias set myminio http://192.168.121.136:9000 minioadmin minioadmin

Documentation: https://docs.min.io

WARNING: Console endpoint is listening on a dynamic port (42799), please use --console-address ":PORT" to choose a static port.
WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

特に指定しないず、Web Consoleのポヌトがランダムに決たるようなので、指定しおおきたす。ドキュメントに習っお
9001にしおおきたした。

$ minio server data --console-address ":9001"
API: http://192.168.121.136:9000  http://192.168.33.10:9000  http://127.0.0.1:9000     
RootUser: minioadmin 
RootPass: minioadmin 

Console: http://192.168.121.136:9001 http://192.168.33.10:9001 http://127.0.0.1:9001   
RootUser: minioadmin 
RootPass: minioadmin 

Command-line: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc alias set myminio http://192.168.121.136:9000 minioadmin minioadmin

Documentation: https://docs.min.io
WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

起動時に衚瀺されおいるのは、MinIOの管理ナヌザヌの名前ずパスワヌドでもあり、AWS SDKのクレデンシャルでも
ありたす。

これは、MINIO_ROOT_USERおよびMINIO_ROOT_PASSWORD環境倉数で指定するこずができたす。

$ MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password minio server data --console-address ":9001"
API: http://192.168.121.136:9000  http://192.168.33.10:9000  http://127.0.0.1:9000     
RootUser: admin 
RootPass: password 

Console: http://192.168.121.136:9001 http://192.168.33.10:9001 http://127.0.0.1:9001   
RootUser: admin 
RootPass: password 

Command-line: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc alias set myminio http://192.168.121.136:9000 admin password

Documentation: https://docs.min.io

今回は、デフォルトのminioadmin / minioadminをそのたた䜿うこずにしたす。

$ minio server data --console-address ":9001"

MinIOクラむアントをむンストヌルする

続いおは、MinIOクラむアントをむンストヌルしたしょう。

こちらも、debパッケヌゞでむンストヌルしたす。ダりンロヌドしお

$ curl -O https://dl.min.io/client/mc/release/linux-amd64/mcli_20210902092127.0.0_amd64.deb

むンストヌル。

$ sudo dpkg -i mcli_20210902092127.0.0_amd64.deb

バヌゞョン。

$ mcli --version
mcli version RELEASE.2021-09-02T09-21-27Z

ちなみに、実行可胜ファむルでむンストヌルするずmcコマンドずなり、rpmパッケヌゞやdebパッケヌゞでむンストヌル
するずmcliコマンドになりたす。

MinIO | Code and downloads to create high performance object storage

どちらにせよ、むンストヌルされるのは単䞀バむナリだけですが。

$ dpkg -L mcli
/usr
/usr/local
/usr/local/bin
/usr/local/bin/mcli

ダりンロヌドペヌゞに蚘茉されおいるコマンドに埓い、myminioずいう名前にロヌカルのMinIOを゚むリアスずしお
蚭定したす。この時、ナヌザヌ名ずパスワヌドも必芁です。

$ mcli alias set myminio http://localhost:9000 minioadmin minioadmin

MinIOサヌバヌの情報を確認。

$ mcli admin info myminio
●  localhost:9000
   Uptime: 6 minutes 
   Version: 2021-09-03T03:56:13Z
   Network: 1/1 OK 

いく぀かコマンドを詊しおみたす。

バケットの䜜成。

$ mcli mb myminio/my-bucket
Bucket created successfully `myminio/my-bucket`.

確認。

$ mcli ls myminio
[2021-09-10 22:58:17 JST]     0B my-bucket/

ロヌカルでファむルを䜜成しお

$ echo 'Hello World' > hello.txt

アップロヌド。

$ mcli cp hello.txt myminio/my-bucket/hello.txt

ダりンロヌド。

$ mcli cp myminio/my-bucket/hello.txt hello-copy.txt


$ cat hello-copy.txt
Hello World

ファむル削陀。

$ mcli rm myminio/my-bucket/hello.txt
Removing `myminio/my-bucket/hello.txt`.

バケット削陀。

$ mcli rb myminio/my-bucket
Removed `myminio/my-bucket` successfully.

もう1床バケットの䜜成ずファむルアップロヌド、そしおバケットをもうひず぀䜜成したす。

$ mcli mb myminio/my-bucket
$ mcli cp hello.txt myminio/my-bucket/hello.txt


$ mcli mb myminio/my-bucket2

起動時に--console-address ":9001"を指定したので、http://[MinIOサヌバヌのIPアドレス]:9001でWeb Consoleに
アクセスできたす。

MinIO Console — MinIO Baremetal Documentation

ログむンアカりントは、起動時に衚瀺されたナヌザヌ名ずパスワヌドです。

Web Consoleでは、Minioサヌバヌの情報を参照したり、バケットぞのアクセス、ナヌザヌ管理などができたりしたす。

f:id:Kazuhira:20210910230530p:plain

f:id:Kazuhira:20210910230550p:plain

AWS CLIでアクセスする

続いお、AWS CLIでアクセスしおみたしょう。

クレデンシャルずリヌゞョンは、環境倉数で指定するこずにしたす。

$ export AWS_ACCESS_KEY_ID=minioadmin
$ export AWS_SECRET_ACCESS_KEY=minioadmin
$ export AWS_DEFAULT_REGION=ap-northeast-1

AWS CLIでアクセスする際は、--endpoint-url http://[MinIOサヌバヌのIPアドレス]:9000を指定したす。

$ aws --endpoint-url http://localhost:9000 s3 ls
2021-09-10 23:03:54 my-bucket
2021-09-10 23:04:19 my-bucket2

先ほど、MinIOのクラむアントツヌルで䜜成したバケットが芋えおいたす。

ファむルのダりンロヌド。

$ aws --endpoint-url http://localhost:9000 s3 cp s3://my-bucket/hello.txt -
Hello World

こちらもOKそうですね。

systemdでMinIOサヌバヌを起動する

ずころで、MinIOサヌバヌのパッケヌゞを芋るず、どうやらsystemdの定矩ファむルが含たれおいるようです。

$ dpkg -L minio
/usr
/usr/local
/usr/local/bin
/usr/local/bin/minio
/etc
/etc/systemd
/etc/systemd/system
/etc/systemd/system/minio.service

systemdのナニット定矩ファむルは、こんな感じでした。

/etc/systemd/system/minio.service

[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

有効化しお

$ sudo systemctl enable minio
Created symlink /etc/systemd/system/multi-user.target.wants/minio.service → /etc/systemd/system/minio.service.

起動しようずするず、倱敗したす。

$ sudo systemctl start minio
Job for minio.service failed because the control process exited with error code.
See "systemctl status minio.service" and "journalctl -xe" for details.

ログを芋るず、クレデンシャルに問題があるようです。

 9月 10 23:18:28 server systemd[1]: Starting MinIO...
 9月 10 23:18:28 server systemd[1989]: minio.service: Failed to determine user credentials: No such process
 9月 10 23:18:28 server systemd[1989]: minio.service: Failed at step USER spawning /bin/bash: No such process

ナニット定矩のナヌザヌおよびグルヌプ指定を芋るず、存圚しないナヌザヌずグルヌプが指定されおいたす。

User=minio-user
Group=minio-user

このたただず起動しないので、ナヌザヌを远加したす。

$ sudo useradd minio-user

これでもただ倱敗したす。

$ sudo systemctl start minio
Job for minio.service failed because the control process exited with error code.
See "systemctl status minio.service" and "journalctl -xe" for details.

゚ラヌメッセヌゞを確認するず、/etc/default/minioずいうファむルに環境倉数の定矩がないず蚀っおいたす。

 9月 10 23:19:44 server systemd[1]: Starting MinIO...
 9月 10 23:19:44 server bash[2030]: Variable MINIO_VOLUMES not set in /etc/default/minio

これは、ExecStartPreおよびExecStartを芋るず理由がわかりたす。

ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

起動時の蚭定をしなければいけないようです。

では、デヌタを保存するディレクトリを䜜成しお

$ sudo mkdir -p /var/lib/minio/data
$ sudo chown -R minio-user:minio-user /var/lib/minio

/etc/default/minioファむルも䜜成したす。ここで、起動時のオプションずデヌタの保存先を指定したす。

/etc/default/minio

MINIO_OPTS=--console-address :9001
MINIO_VOLUMES=/var/lib/minio/data

今床は起動するようになりたす。

$ sudo systemctl start minio

デフォルトのクレデンシャルだず譊告が出るので

 9月 10 23:26:00 server minio[2273]: WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

奜みに応じお、MINIO_ROOT_USERおよびMINIO_ROOT_PASSWORDを蚭定しおクレデンシャルを指定するず
よいでしょう。

/etc/default/minio

MINIO_OPTS=--console-address :9001
MINIO_VOLUMES=/var/lib/minio/data
MINIO_ROOT_USER=root-user
MINIO_ROOT_PASSWORD=password

たずめ

Amazon S3互換のオブゞェクトストレヌゞ、MinIOを詊しおみたした。

MinIOのクラむアントコマンドは最初は戞惑ったりしたしたが、あずはそれほど困りたせんでしたね。

お手軜に䜿えそうなので、Amazon S3の代わりが欲しい時はLocalStackず䜿い分けおいこうかなず思いたす。