介紹
使用Docker搭建Spark集群和MinIO云存儲(chǔ)服務(wù),并通過(guò)Spark訪問(wèn)MinIO肯适,實(shí)現(xiàn)讀寫功能。
MinIO是什么
MinIO 是一個(gè)基于Apache License v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù)。它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù)怀读,例如圖片诉位、視頻骑脱、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等苍糠,而一個(gè)對(duì)象文件可以是任意大小叁丧,從幾kb到最大5T不等。
MinIO是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合岳瞭,類似 NodeJS, Redis 或者 MySQL拥娄。
詳細(xì)資料參考這里
Docker實(shí)現(xiàn)
本項(xiàng)目使用的docker-compose文件如下,根據(jù)docker-compose的內(nèi)容瞳筏,大致分為三個(gè)部分稚瘾。
version: '3.7'
# starts 4 docker containers running minio server instances. Each
# minio server's web interface will be accessible on the host at port
# 9001 through 9004.
services:
minio1:
image: minio/minio:RELEASE.2020-04-15T19-42-18Z
volumes:
- data1-1:/data1
- data1-2:/data2
ports:
- "9001:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio2:
image: minio/minio:RELEASE.2020-04-15T19-42-18Z
volumes:
- data2-1:/data1
- data2-2:/data2
ports:
- "9002:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio3:
image: minio/minio:RELEASE.2020-04-15T19-42-18Z
volumes:
- data3-1:/data1
- data3-2:/data2
ports:
- "9003:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio4:
image: minio/minio:RELEASE.2020-04-15T19-42-18Z
volumes:
- data4-1:/data1
- data4-2:/data2
ports:
- "9004:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
spark-master:
image: cas001/spark-master:2.4.5-hadoop2.7
container_name: cas001-spark-master
ports:
- "7077:7077"
- "8080:8080"
links:
- minio1:S3_db
spark-worker:
image: cas001/spark-worker:2.4.5-hadoop2.7
container_name: cas001-spark-worker
ports:
- "8081"
minio-mc:
image: minio/mc:RELEASE.2020-04-19T19-17-53Z
container_name: cas001-minio-mc
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
links:
- minio1:S3_server
entrypoint: /bin/sh
tty: true
## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
data1-1:
data1-2:
data2-1:
data2-2:
data3-1:
data3-2:
data4-1:
data4-2:
分布式MinIO對(duì)象存儲(chǔ)服務(wù)搭建
分布式MinIO可以讓你將多塊硬盤(甚至在不同的機(jī)器上)組成一個(gè)對(duì)象存儲(chǔ)服務(wù)。由于硬盤分布在不同的節(jié)點(diǎn)上姚炕,分布式MinIO避免了單點(diǎn)故障摊欠。
詳細(xì)參考這里
Docker-compose中的minio1-4
z組成MinIO分布式存儲(chǔ),對(duì)應(yīng)存儲(chǔ)服務(wù)的4個(gè)節(jié)點(diǎn)柱宦,每個(gè)節(jié)點(diǎn)使用相同的MINIO_ACCESS_KEY
和MINIO_SECRET_KEY
些椒。部署成功后訪問(wèn)http://127.0.0.1:9001/,輸入minio
掸刊,minio123
即可看到如下界面(點(diǎn)擊右下角可以創(chuàng)建bucket):
詳細(xì)參考這里
Spark集群搭建
Docker-compose中的spark-master
,spark-worker
組成Spark集群。spark-master
與minio1
建立容器鏈接牌芋,后續(xù)需要Spark讀寫MinIO存儲(chǔ)。部署成功后訪問(wèn)http://127.0.0.1:8080/即可看到如下界面:
Saprk集群相關(guān)知識(shí)參考這里
MinIO Client搭建
Docker-compose中的minio-mc
對(duì)應(yīng)MinIO Client。MinIO Client提供了一些命令如ls, cat, cp, mirror, diff, find
等母怜,實(shí)現(xiàn)與MinIO云存儲(chǔ)服務(wù)的交互苹熏。minio-mc
與minio1
建立容器鏈接轨域,后續(xù)需要使用minio-mc
創(chuàng)建bucket干发。
MinIO Client的相關(guān)知識(shí)參考鏈接1,鏈接2
啟動(dòng)容器
- 執(zhí)行
docker-compose up -d
命令史翘,啟動(dòng)所有容器 - 訪問(wèn)http://127.0.0.1:9001/確認(rèn)MinIO存儲(chǔ)服務(wù)正常
- 訪問(wèn)http://127.0.0.1:8080/確認(rèn)Spark集群正常
配置MinIO-Client
- 執(zhí)行
docker exec -it cas001-minio-mc /bin/sh
進(jìn)入MinIO-Client - 執(zhí)行
ping S3_server
確認(rèn)MinIO存儲(chǔ)服務(wù)的IP地址,例如192.168.144.3
- 執(zhí)行以下語(yǔ)句必峰,創(chuàng)建一個(gè)名為
spark-test
的bucket吼蚁,并傳入一份test.json
文件
mc config host add myminio http://192.168.144.3:9000 minio minio123
mc mb myminio/spark-test
mc cp test.json myminio/spark-test/test.json
- 執(zhí)行
mc ls myminio
即可看到創(chuàng)建的bucket
配置Spark集群
Spark訪問(wèn)MinIO存儲(chǔ)需要一些依賴包,具體參考這里术唬。其中必須添加的兩個(gè)jar包是:hadoop-aws-2.7.3粗仓,aws-java-sdk-1.7.4塘淑。
- Hadoop安裝文件夾中包含了上述兩個(gè)jar包存捺,可以在Hadoop安裝目錄下執(zhí)行
find /hadoop_path -name hadoop-aws*.jar
和find /hadoop_path -name hadoop-aws*.jar
來(lái)查找jar包的位置捌治。 - 如果本機(jī)沒(méi)有安裝Hadoop,即使用的Spark安裝包如
spark-2.4.5-bin-hadoop2.7.tgz
所示森枪, 則需要先確認(rèn)對(duì)應(yīng)的Hadoop具體版本(可以查看spark/jars/
下與Hadoop相關(guān)的jar包來(lái)確認(rèn)hadoop版本)县袱,然后去下載對(duì)應(yīng)的jar包。 - jar包準(zhǔn)備好后杂数,執(zhí)行
bash copy_dependencies.sh
將對(duì)應(yīng)的jar包拷貝到spark-master
和spark-worker
的spark安裝路徑j(luò)ars文件夾下次和,copy_dependencies.sh
的內(nèi)容如下:
#!/bin/bash
SPARK_MASTER="cas001-spark-master"
SPARK_WORKER="cas001-spark-worker"
docker cp ./dependencies/. ${SPARK_MASTER}:/spark/jars
docker cp ./dependencies/. ${SPARK_WORKER}:/spark/jars
配置Spark集群參考鏈接1石蔗,鏈接2,鏈接3棍厌,鏈接4,鏈接5
Spark讀寫MinIO存儲(chǔ)
準(zhǔn)備工作
- 確保
配置MinIO-Client
執(zhí)行成功耘纱,有對(duì)應(yīng)的bucket
和test.json文件存在
- 執(zhí)行
docker exec -it cas001-spark-master /bin/bash
進(jìn)入cas001-spark-master
容器 - 執(zhí)行
ping S3_db
確認(rèn)MinIO 存儲(chǔ)服務(wù)IP地址,例如192.168.144.3
使用spark-shell讀取MinIO存儲(chǔ)
- 執(zhí)行如下命令敬肚,打開spark-shell
./bin/spark-shell \
--conf spark.hadoop.fs.s3a.endpoint=http://192.168.144.3:9000 \
--conf spark.hadoop.fs.s3a.access.key=minio \
--conf spark.hadoop.fs.s3a.secret.key=minio123 \
--conf spark.hadoop.fs.s3a.path.style.access=true \
--conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
- 執(zhí)行如下命令讀取MinIO存儲(chǔ)
val b1 = sc.textFile("s3a://spark-test/test.json")
b1.collect().foreach(println)
-
執(zhí)行結(jié)果如下所示:
spark-shell-read-data.png 參考這里嘗試更多的讀寫操作
注意:spark.hadoop.fs.s3a.endpoint
這項(xiàng)配置后面必須要是ip:端口
的形式,使用docker容器的S3_db:端口
這種方式會(huì)報(bào)錯(cuò)束析。
使用spark-submit提交delta-lake作業(yè)
- 執(zhí)行
bash copy-delta-lake-demo.sh
拷貝程序所需的jar包艳馒,copy-delta-lake-demo.sh
具體內(nèi)容如下:
#!/bin/bash
SPARK_MASTER="cas001-spark-master"
docker cp ./delte-lake-demo/. ${SPARK_MASTER}:/spark/examples
- 執(zhí)行如下命令,提交作業(yè):
./bin/spark-submit --master spark://spark-master:7077 \
--conf spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore \
--conf spark.hadoop.fs.s3a.endpoint=http://192.168.144.3:9000 \
--conf spark.hadoop.fs.s3a.access.key=minio \
--conf spark.hadoop.fs.s3a.secret.key=minio123 \
--conf spark.hadoop.fs.s3a.path.style.access=true \
--conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
--jars /spark/examples/delta-core_2.11-0.5.0.jar \
--class com.delta.Run examples/original-deltaLake2-1.0-SNAPSHOT.jar s3a://spark-test/ delta21 schemaCheck21
# Run 主程序參數(shù):S3_bucket:s3a://spark-test/ ,S3_bucket文件名1:delta21 ,S3_bucket文件名2:schemaCheck21
- 執(zhí)行結(jié)果如下所示:或使用
mc
命令校驗(yàn)
spark-submit-delta-lake-demo.png