基于Docker部署Spark和MinIO Server

介绍

使用Docker搭建Spark集群和MinIO云存储服务,并通过Spark访问MinIO,实现读写功能。

MinIO是什么

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
详细资料参考这里

Docker实现

本项目使用的docker-compose文件如下,根据docker-compose的内容,大致分为三个部分。

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对象存储服务搭建

分布式MinIO可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式MinIO避免了单点故障。
详细参考这里

Docker-compose中的minio1-4z组成MinIO分布式存储,对应存储服务的4个节点,每个节点使用相同的MINIO_ACCESS_KEYMINIO_SECRET_KEY。部署成功后访问http://127.0.0.1:9001/,输入miniominio123即可看到如下界面(点击右下角可以创建bucket):
详细参考这里

MinIO存储服务.png

Spark集群搭建

Docker-compose中的spark-master,spark-worker组成Spark集群。spark-masterminio1建立容器链接,后续需要Spark读写MinIO存储。部署成功后访问http://127.0.0.1:8080/即可看到如下界面:

spark-cluster.png

Saprk集群相关知识参考这里

MinIO Client搭建

Docker-compose中的minio-mc对应MinIO Client。MinIO Client提供了一些命令如ls, cat, cp, mirror, diff, find等,实现与MinIO云存储服务的交互。minio-mcminio1建立容器链接,后续需要使用minio-mc创建bucket。
MinIO Client的相关知识参考链接1,链接2

启动容器

配置MinIO-Client

  • 执行docker exec -it cas001-minio-mc /bin/sh进入MinIO-Client
  • 执行ping S3_server确认MinIO存储服务的IP地址,例如192.168.144.3
  • 执行以下语句,创建一个名为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
  • 执行mc ls myminio即可看到创建的bucket

配置Spark集群

Spark访问MinIO存储需要一些依赖包,具体参考这里。其中必须添加的两个jar包是:hadoop-aws-2.7.3aws-java-sdk-1.7.4

  • Hadoop安装文件夹中包含了上述两个jar包,可以在Hadoop安装目录下执行find /hadoop_path -name hadoop-aws*.jarfind /hadoop_path -name hadoop-aws*.jar来查找jar包的位置。
  • 如果本机没有安装Hadoop,即使用的Spark安装包如spark-2.4.5-bin-hadoop2.7.tgz所示, 则需要先确认对应的Hadoop具体版本(可以查看spark/jars/下与Hadoop相关的jar包来确认hadoop版本),然后去下载对应的jar包。
  • jar包准备好后,执行bash copy_dependencies.sh将对应的jar包拷贝到spark-masterspark-worker的spark安装路径jars文件夹下,copy_dependencies.sh的内容如下:
#!/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存储

准备工作

  • 确保配置MinIO-Client执行成功,有对应的buckettest.json文件存在
  • 执行docker exec -it cas001-spark-master /bin/bash进入cas001-spark-master容器
  • 执行ping S3_db确认MinIO 存储服务IP地址,例如192.168.144.3

使用spark-shell读取MinIO存储

  • 执行如下命令,打开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
  • 执行如下命令读取MinIO存储
val b1 = sc.textFile("s3a://spark-test/test.json")
b1.collect().foreach(println)
  • 执行结果如下所示:


    spark-shell-read-data.png
  • 参考这里尝试更多的读写操作
    注意spark.hadoop.fs.s3a.endpoint这项配置后面必须要是ip:端口的形式,使用docker容器的S3_db:端口这种方式会报错。

使用spark-submit提交delta-lake作业

  • 执行bash copy-delta-lake-demo.sh拷贝程序所需的jar包,copy-delta-lake-demo.sh具体内容如下:
#!/bin/bash
SPARK_MASTER="cas001-spark-master"

docker cp ./delte-lake-demo/. ${SPARK_MASTER}:/spark/examples
  • 执行如下命令,提交作业:
./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 主程序参数:S3_bucket:s3a://spark-test/  ,S3_bucket文件名1:delta21 ,S3_bucket文件名2:schemaCheck21
  • 执行结果如下所示:或使用mc命令校验
    spark-submit-delta-lake-demo.png

源代码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs)...
    草里有只羊阅读 3,226评论 0 15
  • MinIO说明MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3...
    西柚酱_阅读 15,731评论 2 4
  • 首先我们的问题是:产品包含了大量的服务,并且服务之间存在复杂的依赖关系,以拓扑的形式运行并相互协作,部署的时候需要...
    墨弈阅读 2,890评论 0 50
  • 我常常梦见在放牛,在兜儿山上放一条大牯牛。 我上小学的时候,家里耕田耙地需要牛的协助。当时家里经济...
    素心齋阅读 903评论 2 4
  • 一 虔诚相望 深含一眸心语 对你的期盼 穿越时空的界限 寻觅和追逐 幻觉于泡影 坦然匍匐 朝向有你的前方 二 轻轻...
    浅浅是水阅读 1,208评论 28 36