基于Docker部署Spark和MinIO Server

介紹

使用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-4z組成MinIO分布式存儲(chǔ),對(duì)應(yīng)存儲(chǔ)服務(wù)的4個(gè)節(jié)點(diǎn)柱宦,每個(gè)節(jié)點(diǎn)使用相同的MINIO_ACCESS_KEYMINIO_SECRET_KEY些椒。部署成功后訪問(wèn)http://127.0.0.1:9001/,輸入minio掸刊,minio123即可看到如下界面(點(diǎn)擊右下角可以創(chuàng)建bucket):
詳細(xì)參考這里

MinIO存儲(chǔ)服務(wù).png

Spark集群搭建

Docker-compose中的spark-master,spark-worker組成Spark集群。spark-masterminio1建立容器鏈接牌芋,后續(xù)需要Spark讀寫MinIO存儲(chǔ)。部署成功后訪問(wèn)http://127.0.0.1:8080/即可看到如下界面:

spark-cluster.png

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-mcminio1建立容器鏈接轨域,后續(xù)需要使用minio-mc創(chuàng)建bucket干发。
MinIO Client的相關(guān)知識(shí)參考鏈接1,鏈接2

啟動(dòng)容器

配置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*.jarfind /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-masterspark-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)的buckettest.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

源代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末员寇,一起剝皮案震驚了整個(gè)濱河市弄慰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝶锋,老刑警劉巖曹动,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牲览,居然都是意外死亡墓陈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門第献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贡必,“玉大人,你說(shuō)我怎么就攤上這事庸毫∽心猓” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵飒赃,是天一觀的道長(zhǎng)利花。 經(jīng)常有香客問(wèn)我,道長(zhǎng)载佳,這世上最難降的妖魔是什么炒事? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔫慧,結(jié)果婚禮上挠乳,老公的妹妹穿的比我還像新娘。我一直安慰自己姑躲,他們只是感情好睡扬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黍析,像睡著了一般卖怜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阐枣,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天马靠,我揣著相機(jī)與錄音牍戚,去河邊找鬼。 笑死虑粥,一個(gè)胖子當(dāng)著我的面吹牛如孝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娩贷,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼第晰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了彬祖?” 一聲冷哼從身側(cè)響起茁瘦,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎储笑,沒(méi)想到半個(gè)月后肾扰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體业稼,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡音比,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年穴吹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羽历。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焊虏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秕磷,到底是詐尸還是另有隱情诵闭,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布澎嚣,位于F島的核電站疏尿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏易桃。R本人自食惡果不足惜褥琐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颈抚。 院中可真熱鬧踩衩,春花似錦、人聲如沸贩汉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匹舞。三九已至,卻和暖如春线脚,著一層夾襖步出監(jiān)牢的瞬間赐稽,已是汗流浹背叫榕。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姊舵,地道東北人晰绎。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像括丁,于是被迫代替她去往敵國(guó)和親荞下。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spark 編程指南 概述 Spark 依賴 初始化 Spark 使用 Shell 彈性分布式數(shù)據(jù)集 (RDDs)...
    草里有只羊閱讀 3,248評(píng)論 0 15
  • MinIO說(shuō)明MinIO 是一個(gè)基于Apache License v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù)史飞。它兼容亞馬遜S3...
    西柚醬_閱讀 15,779評(píng)論 2 4
  • 首先我們的問(wèn)題是:產(chǎn)品包含了大量的服務(wù)尖昏,并且服務(wù)之間存在復(fù)雜的依賴關(guān)系,以拓?fù)涞男问竭\(yùn)行并相互協(xié)作构资,部署的時(shí)候需要...
    墨弈閱讀 2,906評(píng)論 0 50
  • 我常常夢(mèng)見在放牛抽诉,在兜兒山上放一條大牯牛。 我上小學(xué)的時(shí)候吐绵,家里耕田耙地需要牛的協(xié)助迹淌。當(dāng)時(shí)家里經(jīng)濟(jì)...
    素心齋閱讀 922評(píng)論 2 4
  • 一 虔誠(chéng)相望 深含一眸心語(yǔ) 對(duì)你的期盼 穿越時(shí)空的界限 尋覓和追逐 幻覺于泡影 坦然匍匐 朝向有你的前方 二 輕輕...
    淺淺是水閱讀 1,214評(píng)論 28 36