软件工程

这个拥有59000颗星的开源仪表板解决方案——Apache Superset,让我惊叹不已。

本文主要是介绍这个拥有59000颗星的开源仪表板解决方案——Apache Superset,让我惊叹不已。,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

我在网上搜索了最好用的免费且易于使用的仪表板解决方案,找到了Apache Superset。这里有一个在Kubernetes上安装的教程。

如你所知,我为不同的公司担任软件架构师。其中一个客户正在使用Power BI来创建一些BI图表,并与公司内部的人员分享。

由于 Power BI 的复杂性和“共享”系统的某个问题,他让我寻找一个新的、几乎免费的仪表板解决方案,并将所有数据源连接到该解决方案上。

该解决方案应具备将仪表板分享给一组用户,并将其嵌入到现有产品中的功能,而无需处理所有用户管理。

我在搜索软件时偶然发现了 Superset,它在 GitHub 上有超过 59k 的星标

客户给了我以下要求:

  • 开源软件
  • 为自定义服务添加新的自定义连接器
  • 支持连接查询的 SQL
  • 为不同用户组共享和嵌入仪表板
  • 为不同的使用场景参数化仪表板
  • 多种不同的图表类型列表

考虑到所有的这些需求,在我的搜索过程中遇到了 Superset,想试一试。

GitHub - apache/superset: Apache Superset 是一个数据可视化和数据探索平台Apache Superset 是一个数据可视化和数据探索平台 - apache/supersetgithub.com

Superset 的插件系统和不同的数据连接器使其非常易于扩展。

在测试 Apache Superset 时,我发现查询一些数据非常容易,使用起来也非常直观。

你可以轻松创建复杂的仪表板。

可用的图表种类令人惊叹且非常灵活。

(版权来自 Superset 文档)

使用无代码界面,你可以轻松地从你创建的数据集中生成复杂的图表。

(版权来自 Superset 文档)

查询构建器非常强大

使用 Querybuilder 可以创建很多复杂的数据集,这些数据集之后可以用来生成图表。

版权所有来自Superset文档

很多大公司都使用 Superset 来满足他们的需求

GitHub 仓库还列出了使用 Superset 的公司。以下是一些例子:

这里是你关于“如何在Kubernetes中安装Superset”的教程。

为了安装 Superset,你只需要运行以下两个命令。第二个命令依赖于一个“superset.yaml”文件,这是你部署的主要配置文件。

    helm repo add superset https://apache.github.io/superset  
    helm upgrade --install --values superset.yaml superset superset/superset
您可以使用以下“superset.yaml”文件并将其保存到您硬盘上的一个文件中。

请注意,您需要更改一些行,这些行将在代码块之后解释。


# superset 的默认值。
# 这是一个 YAML 格式的文件。
# 用于传递给模板的变量。
# 使用 helm-docs 自动生成一个 README(参见 https://github.com/norwoodj/helm-docs)
# 若要更新它,请安装 helm-docs 并从此图表的根目录运行 helm-docs
# -- 提供一个名称以覆盖图表的名称
nameOverride: ~  
# -- 提供一个名称以覆盖资源的完整名称
fullnameOverride: ~  
# -- 用户 ID 指令。此用户必须有足够的权限来运行引导脚本
# 在生产环境中,不建议以 root 用户运行容器。将其更改为另一个 UID - 例如 1000 以提高安全性
runAsUser: 0  
# -- 指定要使用的服务帐户名称
serviceAccountName: ~  
serviceAccount:  
  # -- 为 Superset 创建自定义服务帐户。如果 create 为 true 并且未提供 serviceAccountName,则将使用 `superset.fullname`
  create: false  
  annotations: {}  
# -- 在此脚本中安装额外的包并进行其他引导配置
# 对于生产集群,建议在 CI 中构建自己的镜像以完成此步骤
# @default -- 请参阅 `values.yaml`
bootstrapScript: |  
  #!/bin/bash  
  pip3 install chipmunkdb-python-client  
  if [ ! -f ~/bootstrap ]; then echo "正在使用 uid {{ .Values.runAsUser }} 运行 Superset" > ~/bootstrap; fi  
