基于MinIO/Deleta Lake/Dremio和Superset或Metabase搭建简单的数据湖

Posted 琦彦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MinIO/Deleta Lake/Dremio和Superset或Metabase搭建简单的数据湖相关的知识,希望对你有一定的参考价值。


云原数据湖架构

 图来源自阿里云, 作为一个架构设计参考


基础环境


Docker

Docker版本: 20.10.10


访问地址


Portainer

地址:http://10.0.0.198:9999/#!/home
用户名/密码 admin/ admin123


MinIO

地址: http://10.0.0.198:9009/dashboard
用户名/密码 minio/minio123


Spark

地址: http://10.0.0.198


Dremio

地址: http://10.0.0.198:9047
用户名/密码 dremio/ dremio123


Metabase

地址: http://10.0.0.198:3000
用户名/密码 test123@sina.com / test123@sina.com


在 Linux 系统上安装 Compose

在 Linux 上,你可以从GitHub 上Compose 存储库发布页面下载 Docker Compose 二进制文件 。按照链接中的说明进行操作,其中包括curl在终端中运行命令以下载二进制文件。这些分步说明也包含在下面。

对于alpine,需要以下依赖包: py-pippython3-devlibffi-devopenssl-devgcclibc-devrustcargomake


下载 Docker Compose 的当前稳定版本:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

要安装不同版本的 Compose,请替换1.29.2 为你要使用的 Compose 版本。


对二进制文件应用可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

注意:如果docker-compose安装后命令失败,请检查你的路径。你还可以/usr/bin在路径中创建指向或任何其他目录的符号链接。

例如:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose


bash 补全命令

在当前的 Linux 操作系统上(在非最小安装中),bash 完成应该可用。

将完成脚本放在/etc/bash_completion.d/.

sudo curl \\
    -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \\
    -o /etc/bash_completion.d/docker-compose

重新加载你的终端。你可以关闭然后打开一个新终端,或者source ~/.bashrc在当前终端中使用命令重新加载你的设置。


测试安装。

docker-compose --version
docker-compose version 1.29.2, build 1110ad01


MinIO

在Docker Compose上部署分布式MinIO,请下载docker-compose.yaml到你的当前工作目录。Docker Compose会pull MinIO Docker Image,所以你不需要手动去下载MinIO binary。然后运行下面的命令



安装

# 配置信息
#################### MINIO #####################
x-minio-image: &minio-image minio/minio:RELEASE.2021-07-30T00-02-00Z
x-minio-data-dir: &minio-data-dir
  # 映射文件路径
  - /mydata/minio/data:/data

