alluxio分布式存储部署 - tencentmusic/cube-studio GitHub Wiki

分布式存储alluxio+minio

先决条件

一个Kubernetes集群(版本> = 1.8)。在默认规范下,Alluxio workers可以通过设置sizeLimit参数来决定emptyDir卷的大小。这是Kubernetes 1.8版本中的一个Alpha特性。在使用前请确保此功能已启用。

一个Alluxio Docker镜像alluxio/alluxio。如果使用私有Docker注册表,请参阅Kubernetes documentation。 确保Kubernetes网络策略允许应用程序(Alluxio客户端)和Alluxio Pods之间在已定义端口上的连接。

基本设置

本教程介绍了在Kubernetes上的基本Alluxio安装。 Alluxio支持在Kubernetes上两种安装方法:使用helm图表或使用kubectl。如果可选,helm是首选安装Alluxio方法。如果没法使用helm安装或需要额外定制化部署,则可以直接通过原生Kubernetes资源规范使用kubectl

注意:从Alluxio 2.3起,Alluxio仅支持helm 3。 参阅如何从helm 2迁移到helm 3

参考文档:https://docs.alluxio.io/os/user/stable/cn/kubernetes/Running-Alluxio-On-Kubernetes.html

什么是 Alluxio

Alluxio 是世界上第一个面向基于云的数据分析和人工智能的开源的数据编排技术。 它为数据驱动型应用和存储系统构建了桥梁, 将数据从存储层移动到距离数据驱动型应用更近的位置从而能够更容易被访问。 这还使得应用程序能够通过一个公共接口连接到许多存储系统。 Alluxio内存至上的层次化架构使得数据的访问速度能比现有方案快几个数量级。

在大数据生态系统中,Alluxio 位于数据驱动框架或应用(如 Apache Spark、Presto、Tensorflow、Apache Hive 或 Apache Flink)和各种持久化存储系统(如 Amazon S3、Google Cloud Storage、OpenStack Swift、HDFS、IBM Cleversafe、EMC ECS、Ceph、NFS 、Minio和 Alibaba OSS)之间。 Alluxio 统一了存储在这些不同存储系统中的数据,为其上层数据驱动型应用提供统一的客户端 API 和全局命名空间。

Alluxio 项目源自 UC Berkeley 的 AMPLab(见论文),在伯克利数据分析栈 (Berkeley Data Analytics Stack, BDAS) 中扮演数据访问层的角色。 它以 Apache License 2.0 协议的方式开源。 Alluxio 是发展最快的开源大数据项目之一,已经吸引了超过 300 个组织机构的1000多名贡献者参与到 Alluxio 的开发中,包括 阿里巴巴Alluxio百度CMUGoogleIBMIntel南京大学Red Hat腾讯UC Berkeley、 和 Yahoo

到今天为止,Alluxio 已经在数百家机构的生产中进行了部署,最大部署运行的集群规模超过 1500 个节点。

优势

通过简化应用程序访问其数据的方式(无论数据是什么格式或位置),Alluxio 能够帮助克服从数据中提取信息所面临的困难。Alluxio 的优势包括:

  • 内存速度 I/O:Alluxio 能够用作分布式共享缓存服务,这样与 Alluxio 通信的计算应用程序可以透明地缓存频繁访问的数据(尤其是从远程位置),以提供内存级 I/O 吞吐率。此外,Alluxio的层次化存储机制能够充分利用内存、固态硬盘或者磁盘,降低具有弹性扩张特性的数据驱动型应用的成本开销。
  • 简化云存储和对象存储接入:与传统文件系统相比,云存储系统和对象存储系统使用不同的语义,这些语义对性能的影响也不同于传统文件系统。在云存储和对象存储系统上进行常见的文件系统操作(如列出目录和重命名)通常会导致显著的性能开销。当访问云存储中的数据时,应用程序没有节点级数据本地性或跨应用程序缓存。将 Alluxio 与云存储或对象存储一起部署可以缓解这些问题,因为这样将从 Alluxio 中检索读取数据,而不是从底层云存储或对象存储中检索读取。
  • 简化数据管理:Alluxio 提供对多数据源的单点访问。除了连接不同类型的数据源之外,Alluxio 还允许用户同时连接同一存储系统的不同版本,如多个版本的 HDFS,并且无需复杂的系统配置和管理。
  • 应用程序部署简易:Alluxio 管理应用程序和文件或对象存储之间的通信,将应用程序的数据访问请求转换为底层存储接口的请求。Alluxio 与 Hadoop 生态系统兼容,现有的数据分析应用程序,如 Spark 和 MapReduce 程序,无需更改任何代码就能在 Alluxio 上运行。