# -- 用于生成 superset_config.py 文件的密钥名称
# 注意:此密钥必须包含 superset_config.py,并可以包含其他文件
configFromSecret: '{{ template "superset.fullname" . }}-config'  
# -- 用于填充部署 pod 中环境变量的密钥名称
# 这对于密钥等很有用
envFromSecret: '{{ template "superset.fullname" . }}-env'  
# -- 这可以是一个模板字符串列表
envFromSecrets: []  
# -- 传递给 pod 的额外环境变量
extraEnv: {}  
  # 不同的 gunicorn 设置,参见 gunicorn 文档
  # https://docs.gunicorn.org/en/stable/settings.html#
  # 这些变量在 gunicorn 启动时用作标志
  # https://github.com/apache/superset/blob/master/docker/run-server.sh#L22  
  # 延长超时时间以允许长时间运行的查询。
  # GUNICORN_TIMEOUT: 300  
  # 增加 gunicorn 工作进程数量,可以显著提高性能
  # 参见:https://docs.gunicorn.org/en/stable/design.html#how-many-workers  
  # SERVER_WORKER_AMOUNT: 4  
  # WORKER_MAX_REQUESTS: 0  
  # WORKER_MAX_REQUESTS_JITTER: 0  
  # SERVER_THREADS_AMOUNT: 20  
  # GUNICORN_KEEPALIVE: 2  
  # SERVER_LIMIT_REQUEST_LINE: 0  
  # SERVER_LIMIT_REQUEST_FIELD_SIZE: 0  
  # OAUTH_HOME_DOMAIN: ..  
  # # 如果未设置白名单,则可以使用您的 OAuth2 端点的任何地址都可以登录。
  # # 这包括任何随机的 Gmail 地址,如果您的 OAuth2 Web App 设置为外部。
  # OAUTH_WHITELIST_REGEX: ...  
# -- 以原始格式传递给 pod 的额外环境变量
extraEnvRaw: []  
  # 从其他密钥加载数据库密码(例如用于 zalando 操作器)
  # - name: DB_PASS  
  #   valueFrom:  
  #     secretKeyRef:  
  #       name: superset.superset-postgres.credentials.postgresql.acid.zalan.do  
  #       key: password  
# -- 以密钥形式传递的额外环境变量
extraSecretEnv: {}  
  # MAPBOX_API_KEY: ...  
  # # Google API Keys: https://console.cloud.google.com/apis/credentials  
  # GOOGLE_KEY: ...  
  # GOOGLE_SECRET: ...  
  #   # 生成自己的加密密钥。使用 openssl rand -base64 42 生成一个良好的密钥
  # SUPERSET_SECRET_KEY: 'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'  
# -- 要在 `/app/pythonpath` 上挂载的额外文件
extraConfigs: {}  
  # import_datasources.yaml: |  
  #     databases:  
  #     - allow_file_upload: true  
  #       allow_ctas: true  
  #       allow_cvas: true  
  #       database_name: example-db  
  #       extra: "{\r\n    \"metadata_params\": {},\r\n    \"engine_params\": {},\r\n    \"\  
  #         metadata_cache_timeout\": {},\r\n    \"schemas_allowed_for_file_upload\": []\r\n\  
  #         }"  
  #       sqlalchemy_uri: example://example-db.local  
  #       tables: []  
# -- 要作为密钥在 `/app/pythonpath` 上挂载的额外文件
extraSecrets: {}  
extraVolumes: []  
  # - name: customConfig  
  #   configMap:  
  #     name: '{{ template "superset.fullname" . }}-custom-config'  
  # - name: additionalSecret  
  #   secret:  
  #     secretName: my-secret  
  #     defaultMode: 0600  
extraVolumeMounts: []  
  # - name: customConfig  
  #   mountPath: /mnt/config  
  #   readOnly: true  
  # - name: additionalSecret:  
  #   mountPath: /mnt/secret  