#用于部署运行所依赖的基础环境组件
version: '3.9'
services:
  # 1.MinIO服务器
  minio:
    image: *minio-image
    container_name: minio
    ports:
      - "9000:9000"
      - "9009:9009"
    restart: always
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
    command: server /data --console-address ":9009"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123 #大于等于8位
    logging:
      options:
        max-size: "2048M" # 最大文件上传限制
        max-file: "10"
      driver: json-file
    volumes: *minio-data-dir
    healthcheck:
      test: ["CMD", "curl", "-f", "http://10.0.0.198:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3


参考链接:

https://www.jianshu.com/p/aaa797181c2d


Spark3(包含Deleta Lake)

# 2.spark3(包含Deleta Lake)
  # 2.1 spark-master
  spark:
    image: datamechanics/spark:jvm-only-3.1-latest
    hostname: spark
    command: /opt/spark/sbin/start-master.sh
    environment:
      - "SPARK_MASTER_HOST=spark"
    ports:
      - "8080:8080"
      - "7077:7077"
  # 2.2 spark-worker
  worker:
    image: datamechanics/spark:jvm-only-3.1-latest
    hostname: worker
    command: /opt/spark/sbin/start-worker.sh
    environment:
      - "SPARK_MASTER_HOST=spark"
    ports:
      - "8080:8080"
      - "7077:7077"


spark 集成delta lake 以及minio s3

  • 运行命令

    # 1. 进入根目录
    cd 
    # 2. spark 集成delta lake 以及minio s3
    ./bin/spark-shell \\
    --packages io.delta:delta-core_2.12:1.0.0,org.apache.hadoop:hadoop-aws:3.2.0 \\
    --conf "spark.hadoop.fs.s3a.access.key=minio" \\
    --conf "spark.hadoop.fs.s3a.secret.key=minio123" \\
    --conf "spark.hadoop.fs.s3a.endpoint=http://10.0.0.198:9000" \\
    --conf "spark.databricks.delta.retentionDurationCheck.enabled=false" \\
    --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \\
    --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
    # 3. 创建delta lake table--先在minio中创建名为delta-lake的bucket,然后生成随机数保存都firstdemo中
    spark.range(50000000).write.format("delta").save("s3a://delta-lake/firstdemo")
    
  • 运行示例

185@spark:~/work-dir$ cd 
185@spark:~$ ./bin/spark-shell \\
--packages io.delta:delta-core_2.12:1.0.0,org.apache.hadoop:hadoop-aws:3.2.0 \\
--conf "spark.hadoop.fs.s3a.access.key=minio" \\
--conf "spark.hadoop.fs.s3a.secret.key=minio123" \\
--conf "spark.hadoop.fs.s3a.endpoint=http://10.0.0.198:9000" \\
--conf "spark.databricks.delta.retentionDurationCheck.enabled=false" \\
--conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \\
--conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
:: loading settings :: url = jar:file:/opt/spark/jars/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
Ivy Default Cache set to: /opt/spark/.ivy2/cache
The jars for the packages stored in: /opt/spark/.ivy2/jars
io.delta#delta-core_2.12 added as a dependency
org.apache.hadoop#hadoop-aws added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent-b3b3485b-6bb5-42b7-a4fc-5a6ceee32dbe;1.0
        confs: [default]
        found io.delta#delta-core_2.12;1.0.0 in central
        found org.antlr#antlr4;4.7 in central
        found org.antlr#antlr4-runtime;4.7 in central
        found org.antlr#antlr-runtime;3.5.2 in central
        found org.antlr#ST4;4.0.8 in central
        found org.abego.treelayout#org.abego.treelayout.core;1.0.3 in central
        found org.glassfish#javax.json;1.0.4 in central
        found com.ibm.icu#icu4j;58.2 in central
        found org.apache.hadoop#hadoop-aws;3.2.0 in central
        found com.amazonaws#aws-java-sdk-bundle;1.11.375 in central
:: resolution report :: resolve 350ms :: artifacts dl 9ms
        :: modules in use:
        com.amazonaws#aws-java-sdk-bundle;1.11.375 from central in [default]
        com.ibm.icu#icu4j;58.2 from central in [default]
        io.delta#delta-core_2.12;1.0.0 from central in [default]
        org.abego.treelayout#org.abego.treelayout.core;1.0.3 from central in [default]
        org.antlr#ST4;4.0.8 from central in [default]
        org.antlr#antlr-runtime;3.5.2 from central in [default]
        org.antlr#antlr4;4.7 from central in [default]
        org.antlr#antlr4-runtime;4.7 from central in [default]
        org.apache.hadoop#hadoop-aws;3.2.0 from central in [default]
        org.glassfish#javax.json;1.0.4 from central in [default]
        ---------------------------------------------------------------------
        |                  |            modules            ||   artifacts   |
        |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
        ---------------------------------------------------------------------
        |      default     |   10  |   0   |   0   |   0   ||   10  |   0   |
        ---------------------------------------------------------------------
:: retrieving :: org.apache.spark#spark-submit-parent-b3b3485b-6bb5-42b7-a4fc-5a6ceee32dbe
        confs: [default]
        0 artifacts copied, 10 already retrieved (0kB/9ms)
21/11/04 05:10:33 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
21/11/04 05:10:41 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
Spark context Web UI available at http://localhost:4041
Spark context available as 'sc' (master = local[*], app id = local-1636002641781).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\\ \\/ _ \\/ _ `/ __/  '_/
   /___/ .__/\\_,_/_/ /_/\\_\\   version 3.1.1
      /_/
         
Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 1.8.0_312)
Type in expressions to have them evaluated.
Type :help for more information.

scala> spark.range(50000000).write.format("delta").save("s3a://delta-lake/firstdemo")
21/11/04 05:12:09 WARN MemoryManager: Total allocation exceeds 95.00% (906,992,014 bytes) of heap memory
Scaling row group sizes to 96.54% for 7 writers
21/11/04 05:12:09 WARN MemoryManager: Total allocation exceeds 95.00% (906,992,014 bytes) of heap memory
Scaling row group sizes to 84.47% for 8 writers
21/11/04 05:12:14 WARN MemoryManager: Total allocation exceeds 95.00% (906,992,014 bytes) of heap memory
Scaling row group sizes to 96.54% for 7 writers


参考链接:

http://spark.apache.org/docs/latest/running-on-kubernetes.html

https://cloud.tencent.com/developer/article/1156852

https://www.cnblogs.com/rongfengliang/p/14928505.html

https://community.dremio.com/t/error-restore-backup/6114/19


Dremio

version: “3.2”
services:
	mssql:
		container_name: mssql
		image: microsoft/mssql-server-linux:2017-latest
		ports:
			- “1433:1433”
		environment:
			SA_PASSWORD: “A_P@ssw0rd”
			ACCEPT_EULA: “Y”
	
	dremio_coordinator:
		container_name: dremio
		image: dremio/dremio-oss
		volumes:
			- C:\\MYSHARE:/MNT/MYSHARE
		environment:
			CONF: “is_coordinator”
			EXECTUORS : "dremio_executor_1,dremio_executor_2"
		ports:
			- “9047:9047”
			- “31010:31010”
			- “32010:32010”
			- “45678:45678”
		links:
			- mssql
	dremio_executor_1:
		container_name: dremio
		image: dremio/dremio-oss
		volumes:
			- C:\\MYSHARE:/MNT/MYSHARE
		environment:
			CONF: “is_executor"
			ID "1"
		ports:
			- “9047:9047”
			- “31010:31010”
			- “32010:32010”
			- “45678:45678”
		links:
			- dremio_coordinator
	dremio_executor_2:
		container_name: dremio
		image: dremio/dremio-oss
		volumes:
			- C:\\MYSHARE:/MNT/MYSHARE
		environment:
			CONF: “is_executor"
			ID: "2"
		ports:
			- “9047:9047”
			- “31010:31010”
			- “32010:32010”
			- “45678:45678”
		links:
			- dremio_coordinator


Dremio: 将 Minio 配置为分布式存储

https://glory.blog.csdn.net/article/details/120747823


Dremio的基本使用

了解 Dremio

Dremio:使用你的第一个数据集

使用 Tableau 可视化你的第一个数据集

参考链接:

Docker-compose example

https://github.com/dremio/dremio-cloud-tools/tree/master/charts/dremio_v2

https://github.com/dremio/dremio-cloud-tools

https://github.com/big-data-europe/docker-spark

https://www.dremio.com/tutorials/getting-oriented-to-dremio/

Dremio架构分析

Dremio案例_本地Json文件数据分析


Superset


安装


1. Clone Superset 的 Github 仓库

使用以下命令在终端中克隆 Superset 的 repo

$ git clone https://github.com/apache/superset.git

一旦该命令成功完成,你应该会superset在当前目录中看到一个新文件夹。



2.通过Docker Compose启动Superset

导航到你在步骤 1 中创建的文件夹:

$ cd superset

然后,运行以下命令:

$ docker-compose -f docker-compose-non-dev.yml up

**注意:**这将在非开发模式下启动Superset,不会反映对代码库的更改。如果你想在开发模式下运行 superset 来测试本地更改,只需将之前的命令替换为:docker-compose up,然后等待superset_node容器完成资产构建。


配置 Docker Compose

你可以分别使用docker/.env和为开发和非开发模式配置 Docker Compose 设置docker/.env-non-dev。这些环境文件为 Docker Compose 设置中的大多数容器设置环境,一些变量影响多个容器,而其他变量只影响单个容器。

一个重要的变量是SUPERSET_LOAD_EXAMPLES决定superset_init容器是否将示例数据和可视化加载到数据库和 Superset 中。这些示例对大多数人很有帮助,但对于有经验的用户来说可能没有必要。加载过程有时可能需要几分钟和大量 CPU,因此你可能希望在资源受限的设备上禁用它。

**注意:**用户通常希望从 Superset 连接到其他数据库。目前,最简单的方法是修改docker-compose-non-dev.yml文件并将你的数据库添加为其他服务所依赖的服务(通过x-superset-depends-on)。其他人尝试network_mode: host在 Superset 服务上进行设置,但这些通常会破坏安装,因为配置需要使用 Docker Compose DNS 解析器来获取服务名称。如果你对此有好的解决方案,请告诉我们!


4. 登录Superset

你的本地 Superset 实例还包括一个 Postgres 服务器来存储你的数据,并且已经预加载了一些 Superset 附带的示例数据集。你现在可以通过 Web 浏览器访问 Superset 访问http://localhost:8088

使用默认用户名和密码登录:

username: admin
password: admin


在Superset中添加Dremio 驱动程序

Superset 需要为要连接的每种其他类型的数据库安装 Python 数据库驱动程序。通过 本地设置 Superset 时docker-compose, 将自动安装requirements.txt和 requirements-dev.txt 中包含的驱动程序和包 。

在本节中,我们将介绍如何安装 mysql 连接器库。所有附加库的连接器库安装过程都是相同的,我们将在本节结束时为每个数据库推荐连接器库。


1. 确定你需要的驱动程序

弄清楚如何安装你选择的数据库驱动程序

在示例中,我们将逐步介绍在 Superset 中安装 dremio驱动程序的过程。


2.安装Dremio驱动

由于我们目前通过 运行在 Docker 容器内docker compose,因此我们不能简单地pip install mysqlclient在本地 shell 上运行 并期望将驱动程序安装在 Docker 容器中以进行Superset。

为了解决这个问题,Supersetdocker compose设置附带了一种机制,供你在本地安装包,Git 将忽略本地开发的目的。请按照以下步骤操作:

创建 requirements-local.txt

# From the repo root...
touch ./docker/requirements-local.txt

添加在上述步骤中选择的驱动程序:

echo "sqlalchemy_dremio" >> ./docker/requirements-local.txt

使用内置的新驱动程序重建本地映像:

docker-compose build --force-rm

Docker 镜像的重建完成后(这需要几分钟),你可以使用以下命令重新启动:

docker-compose up

另一种选择是通过 Docker Compose 启动 Superset 使用 中的配方docker-compose-non-dev.yml,这将使用预先构建的前端资产并跳过前端资产的构建:

docker-compose -f docker-compose-non-dev.yml up


3.连接到Dremio

现在你已经在本地安装了 Dremio驱动程序,你应该可以对其进行测试。

我们现在可以在 Superset 中创建一个可用于连接到 Dremio实例的数据源。假设你的 MySQL 实例在本地运行并且可以通过 localhost 访问,请在“SQL Alchemy URI”中使用以下连接字符串,通过转到 Superset 中的 Sources > Databases > + 图标(添加新数据源)。

对于Dremio推荐的连接器库是 sqlalchemy_dremio

ODBC 的预期连接字符串(默认端口为 31010)格式如下:

dremio://{username}:{password}@{host}:{port}/{database_name}/dremio?SSL=1

Arrow Flight (Dremio 4.9.1+. 默认端口为 32010) 的预期连接字符串格式如下:

dremio+flight://{username}:{password}@{host}:{port}/dremio

单击“测试连接”,它应该会给你一个“OK”消息。如果没有,请查看你的终端以获取错误消息,并寻求帮助。

你可以为你希望Superset能够连接到的每个数据库重复此过程。

Dremio 的这篇博文提供了一些关于将 Superset 连接到 Dremio 的额外有用说明。


参考链接:

使用 Docker Compose 在本地安装 Superset

Dremio连接器

https://www.dremio.com/tutorials/dremio-apache-superset/

https://pypi.org/project/sqlalchemy-dremio/

在 Docker 中添加新的数据库驱动程序

使用 Apache Superset 对数据湖进行数据分析


Metabase


安装


添加外部依赖项或插件

要添加外部依赖 JAR 文件,例如 Oracle 或 Vertica JDBC 驱动程序或第 3 方 Metabase 驱动程序,你需要在主机系统中创建一个目录plugins并将其绑定,以便/plugins使用--mount-v/将其作为路径供 Metabase使用--volume

例如,如果你在主机系统上命名了一个目录/path/to/plugins,则可以使用以下--mount选项将其内容提供给 Metabase :

  docker run -d -p 3000:3000 \\
  --mount type=bind,source=/usr/local/jt/deploy-datalake/datalake/metabase/plugins,destination=/plugins \\
  --name metabase metabase/metabase

请注意,Metabase 将使用此目录提取与默认 Metabase 发行版捆绑在一起的插件(例如 SQLite 等各种数据库的驱动程序),因此它必须是 Docker 可读和可写的。插件要具备可执行权限。


完整部署文件

Docker Compose文件

# 配置信息
#################### MinIO #####################
x-minio-image: &minio-image minio/minio:RELEASE.2021-07-30T00-02-00Z
x-minio-data-dir: &minio-data-dir
  # 映射文件路径
  - /mydata/minio/data:/data

#################### Metabase #####################
x-metabase-data-dir: &metabase-data-dir
  # 映射文件路径
  - /dev/urandom:/dev/random:ro
  - /usr/local/jt/deploy-datalake/datalake/metabase/plugins:/plugins

#用于部署运行所依赖的基础环境组件
version: '3.9'
services:
  # 1.MinIO服务器
  minio:
    image: *minio-image
    container_name: minio
    ports:
      - "9000:9000"
      - "9009:9009"
    restart: always
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
    command: server /data --console-address ":9009"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123 #大于等于8位
    logging:
      options:
        max-size: "2048M" # 最大文件上传限制
        max-file: "10"
      driver: json-file
    volumes: *minio-data-dir
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
  # 2.spark3(包含Deleta Lake)
  # 2.1 spark-master
  spark-master:
    image: datamechanics/spark:jvm-only-3.1-latest
    hostname: spark-master
    container_name: spark-master
    network_mode: host
    command: /opt/spark/sbin/start-master.sh
    environment:
      - "SPARK_MASTER_HOST=spark"
      - "SPARK_NO_DAEMONIZE=true"
    # ports:
    #   - "8080:8080"
    #   - "7077:7077"
  # 2.2 spark-worker
  spark-worker :
    image: datamechanics/spark:jvm-only-3.1-latest
    hostname: spark-worker
    container_name: spark-worker
    command: /opt/spark/sbin/start-worker.sh spark://10.0.0.198:7077
    environment:
      - "SPARK_NO_DAEMONIZE=true"
    ports:
      - "8888:8080"
      - "7777:7077"
 # 3. dremio
  dremio:
    image: dremio/dremio-oss:15.0.0
    container_name: dremio
    command: -H unix:///var/run/docker.sock
    restart: always
#    deploy:
#      resources:
#        limits:
#          cpus: '1.0'
#          memory: 2048M
#        reservations:
#          cpus: '0.5'
#          memory: 1024M
    ports:
      - "9047:9047"
      - "31010:31010"
      - "45678:45678"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock #数据文件挂载
      - /etc/localtime:/etc/localtime:ro
      - dremio-data:/opt/dremio/data
      - dremio-data:/var/lib/dremio

  # 4. metabase
  metabase:
    image: metabase/metabase:v0.39.5
    container_name: metabase
    hostname: metabase
    volumes: *metabase-data-dir
    ports:
      - 3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabase
      MB_DB_PORT: 5432
      MB_DB_USER: metabase
      MB_DB_PASS: metabase123
      MB_DB_HOST: postgres-secrets
    depends_on:
      - postgres-secrets
  # 4. metabase依赖的数据库
  postgres-secrets:
    image: postgres:latest
    container_name: postgres-secrets
    hostname: postgres-secrets
    environment:
      POSTGRES_USER: metabase
      POSTGRES_DB: metabase
      POSTGRES_PASSWORD: metabase123


# 持久存储
volumes:
  dremio-data:


注意

  1. 新建文件夹/mydata/minio/data
  2. 新建文件夹/usr/local/jt/deploy-datalake/datalake/metabase/plugins, 并存放dremio.metabase-driver.jar插件, 赋予可读可写可执行权限
  3. spark整理使用了host模式, 修改启动命令中command: /opt/spark/sbin/start-worker.sh spark://10.0.0.198:7077的主机地址


Metabase基本使用

Metabase入门

x-rays帮助快速洞察数据

参考链接:

https://github.com/Baoqi/metabase-dremio-driver

让开源BI Metabase 踏上 Dremio 的风火轮

https://www.metabase.com/docs/latest/operations-guide/running-metabase-on-docker.html

https://registry.hub.docker.com/r/metabase/metabase

在 Docker 上运行 Metabase

https://www.metabase.com/docs/latest/developers-guide-drivers.html

https://github.com/metabase/metabase/wiki/Writing-a-Driver

https://github.com/metabase/metabase/pull/9087?w=1

https://community.dremio.com/t/fyi-just-build-a-dremio-connector-for-metabase-open-source-bi/7487

metabase 的开源插件

以上是关于基于MinIO/Deleta Lake/Dremio和Superset或Metabase搭建简单的数据湖的主要内容,如果未能解决你的问题,请参考以下文章

Nginx虚拟主机 (基于域名 基于端口 基于ip)

栈(基于数组&基于链表)与队列(基于数组&基于链表)

基于内容与基于协作的过滤?

为啥 Kafka 是基于拉的而不是基于推的?

推荐算法简介:基于用户的协同过滤基于物品的协同过滤基于内容的推荐

依存句法分析:基于图的依存句法分析基于转移的依存句法分析基于神经网络的依存句法分析