云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

分布式数据库_moe域名注册_限量秒杀

小七 141 0

用CI/CD管理数据库中的库

这是ShopRunner的数据科学家Hanna Torrence的客座博客。介绍随着利用数据成为组织技术堆栈中更重要的组成部分,数据团队利用软件工程最佳实践变得越来越重要。Databricks平台为探索笔记本电脑中的apachespark工作流以及计划的作业提供了极好的工具。但是对于我们的生产级数据工作,我们的团队希望利用版本控制系统(如GitHub)和CI/CD工具(如Jenkins)以及Databricks的集群管理能力。Databricks支持笔记本电脑的CI/CD概念(正如在post Continuous Integration&Continuous Delivery with Databricks中所述),但是我们需要一个解决方案,允许我们使用现有的CI/CD设置将计划的作业更新为新的库版本,并在UI中提供相同的库以用于交互式集群。构建库并通过Databricks用户界面上传它们允许使用自定义代码,但这是一个非常手动的过程。一旦我们积累了大量的工作,手工更新每一个就变得非常耗时。为了解决这个问题,我们开发了apparate,这是一个python命令行工具,用于管理从Jenkins这样的持续集成/连续交付(CI/CD)工具上传和更新Databricks作业中使用的自定义库。现在你也可以享受魔法了!CI/CD是什么?我为什么要在乎?CI/CD指的是关于自动化部署过程的一组相关思想。CI代表持续集成,其中代码被一致地合并到公共代码库中(没有长时间运行的并行功能分支,这些分支很难合并)。CD表示连续部署,其中代码库的主分支保持在可部署状态,或者表示连续交付,其中主分支实际部署在每个合并上。所有这些都伴随着一系列的习惯和工具,因此可以自动化集成、部署和交付,而不必担心会破坏任何东西。Jenkins、Travis和CircleCI等CI/CD工具允许定义加快开发速度、减少人工工作量、简化通信流程并允许在早期阶段提供反馈的工作流。我们的一个Python包的标准Jenkinsfile将运行linting工具,运行单元测试,将打包的Python库推送到我们的工件存储区,然后使用apparate将egg推送到Databricks。以下是来自jenkins文件的示例代码片段,环境变量DATABRICKS_HOST、TOKEN和SHARED_FOLDER设置为所需的配置值,LIBRARY_CHANNEL是一个专门用于上载库周围警报的空闲通道:阶段('将鸡蛋推到数据块'){//安装幻影sh("pip安装装置")//使用Databricks配置变量创建配置文件sh(""printf"[默认值]\nhost=$DATABRICKS\u HOST\ntoken=$TOKEN\nprod_folder=$SHARED_folder">~/.apparatecfg""")//通过幻影分配鸡蛋sh("幻影上传和更新-p`ls dist/*.egg`2>结果.txt")//指定上载的库和更新的所有作业的读入日志字符串结果=readFile('结果.txt')回波结果//发送延迟警报slackSend(颜色:"#00FF00",消息:结果,频道:$LIBRARY_channel)}}为什么我们要写幻影?当我们的团队开始为我们维护的各种包设置CI/CD时,我们在将Jenkins与Databricks集成时遇到了一些困难。在我们的数据科学工作中,我们编写了很多Python+PySpark包,我们经常将这些包部署为使用Databricks按计划运行的批处理作业。但是,每次我们合并到这些库中的一个新更改中,我们都必须手动创建一个包,使用Databricks GUI上载它,找到所有使用该库的作业,并更新每个作业以指向新作业。随着我们的团队、库和工作的增加,这变得不可持续(更不用说与CI/CD理念的大突破了……)。当我们开始使用Databricks的库API来实现自动化时,我们意识到这个任务需要使用API的两个版本和许多依赖的API调用。我们没有试图在每个jenkins文件中重新创建这种逻辑,而是编写了幻影。Apparate现在可以在PyPi上用于一般用途,并且可以同时处理Python库的egg文件和Scala库的jar文件。幻影是如何工作的Apparate将对Databricks API的调用集合编织在一起。它使用1.2版的libraries API和2.0版的jobs API来收集所需的信息,并相应地更新库和作业。请注意,apparate依赖于一个版本控制系统,它可以清楚地显示出破坏性的更改——我们在ShopRunner中使用语义版本控制。Apparate在内部进行一些字符串解析,以便将Databricks的UI中看到的库名称与库的内部存储方式相匹配,因此它确实要求以一致的方式命名egg或jar文件(大多数打包工具默认情况下都会这样做)。"上载"和"更新"命令的工作方式如下:将egg或jar加载到Databricks的平台上,以便可以在UI库选择中找到它。获取平台上当前可用的库的列表使用一系列API调用在UI中的路径和隐藏在引擎盖下的实际egg或jar文件的文件名之间创建一个映射。获取所有作业的列表并筛选到使用当前库的任何版本的作业找到我们刚刚上传的库的所有其他版本使用相同的主版本更新任何作业以使用新库删除生产文件夹中库的同一主版本的早期次要版本如何使用幻影为了连接到您的Databricks帐户,apparate需要两条信息–您的主机名(类似https://)。cloud.databricks.com网站)和一个访问令牌。这两者都遵循与Databricks CLI(Azure | AWS)身份验证相同的格式。任何访问令牌都可以上载库,但更新作业需要具有管理员权限的访问令牌(这些权限可以由管理员帐户创建)。最后,apparate要求您指定一个生产文件夹,该文件夹对应于Databricks用户界面中存储生产级库的路径。Apparate可以将库上载到任何文件夹,但只会使用生产文件夹中的库更新作业,并且只清理生产文件夹中的旧版本。完成安装后,可以运行apparate configure来快速设置.apparatecfg文件,在该文件中apparate存储此信息。configure命令对于交互式使用非常有效,但是如果您使用自动设置,那么像上面的Jenkins示例一样,直接提供文件通常更容易。Apparate有两个主要的命令,upload和upload\u update。upload获取一个egg或jar文件和Databricks UI中的路径,并将库推送到该位置。例如:幻影上传-p/path/to/library/-f/Users/我的电子邮件@fake_organization.comupload_和\u update将egg或jar上载到生产文件夹,使用相同的库主版本更新所有作业,然后删除同一库的旧版本(在同一主版本中)。如果删除内容使您感到紧张,也可以关闭删除行为。例如:apparate上载_和_update-p/path/to/library/或apparate upload_和_update-p/path/to/library/——无清理这两个命令都记录了它们所做的事情的信息,我们发现将记录的语句重定向到专用的devops警报空闲通道非常有用。这些通知让每个人都可以看到他们使用的库何时已更新。还有一个--v DEBUG选项,它提供了有关正在进行的文件名解析的详细信息。如果apparate的行为不符合预期,或者对于为apparate本身开发新功能,此选项非常有用。在开发库时,幻影也可以很有用。我们经常发现,当我们开发出一个新功能时,频繁地重新上传一个每天都在变化的库是令人沮丧的。有了幻影,这个工作流程就简单多了。当您准备好测试对库的更改时,请从删除当前版本开始。(请注意,移动或重命名旧版本有时是不够的,必须将其完全删除并从垃圾箱文件夹中删除,然后群集才能一致地识别新副本)。然后重新启动集群,以便从缓存中擦除旧版本。然后,apparate upload命令可以轻松地为您上载库。有关完整的文档,请查看https://apparate.readthedocs.io/en/latest/。幻影如何改进我们的工作流程现在,我们对正在运行的代码版本有了更多的信心,并减少了手动编辑作业描述和集群配置的时间。每次运行作业时,我们都可以确信它运行的是库的最新稳定版本。没有更多的作业失败,因为有人错过了版本更新的作业!每个人都知道,所有团队库的当前版本都可以在我们的共享databricks文件夹中找到,这对于公共工具库特别有用。幻影住在githubhttps://github.com/ShopRunner/apparate,我们欢迎拉取请求。幻影让我们的生活更轻松,我们希望它也能为你做同样的事情!  免费试用Databricks。今天就开始吧