# -- 一个字典,用于在 superset_config.py 的末尾追加覆盖 - 名称无关紧要
# 警告:顺序无法保证
# 文件可以通过 helm --set-file configOverrides.my-override=my-file.py 传递
configOverrides:   
  secret: |  
    SECRET_KEY = 'YOUR_SECRET'  
  # extend_timeout: |  
  #    # Extend timeout to allow long running queries.  
  #    SUPERSET_WEBSERVER_TIMEOUT = ...  
  # enable_oauth: |  
  #   from flask_appbuilder.security.manager import (AUTH_DB, AUTH_OAUTH)  
  #   AUTH_TYPE = AUTH_OAUTH  
  #   OAUTH_PROVIDERS = [  
  #       {  
  #           "name": "google",  
  #           "whitelist": [ os.getenv("OAUTH_WHITELIST_REGEX", "") ],  
  #           "icon": "fa-google",  
  #           "token_key": "access_token",  
  #           "remote_app": {  
  #               "client_id": os.environ.get("GOOGLE_KEY"),  
  #               "client_secret": os.environ.get("GOOGLE_SECRET"),  
  #               "api_base_url": "https://www.googleapis.com/oauth2/v2/",  
  #               "client_kwargs": {"scope": "email profile"},  
  #               "request_token_url": None,  
  #               "access_token_url": "https://accounts.google.com/o/oauth2/token",  
  #               "authorize_url": "https://accounts.google.com/o/oauth2/auth",  
  #               "authorize_params": {"hd": os.getenv("OAUTH_HOME_DOMAIN", "")}  
  #           }  
  #       }  
  #   ]  
  #   # Map Authlib roles to superset roles  
  #   AUTH_ROLE_ADMIN = 'Admin'  
  #   AUTH_ROLE_PUBLIC = 'Public'  
  #   # Will allow user self registration, allowing to create Flask users from Authorized User  
  #   AUTH_USER_REGISTRATION = True  
  #   # The default user self registration role  
  #   AUTH_USER_REGISTRATION_ROLE = "Admin"  
  # secret: |  
  #   # Generate your own secret key for encryption. Use `openssl rand -base64 42` to generate a good key  
  #   SECRET_KEY = 'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'  
# -- 与上述相同,但值是文件
configOverridesFiles: {}  
  # extend_timeout: extend_timeout.py  
  # enable_oauth: enable_oauth.py  
configMountPath: "/app/pythonpath"  
extraConfigMountPath: "/app/configs"  
image:  
  repository: apachesuperset.docker.scarf.sh/apache/superset  
  tag: ~  
  pullPolicy: IfNotPresent  
imagePullSecrets: []  
initImage:  
  repository: apache/superset  
  tag: dockerize  
  pullPolicy: IfNotPresent  
service:  
  type: ClusterIP  
  port: 8088  
  annotations: {}  
    # cloud.google.com/load-balancer-type: "Internal"  
  loadBalancerIP: ~  
  nodePort:  
    # -- (int)  
    http: nil  
ingress:  
  enabled: false  
  ingressClassName: ~  
  annotations: {}  
    # kubernetes.io/tls-acme: "true"  
    ## Extend timeout to allow long running queries.  
    # nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"  
    # nginx.ingress.kubernetes.io/proxy-read-timeout: "300"  
    # nginx.ingress.kubernetes.io/proxy-send-timeout: "300"  
  path: /  
  pathType: ImplementationSpecific  
  hosts:  
    - chart-example.local  
  tls: []  
  extraHostsRaw: []  
  # - secretName: chart-example-tls  
  #    hosts:  
  #      - chart-example.local  
resources: {}  
  # 我们通常建议不要指定默认资源,并让用户自己选择。这也有助于图表在资源较少的环境中运行,例如 Minikube。如果您确实要指定资源,取消注释以下行,根据需要进行调整,并删除 'resources:' 后的花括号。  
  # 下面的限制将应用于所有 Superset 组件。要设置单独的资源限制,请参考下面的 pod 特定值。  
  # pod 特定值将覆盖这里设置的任何内容。  
  # limits:  
  #   cpu: 100m  
  #   memory: 128Mi  
  # requests:  
  #   cpu: 100m  
  #   memory: 128Mi  