技术创新

Alluxio 将三个关键领域的创新结合在一起,提供了一套独特的功能。

  1. 全局命名空间:Alluxio 能够对多个独立存储系统提供单点访问,无论这些存储系统的物理位置在何处。这提供了所有数据源的统一视图和应用程序的标准接口。有关详细信息,请参阅统一命名空间文档
  2. 智能多层级缓存:Alluxio 集群能够充当底层存储系统中数据的读写缓存。可配置自动优化数据放置策略,以实现跨内存和磁盘(SSD/HDD)的性能和可靠性。缓存对用户是透明的,使用缓冲来保持与持久存储的一致性。有关详细信息,请参阅 缓存功能文档
  3. 服务器端 API 翻译转换:Alluxio支持工业界场景的API接口,例如HDFS API, S3 API, FUSE API, REST API。它能够透明地从标准客户端接口转换到任何存储接口。Alluxio 负责管理应用程序和文件或对象存储之间的通信,从而消除了对复杂系统进行配置和管理的需求。文件数据可以看起来像对象数据,反之亦然。

部署过程

 创建内存缓存目录并挂载,每个机器都要创建和挂载
 mkdir -pv /mnt/memory
 mount -t ramfs -o size=20G ramfs /mnt/memory
  
# 部署alluxio+minio版本
if [ `kubectl get node|grep -v NAME|wc -l` -gt 2 ];then
  kubectl apply -f minio/cluster/
  sleep 3
  kubectl -n infra wait sts/minio --for=jsonpath='{.status.readyReplicas}'=6 --timeout=600s
  echo "minio cluster is ready alluxio cluster is start install"
  cd alluxio/2.9 && helm install alluxio ./alluxio -n infra
  cd ../..

  while true;do
      if [ `kubectl get pod -n infra|grep minio|grep -v mc|grep Run|wc -l` -gt 3 ];then
        # 自动到minio里面创建一个alluxio的bucket,用于存储alluxio数据
        kubectl apply  -f minio/minio-mc.yaml
        break
      else
        echo "minio-cluster is not ready"
        sleep 3
      fi
  done

  kubectl wait daemonset/alluxio-fuse --for=jsonpath='{.status.numberReady}'=3  --timeout=600s -n infra
  # 修改kubeflow挂载alluxio目录,需要等待alluxio-fuse就绪等候主机挂载上/data/k8s目录
  while true;do
    if [ `df -h|grep alluxio-fuse|wc -l` == 3 ];then
      for node in $1;do
        ssh root@${node} rm -rvf /data/k8s/kubeflow/pipeline
        ssh root@${node} mkdir -pv /data/k8s/kubeflow
        ssh root@${node} ln -s /data/alluxio /data/k8s/kubeflow/pipeline
      done
      mkdir -pv  /data/k8s/kubeflow/pipeline/{workspace,archives}
      break
    else
      echo "alluxio-fuse is not mount ready"
      sleep 3
    fi
  done
else
    # 部署单节点minio和alluxio
    kubectl apply -f minio/single/
    while true;do
        if [ `kubectl get pod -n infra|grep minio|grep -v mc|grep Run|wc -l` -gt 0 ];then
          # 自动到minio里面创建一个alluxio的bucket,用于存储alluxio数据
          kubectl apply  -f minio/minio-mc.yaml
          break
        else
          echo "minio is not ready"
          sleep 3
        fi
    done


    echo "alluxio single start install"
    cd alluxio/2.9 && helm install alluxio ./alluxio -n infra
    kubectl wait daemonset/alluxio-fuse --for=jsonpath='{.status.numberReady}'=1  --timeout=600s -n infra
    while true;do
      if [ `df -h|grep alluxio-fuse|wc -l` == 1 ];then
        # 修改kubeflow挂载alluxio目录,需要等待alluxio-fuse就绪挂载上/data/k8s目录
        mkdir -pv  /data/k8s/kubeflow/
        ln -s /data/alluxio /data/k8s/kubeflow/pipeline
        mkdir -pv  /data/k8s/kubeflow/pipeline/{workspace,archives}
        break
      else
        echo "alluxio-fuse is not mount ready"
        sleep 3
      fi
    done

    cd ../..
fi

部署完成会将/data/alluxio软链接到/data/k8s/kubeflow/pipeline上

alluixo限制:不支持追加写,训练任务日志需要处理日志追加问题。