# -- 自定义主机别名,用于所有 superset pod  
## https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/  
hostAliases: []  
# - hostnames:  
#   - nodns.my.lan  
#   ip: 18.27.36.45  
# Superset 节点配置  
supersetNode:  
  replicaCount: 1  
  autoscaling:  
    enabled: false  
    minReplicas: 1  
    maxReplicas: 100  
    targetCPUUtilizationPercentage: 80  
    # targetMemoryUtilizationPercentage: 80  
  # -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetNode pod 使用  
  podDisruptionBudget:  
    # -- 是否创建 pod 破坏预算  
    enabled: false  
    # -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget  
    minAvailable: 1  
    # -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget  
    maxUnavailable: 1  
  # -- 启动命令  
  # @default -- 请参阅 `values.yaml`  
  command:  
    - "/bin/sh"  
    - "-c"  
    - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; /usr/bin/run-server.sh"  
  connections:  
    # -- 如果使用自己的 redis,请更改此配置并设置 redis.enabled: false  
    redis_host: '{{ .Release.Name }}-redis-headless'  
    redis_port: "6379"  
    redis_user: ""  
    # redis_password: superset  
    redis_cache_db: "1"  
    redis_celery_db: "0"  
    # 或 SSL 端口通常是 6380  
    # 更新以下配置以使用 Redis SSL  
    redis_ssl:  
      enabled: false  
      ssl_cert_reqs: CERT_NONE  
    # 如果带自己的 PostgreSQL 实例,请更改以下配置并设置 postgresql.enabled: false  
    db_host: '{{ .Release.Name }}-postgresql'  
    db_port: "5432"  
    db_user: superset  
    db_pass: superset  
    db_name: superset  
  env: {}  
  # -- 如果为 true,则在每次升级时强制部署重新加载  
  forceReload: false  
  # -- 初始化容器  
  # @default -- 一个等待 postgres 的容器  
  initContainers:  
    - name: wait-for-postgres  
      image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"  
      imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"  
      envFrom:  
        - secretRef:  
            name: "{{ tpl .Values.envFromSecret . }}"  
      command:  
        - /bin/sh  
        - -c  
        - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s  
  # -- 将其他容器启动到 supersetNode pod 中  
  extraContainers: []  
  # -- 要添加到 supersetNode 部署的注释  
  deploymentAnnotations: {}  
  # -- 要添加到 supersetNode 部署的标签  
  deploymentLabels: {}  
  # -- 要添加到 supersetNode 部署的亲和性  
  affinity: {}  
  # -- 要添加到 supersetNode 部署的拓扑传播约束  
  topologySpreadConstraints: []  
  # -- 要添加到 supersetNode pod 的注释  
  podAnnotations: {}  
  # -- 要添加到 supersetNode pod 的标签  
  podLabels: {}  
  startupProbe:  
    httpGet:  
      path: /health  
      port: http  
    initialDelaySeconds: 15  
    timeoutSeconds: 1  
    failureThreshold: 60  
    periodSeconds: 5  
    successThreshold: 1  
  livenessProbe:  
    httpGet:  
      path: /health  
      port: http  
    initialDelaySeconds: 15  
    timeoutSeconds: 1  
    failureThreshold: 3  
    periodSeconds: 15  
    successThreshold: 1  
  readinessProbe:  
    httpGet:  
      path: /health  
      port: http  
    initialDelaySeconds: 15  
    timeoutSeconds: 1  
    failureThreshold: 3  
    periodSeconds: 15  
    successThreshold: 1  
  # -- 为 supersetNode pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。  
  resources: {}  
    # limits:  
    # cpu: 100m  
    # memory: 128Mi  
    # requests:  
    # cpu: 100m  
    # memory: 128Mi  
  podSecurityContext: {}  
  containerSecurityContext: {}  
  strategy: {}  
    # type: RollingUpdate  
    # rollingUpdate:  
    #   maxSurge: 25%  
    #   maxUnavailable: 25%  
# Superset Celery 工作程序配置  
supersetWorker:  
  replicaCount: 1  
  autoscaling:  
    enabled: false  
    minReplicas: 1  
    maxReplicas: 100  
    targetCPUUtilizationPercentage: 80  
    # targetMemoryUtilizationPercentage: 80  
  # -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetWorker pod 使用  
  podDisruptionBudget:  
    # -- 是否创建 pod 破坏预算  
    enabled: false  
    # -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget  
    minAvailable: 1  
    # -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget  
    maxUnavailable: 1  
  # -- 工作程序启动命令  
  # @default -- 一个 `celery worker` 命令  
  command:  
    - "/bin/sh"  
    - "-c"  
    - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker"  
  # -- 如果为 true,则在每次升级时强制部署重新加载  
  forceReload: false  
  # -- 初始化容器  
  # @default -- 一个等待 postgres 和 redis 的容器  
  initContainers:  
    - name: wait-for-postgres-redis  
      image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"  
      imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"  
      envFrom:  
        - secretRef:  
            name: "{{ tpl .Values.envFromSecret . }}"  
      command:  
        - /bin/sh  
        - -c  
        - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s  
  # -- 将其他容器启动到 supersetWorker pod 中  
  extraContainers: []  
  # -- 要添加到 supersetWorker 部署的注释  
  deploymentAnnotations: {}  
  # -- 要添加到 supersetWorker 部署的标签  
  deploymentLabels: {}  
  # -- 要添加到 supersetWorker 部署的亲和性  
  affinity: {}  
  # -- 要添加到 supersetWorker 部署的拓扑传播约束  
  topologySpreadConstraints: []  
  # -- 要添加到 supersetWorker pod 的注释  
  podAnnotations: {}  
  # -- 要添加到 supersetWorker pod 的标签  
  podLabels: {}  
  # -- 为 supersetWorker pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。  
  resources: {}  
    # limits:  
    # cpu: 100m  
    # memory: 128Mi  
    # requests:  
    # cpu: 100m  
    # memory: 128Mi  
  podSecurityContext: {}  
  containerSecurityContext: {}  
  strategy: {}  
    # type: RollingUpdate  
    # rollingUpdate:  
    #   maxSurge: 25%  
    #   maxUnavailable: 25%  
  livenessProbe:  
    exec:  
      # -- 活动探测命令  
      # @default -- 一个 `celery inspect ping` 命令  
      command:  
        - sh  
        - -c  
        - celery -A superset.tasks.celery_app:app inspect ping -d celery@$HOSTNAME  
    initialDelaySeconds: 120  
    timeoutSeconds: 60  
    failureThreshold: 3  
    periodSeconds: 60  
    successThreshold: 1  
  # -- 默认情况下没有启动/就绪探测器,因为我们并不真正关心它的启动时间(它不提供流量)
  startupProbe: {}  
  # -- 默认情况下没有启动/就绪探测器,因为我们并不真正关心它的启动时间(它不提供流量)
  readinessProbe: {}  
# Superset beat 配置(用于触发如报告等计划任务)
supersetCeleryBeat:  
  # -- 如果您打算使用警报和报告,则需要启用此配置
  enabled: false  
  # -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetCeleryBeat pod 使用
  podDisruptionBudget:  
    # -- 是否创建 pod 破坏预算
    enabled: false  
    # -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
    minAvailable: 1  
    # -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
    maxUnavailable: 1  
  # -- 命令
  # @default -- 一个 `celery beat` 命令
  command:  
    - "/bin/sh"  
    - "-c"  
    - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule"  
  # -- 如果为 true,则在每次升级时强制部署重新加载
  forceReload: false  
  # -- 列出初始化容器
  # @default -- 一个等待 postgres 的容器
  initContainers:  
    - name: wait-for-postgres-redis  
      image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"  
      imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"  
      envFrom:  
        - secretRef:  
            name: "{{ tpl .Values.envFromSecret . }}"  
      command:  
        - /bin/sh  
        - -c  
        - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s  
  # -- 将其他容器启动到 supersetCeleryBeat pod 中
  extraContainers: []  
  # -- 要添加到 supersetCeleryBeat 部署的注释
  deploymentAnnotations: {}  
  # -- 要添加到 supersetCeleryBeat 部署的亲和性
  affinity: {}  
  # -- 要添加到 supersetCeleryBeat 部署的拓扑传播约束
  topologySpreadConstraints: []  
  # -- 要添加到 supersetCeleryBeat pod 的注释
  podAnnotations: {}  
  # -- 要添加到 supersetCeleryBeat pod 的标签
  podLabels: {}  
  # -- 为 CeleryBeat pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。
  resources: {}  
    # limits:  
    # cpu: 100m  
    # memory: 128Mi  
    # requests:  
    # cpu: 100m  
    # memory: 128Mi  
  podSecurityContext: {}  
  containerSecurityContext: {}  
supersetCeleryFlower:  
  # -- 启用 Celery flower 部署(用于监控 celery 任务的管理 UI)
  # 警告:在 superset 1.x 中,这需要一个安装了 `flower<1.0.0` 的 Superset 镜像(默认镜像中没有安装)
  # flower>=1.0.0 需要 Celery 5+,而 Superset 1.5 不支持
  enabled: false  
  replicaCount: 1  
  # -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetCeleryFlower pod 使用
  podDisruptionBudget:  
    # -- 是否创建 pod 破坏预算
    enabled: false  
    # -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
    minAvailable: 1  
    # -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
    maxUnavailable: 1  
  # -- 命令
  # @default -- 一个 `celery flower` 命令
  command:  
    - "/bin/sh"  
    - "-c"  
    - "celery --app=superset.tasks.celery_app:app flower"  
  service:  
    type: ClusterIP  
    annotations: {}  
    loadBalancerIP: ~  
    port: 5555  
    nodePort:  
      # -- (int)  
      http: nil  
  startupProbe:  
    httpGet:  
      path: /api/workers  
      port: flower  
    initialDelaySeconds: 5  
    timeoutSeconds: 1  
    failureThreshold: 60  
    periodSeconds: 5  
    successThreshold: 1  
  livenessProbe:  
    httpGet:  
      path: /api/workers  
      port: flower  
    initialDelaySeconds: 5  
    timeoutSeconds: 1  
    failureThreshold: 3  
    periodSeconds: 5  
    successThreshold: 1  
  readinessProbe:  
    httpGet:  
      path: /api/workers  
      port: flower  
    initialDelaySeconds: 5  
    timeoutSeconds: 1  
    failureThreshold: 3  
    periodSeconds: 5  
    successThreshold: 1  
  # -- 列出初始化容器
  # @default -- 一个等待 postgres 和 redis 的容器
  initContainers:  
    - name: wait-for-postgres-redis  
      image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"  
      imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"  
      envFrom:  
        - secretRef:  
            name: "{{ tpl .Values.envFromSecret . }}"  
      command:  
        - /bin/sh  
        - -c  
        - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s  
  # -- 将其他容器启动到 supersetCeleryFlower pod 中
  extraContainers: []  
  # -- 要添加到 supersetCeleryFlower 部署的注释
  deploymentAnnotations: {}  
  # -- 要添加到 supersetCeleryFlower 部署的亲和性
  affinity: {}  
  # -- 要添加到 supersetCeleryFlower 部署的拓扑传播约束
  topologySpreadConstraints: []  
  # -- 要添加到 supersetCeleryFlower pod 的注释
  podAnnotations: {}  
  # -- 要添加到 supersetCeleryFlower pod 的标签
  podLabels: {}  
  # -- 为 CeleryBeat pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。
  resources: {}  
    # limits:  
    # cpu: 100m  
    # memory: 128Mi  
    # requests:  
    # cpu: 100m  
    # memory: 128Mi  
  podSecurityContext: {}  
  containerSecurityContext: {}  
supersetWebsockets:  
  # -- 如果您打算使用 `GLOBAL_ASYNC_QUERIES` 在 `ws` 模式下,则需要启用此配置
  # 参见 https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries
  enabled: false  
  replicaCount: 1  
  # -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetWebsockets pod 使用
  podDisruptionBudget:  
    # -- 是否创建 pod 破坏预算
    enabled: false  
    # -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
    minAvailable: 1  
    # -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
    maxUnavailable: 1  
  ingress:  
    path: /ws  
    pathType: Prefix  
  image:  
    # -- 目前没有官方镜像(尚未提供),此镜像是社区支持的
    repository: oneacrefund/superset-websocket  
    tag: latest  
    pullPolicy: IfNotPresent  
  # -- 传递给服务器的 config.json,参见 https://github.com/apache/superset/tree/master/superset-websocket
  # 注意,配置也可以从环境变量读取(环境变量优先),参见 https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts 支持的变量列表
  # @default -- 请参阅 `values.yaml`
  config:  
    {  
      "port": 8080,  
      "logLevel": "debug",  
      "logToFile": false,  
      "logFilename": "app.log",  
      "statsd": { "host": "127.0.0.1", "port": 8125, "globalTags": [] },  
      "redis":  
        {  
          "port": 6379,  
          "host": "127.0.0.1",  
          "password": "",  
          "db": 0,  
          "ssl": false,  
        },  
      "redisStreamPrefix": "async-events-",  
      "jwtSecret": "CHANGE-ME",  
      "jwtCookieName": "async-token",  
    }  
  service:  
    type: ClusterIP  
    annotations: {}  
    loadBalancerIP: ~  
    port: 8080  
    nodePort:  
      # -- (int)  
      http: nil  
  command: []  
  resources: {}  
  # -- 将其他容器启动到 supersetWebsockets pod 中
  extraContainers: []  
  deploymentAnnotations: {}  
  # -- 要添加到 supersetWebsockets 部署的亲和性
  affinity: {}  
  # -- 要添加到 supersetWebsockets 部署的拓扑传播约束
  topologySpreadConstraints: []  
  podAnnotations: {}  
  podLabels: {}  
  strategy: {}  
  podSecurityContext: {}  
  containerSecurityContext: {}  
  startupProbe:  
    httpGet:  
      path: /health  
      port: ws  
    initialDelaySeconds: 5  
    timeoutSeconds: 1  
    failureThreshold: 60  
    periodSeconds: 5  
    successThreshold: 1  
  livenessProbe:  
    httpGet:  
      path: /health  
      port: ws  
    initialDelaySeconds: 5  
    timeoutSeconds: 1  
    failureThreshold: 3  
    periodSeconds: 5  
    successThreshold: 1  
  readinessProbe:  
    httpGet:  
      path: /health  
      port: ws  
    initialDelaySeconds: 5  
    timeoutSeconds: 1  
    failureThreshold: 3  
    periodSeconds: 5  
    successThreshold: 1  
init:  
  # 配置资源
  # 警告:fab 命令消耗大量内存,可能会
  # 导致进程因 OOM 而被杀死。请确保您为管理员用户创建提供了强密码(或者在设置后更改密码)
  # 同时请更改管理员邮箱为您的自定义邮箱。
  resources: {}  
    # limits:  
    #   cpu:  
    #   memory:  
    # requests:  
    #   cpu:  
    #   memory:  
  # -- 命令
  # @default -- 一个 `superset_init.sh` 命令
  command:  
    - "/bin/sh"  
    - "-c"  
    - ". {{ .Values.configMountPath }}/superset_bootstrap.sh; . {{ .Values.configMountPath }}/superset_init.sh"  
  enabled: true  
  jobAnnotations:  
    "helm.sh/hook": post-install,post-upgrade  
    "helm.sh/hook-delete-policy": "before-hook-creation"  
  loadExamples: false  
  createAdmin: true  
  adminUser:  
    username: admin  
    firstname: Superset  
    lastname: Admin  
    email: admin@superset.com  
    password: admin  
  # -- 列出初始化容器
  # @default -- 一个等待 postgres 的容器
  initContainers:  
    - name: wait-for-postgres  
      image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"  
      imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"  
      envFrom:  
        - secretRef:  
            name: "{{ tpl .Values.envFromSecret . }}"  
      command:  
        - /bin/sh  
        - -c  
        - dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s  
  # -- 一个 Superset 初始化脚本
  # @default -- 一个创建管理员用户和初始化角色的脚本
  initscript: |-  
    #!/bin/sh  
    set -eu  
    echo "升级数据库模式..."  
    superset db upgrade  
    echo "初始化角色..."  
    superset init  
    {{ if .Values.init.createAdmin }}  
    echo "创建管理员用户..."  
    superset fab create-admin \  
                    --username {{ .Values.init.adminUser.username }} \  
                    --firstname {{ .Values.init.adminUser.firstname }} \  
                    --lastname {{ .Values.init.adminUser.lastname }} \  
                    --email {{ .Values.init.adminUser.email }} \  
                    --password {{ .Values.init.adminUser.password }} \  
                    || true  
    {{- end }}  
    {{ if .Values.init.loadExamples }}  
    echo "加载示例..."  
    superset load_examples  
    {{- end }}  
    if [ -f "{{ .Values.extraConfigMountPath }}/import_datasources.yaml" ]; then  
      echo "导入数据库连接.... "  
      superset import_datasources -p {{ .Values.extraConfigMountPath }}/import_datasources.yaml  
    fi  
  # -- 将其他容器启动到初始化作业 pod 中
  extraContainers: []  
  ## 初始化作业 pod 上要添加的注释
  podAnnotations: {}  
  podSecurityContext: {}  
  containerSecurityContext: {}  
  ## 初始化作业 pod 上要添加的容忍度
  tolerations: []  
  ## 初始化作业 pod 上要添加的亲和性
  affinity: {}  
  # -- 要添加到初始化作业的拓扑传播约束
  topologySpreadConstraints: []  
# -- PostgreSQL 依赖项的配置值。
# 参见:https://github.com/bitnami/charts/tree/main/bitnami/postgresql
# @default -- 请参阅 `values.yaml`
postgresql:  
  ##  
  ## 使用 PostgreSQL 图表依赖项。
  ## 如果使用自己的 PostgreSQL,请设置为 false。
  enabled: true  
  ## 认证参数
  auth:  
    ## 包含 postgres 密码的现有密钥的名称。
    existingSecret:  
    ## 要创建的自定义用户的 PostgreSQL 名称。
    username: superset  
    ## 要创建的自定义用户的 PostgreSQL 密码。如果提供了 `auth.existingSecret` 和 `password` 则忽略此设置
    password: superset  
    ## 要创建的自定义数据库的 PostgreSQL 名称。
    database: superset  
  image:  
    tag: "14.6.0-debian-11-r13"  
  ## PostgreSQL 主参数
  primary:  
    ##  
    ## 持久卷存储配置。
    ## 参见:https://kubernetes.io/docs/user-guide/persistent-volumes
    persistence:  
      ##  
      ## 启用 PostgreSQL 持久化,使用持久卷声明。
      enabled: true  
      ##  
      ## 持久类
      # storageClass: classname  
      ##  
      ## 访问模式:
      accessModes:  
        - ReadWriteOnce  
    ## PostgreSQL 端口
    service:  
      ports:  
        postgresql: "5432"  
# -- Redis 依赖项的配置值。
# 参见:https://github.com/bitnami/charts/blob/master/bitnami/redis
# 更多文档可以在 https://artifacthub.io/packages/helm/bitnami/redis 查阅
# @default -- 请参阅 `values.yaml`
redis:  
  ##  
  ## 使用 redis 图表依赖项。
  ##  
  ## 如果您使用自己的 redis,请在 supersetNode.connections.redis_host 中设置主机
  ##  
  ## 如果使用自己的 redis,请设置为 false。
  enabled: true  
  ##  
  ## 设置架构为 standalone/replication
  architecture: standalone  
  ##  
  ## 认证配置:
  ##  
  auth:  
    ## 启用密码认证
    enabled: false  
    ## 包含 redis 密码的现有密钥的名称。
    existingSecret: ""  
    ## 密钥名称。
    existingSecretKey: ""  
    ## Redis 密码
    password: superset  
  ##  
  ## 主配置
  ##  
  master:  
    ##  
    ## 镜像配置
    # image:  
    ##  
    ## docker 注册表密钥名称(列表)
    # pullSecrets: nil  
    ##  
    ## 配置持久化
    persistence:  
      ##  
      ## 使用 PVC 持久化数据。
      enabled: false  
      ##  
      ## 持久类
      # storageClass: classname  
      ##  
      ## 访问模式:
      accessModes:  
        - ReadWriteOnce  
nodeSelector: {}  
tolerations: []  
affinity: {}  
# -- 要添加到所有部署的拓扑传播约束
topologySpreadConstraints: []
## 更新你的密钥

在“configOverrides”这一行中,你需要定义一个 **SECRET_KEY**。你可以使用以下命令来创建一个。

> openssl rand -base64 42

然后将输出复制并替换到 yaml 文件中,如下所示。
configOverrides:   
  secret: |  
    SECRET_KEY = 'YOUR_SECRET'  
# 通过运行:openssl rand -base64 42  
# 生成 YOUR_SECRET 并替换 YOUR_SECRET
## (可选)安装更多独立的数据库连接器

根据你拥有的数据源,你可能需要在 Superset 中安装更多的数据库连接器。在我的例子中,我需要 **chipmunkdb** 并将其添加到 yaml 文件的 **bootstrapScript** 部分。

这里是一个例子:
bootstrapScript: |  
  #!/bin/bash  
  pip3 install chipmunkdb-python-client  
  # 可以添加更多你需要的库作为数据库连接器  
  if [ ! -f ~/bootstrap ]; then echo "使用 uid {{ .Values.runAsUser }} 运行 Superset" > ~/bootstrap; fi
如果你不知道什么是chipmunkdb,可以在这里阅读我写的另一篇文章了解更多。

## [使用支持SQL的Pandas Dataframe作为网络数据库 — 感谢DuckDB如果你是一位需要创建或修改大型数据集的数据科学家,然后将它们作为SQL准备好的数据共享,可以使用Pandas Dataframe和DuckDB来实现……medium.com](https://medium.com/@thoren.lederer/use-pandas-dataframe-with-sql-support-as-a-network-database-thanks-to-duckdb-2a46e1f88b66?source=post_page-----6f1607405380--------------------------------)

在审查完你的 superset.yaml 文件后,运行以下命令来安装 Superset。
helm repo add superset https://apache.github.io/superset  
helm upgrade --install --values superset.yaml superset superset/superset

安装完成后,输出会显示如何访问您的 Superset 用户界面。默认的登录凭证为:

**用户名: admin**

**密码: admin**

输入凭证后,你应该看到以下仪表板界面。

![](https://imgapi.imooc.com/66f221bc0991ed0814000165.jpg)

## 祝贺!你已经安装了 Apache Superset!

# 你的看法是什么?你试过 Superset 吗?告诉我一下。

请让我知道您使用 Superset 的经历。您是否有其他推荐的免费仪表板解决方案?

如果你喜欢这篇文章,请给我点赞或关注我以获取更多内容。

谢谢,

Thoren
这篇关于这个拥有59000颗星的开源仪表板解决方案——Apache Superset,让我惊叹不已。的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!