使用由Presto,R和S3 Select功能提供支持的MinIO构建本地ML生态系统

使用由Presto,R和S3 Select功能提供支持的MinIO构建本地ML生态系统


抽象:

任何数字化旅程中的主要挑战之一是采用机器学习技术。鉴于工具和框架的爆炸式增长,可能很难知道从哪里开始,什么选择会阻止其他选择。企业希望针对可扩展性,可维护性,安全性和成本进行共同优化。

本文旨在使企业能够开始使用ML或AI,从而走向未来的增长。这篇文章假定您对Java有一定的了解。我们将一起进行一些代码开发,一些集成工作和一些配置。

在整个本文中,我们将与Hadoop进行比较和对比-了解为什么不需要这种级别的复杂性和可维护性。明确地说,我并不反对Hadoop,我喜欢Hadoop,但是有更好,更简单,更现代的方法来实现企业级分析性能。这些更现代的方法可以减轻团队在重新平衡文件系统,保持擦除编码,对外围工具(例如Apache RangerApache Sentry等)的需求和了解方面所需要的繁琐的周末时间,以提高外围设备的安全性,等等。等等。对于元数据管理,您需要从其他一些工具(例如Apache Atlas)寻求帮助

您是否曾经看过世界上任何稳定的数据库,其元数据位于另一个数据库中?我不太确定,为什么Hive如此设计。您需要将一个外部数据库配置为您的Hive元存储—可以是Derby或MySQL。如果您的数据在HDFS中丢失,那么大型metastore会保留!让我们对所有这些烦恼说“不”,让我们尝试将元数据与数据存储在一起,并避免在我们建议的ML平台中安装Hadoop或Hive。是的,我们将使用Hive,仅作为接口来投影数据以及定义的关系和元组(对于外行来说,这些是表和行)。

我们将对本文的内容进行如下划分


0_FUoyGNXHlLJUYFGv.png
建立我们建议的ML平台的步骤


1. MinIO设置

我不会花时间在上面,因为MinIO是世界上增长最快的本地对象存储系统的原因之一是,它在任何数量的配置中都非常易于安装和运行 MinIO稳定,可扩展,容错,安全且可持续。您不为MinIO做磁盘平衡:)。您无需担心擦除编码或安全性-这些功能内置了密钥和机密,并且通过组合适当的ACL,您可以拥有一个强大的系统。MinIO完全符合AWS S3 API。

对于MinIO的新手,我建议我另外两篇文章,第1部分第2部分,详细介绍该技术。


0_ymLe7nDuRGOZcqce.png
礼貌:截至2019年4月12日的MinIO使用统计(来自MinIO网站)


如果尚未安装,请下载正确的下载文件,然后按照快速入门指南进行操作

这是第一个Hadoop比较/对比时刻。您想升级基于Hadoop的生态系统时,您的组织花费或打算花费什么时间?几个月?可能假设一切顺利。MinIO —即使对于peta / exascale基础架构也要花费几分钟。

看,当我启动MinIO时发生了什么?我有一个旧副本。更新到最新版本并开始工作不到一分钟。


0_QhHdryI5DG3XyCe2.png
当有新版本发布时,MinIO要求自动升级


现在,您可以按照以下准则启动服务器:


0_N3pNsfaMvKLBpg5P.png
启动您的MinIO服务器


您可以使用MinIOClient(mc)或S3CMD创建存储桶并使用MinIO。在我之前的文章中,我使用了“ mc”。在这里,我使用s3cmd来演示MinIO的灵活性。让我们使用s3cmd创建一个名为“ mldata”的新存储桶。不要忘记使用上面屏幕上的MinIO服务器详细信息在本地计算机中创建.s3cfg文件。


0_cJwpbNfbOjNxoxZE.png
我们的MinIO服务器的.s3cfg文件。


现在创建一个目录,并通过列出来确保它存在:


0_LIUdGtFLNSg0ueaW.png
使用s3cmd从MinIO创建和列出存储桶


在本文的后面,我们将使用文件进行机器学习,特别是用于决策树。我们不会在ML上做任何解释,因为有很多有关机器学习的文档。

我正在使用过去的篮球统计数据进行训练,以预测未来的比赛将是“胜利”(结果是)还是“损失”(结果否)。

这是文件的快照。出于演示目的,我们使用一个小文件。在理想情况下,这可能是数以亿计的元组。


0_zvpTV-tv33fFNq6e.png
决策树的数据


下一步是将这些数据放入我们的存储桶中。为了轻松创建表,我们可以跳过标题行,并将CSV文件称为input.csv。sed这样的Unix小命令将在这里为我们提供帮助。


0_Q554dJSuUXObnjcb.png
我们删除标题行,并将数据插入我们之前创建的MinIO存储桶中


您可以删除此数据,因为我们将在本文后面使用Presto从MySQL动态创建表。

2. Presto设定

我们接下来要做的就是使用Presto。首先,请转到Presto的GitHub页面,并将以下文件下载到您的系统中。

  1. Presto服务器

  2. Presto命令行界面(CLI)

  3. Presto JDBC

我将这些文件放在名为“ MinIOlake”的目录中。将上面的服务器(1)提取到该文件夹中。有很好的说明这里跟随。步骤如下所示:


0_sFBxNpZj-YoI0l0G.png
下载文件并解压缩服务器


您将需要三个配置文件,以及一个在新目录“ etc”中名为“ catalog”的目录,该目录必须在提取的服务器文件夹中创建。步骤和文件如下所示。


0_ZFl-Z9qykQ58l_0a.png
服务器目录和关联文件


3.配置Presto以使用文件元存储和S3Select

现在好了。我们现在将目录目录保留为空。那是Presto需要所有连接器的地方。您可以配置Hive连接器并连接到MinIO,这是我在第2部分中介绍的内容要使用Hive Metastore,Hive必须正在运行并且要启动Metastore服务。我们从来没有机会启用S3Select来启用对基础MinIO的下推谓词现在,该方法已成为传统:)。我们将对架构进行改造,以适应最新和最佳的架构。让我们从在目录目录中写入MinIO.properties文件开始,以合并文件metastore和S3Select。干得好:


0_MVnxqamhGCP7ITj8.png
配置Presto以将MinIO用作元存储并启用S3Select


以上配置是本文最重要的部分。最好注意标记为1的两行和标记为2的最后一行。其他行是无关紧要的。

在第1行中,我们使用了Presto中的hive-hadoop2连接器,但是我们说使用MinIO S3存储桶(在步骤1中创建)代替了传统的基于节俭的Hive Metastore。这样,您无需在ML或数据生态系统中安装任何Hadoop或Hive的痕迹。

在第二部分中,我们在Presto中启用S3Select。MinIO只需一行代码即可处理下推谓词请求。如果未启用此功能,则所有数据都将流至Presto,包括过滤,这会对查询的性能产生负面影响,尤其是当查询具有条件并从存储桶中存储的多个表进行联接时。

关闭文件。现在您可以启动Presto服务器。我假设您的MinIO服务器正在运行。通过从服务器目录发出以下命令来启动Presto。


0_W6nAcSjcNBV-cZkk.png
配置完成后,启动Presto


现在,我们已经创建了同类最佳的数据湖。

接下来,我们将创建一个表,指向我们的文件“ input.csv”,该表存在于步骤1中创建的“ mldata”存储桶中。我们将使用Presto CLI(命令行界面,我们已经在“ MinIOlake”目录)。输入以下命令以创建表。在这里,我假设我们在MYSQL中的表位于名为“游戏”的架构内。


0_xMf_2jKPdYVoHvtS.png
代表我们所需数据的MySQL表


(使用标准SQL从前面讨论的有关篮球比赛统计数据中创建表),我们将使用Presto的CTAS(创建表为…)命令在MinIO中创建等效表。这突显了Presto从现有数据库中获取数据并将其迁移到MinIO的强大功能。可以这样完成:


0_KKGZCZA2ybdICjbV.png
轻松将数据从现有数据库迁移到MinIO


使用现在在S3:// mldata中的表,我们准备好进行下一步。注意上面的表名-MinIO.games.gamestats,这意味着,我们具有连接器MinIO(指向S3://,MinIO存储),一个名为“ games”的架构,并且在该架构中有一个名为“ gamestats”的表格。该元存储显然位于MinIO存储桶“ mldata”中。

绝对没有Hive Metastore,也没有Hadoop,因此也没有从外部启动的Metastore服务。

最后,在Presto中运行以下命令,然后查看输出

从MinIO.games.gamestats解释select *,其中结果=“是”


0_leZSvnk4hdEz4rLf.png
Presto的解释计划的结果。观察突出显示的部分


请注意上面代码的突出显示部分。我们看到的是使用“ scanfilter”和“ tablescan”。由于Presto仅处理相关信息,因此分析工作流程效率很高。这是下推谓词逻辑的强大功能,也是使S3 Select如此具有影响力的原因。

此示例使用三台DL-380计算机,6个CPU(每个CPU分别具有1 TB和32 GB Ram)来对具有各种数据大小的过滤查询进行MinIO性能测试。X轴表示查询的大小(以GB为单位),Y轴表示时间。为了在整个网络上提供最佳性能,我在节点和NVMe磁盘之间使用了专用的RDMA。网络带宽接近65 GB / s。结果如下:


0_znDI7_q8rGfgKUWx.png
MinIO S3 Select的性能测试结果


正如人们所看到的那样,随着数据大小的开始增长,性能改进才真正开始发挥作用,最终仅350 GB就能提供40%到50%的改进。

4.将Weka与Presto JDBC集成

让我们将其带入一个新的水平。现在,我们将使用Java进行一些编码,以将Weka与Presto集成在一起,后者又启用了S3Select,从而使MinIO的连接器就绪。我们将需要对Weka代码进行一些调整,以无缝集成Presto JDBC。下面说明了实现此目的的步骤:

步骤1:确保已安装Java 8 SDK。这里下载Weka快照解压缩下载的文件以获取以下文件:


0_hQJrkH8JOBVJmos1.png
下载并解压缩Weka


步骤2:进入weka目录。提取weka-src.jar文件,如下所示:


0_au0ffVOZsJGg590W.png
提取源文件


步骤3:将Minstolake目录中的presto-jdbc jar文件复制到提取源中的lib文件夹中。


0_F3OxzboBkNlFLFRx.png
将Presto jdbc jar文件复制到weka源中的lib文件夹中


步骤4:转到步骤2,weka文件夹。打开build.xml。找出名为“ compile”的ant目标(Apache ANT是Weka用来构建发行版jar的构建工具)。添加以下行以将JDBC jar文件分解为类,以便最终的jar也包含我们的JDBC。添加突出显示的部分。如果您知道如何在Java中操作类路径,则可以忽略此设置。


0_pg-6rFr_wiHsi4Hz.png
整合Presto JDBC以构建最终的jar


步骤5:创建以下文件的副本


0_pIRD7Gta3Msu-LM0.png
创建类型映射文件


这里需要一些解释。Weka无法理解Universe中所有数据库的所有数据类型。我们需要提供一个映射文件,该文件指定必须如何解释源数据库类型。另外,驱动程序名称和部件在此文件中指定。由于我们的数据类型与Oracle非常相似,因此我们创建了一个副本。高级用户可以创建自己的。

步骤6:编辑以上文件,以添加驱动程序名称和服务器/端口详细信息,如下所示,并将文件另存为DatabaseUtils.props。请同时检查数据类型,如下面的屏幕快照所示。Weka将拥有此文件,但随时可以覆盖:


0_a9bH-i7EO8xJ0KFP.png
更改jdbcDriver和jdbcURL属性
0_ULtyPUlO11_ITlu8.png
在DatabaseUtils.props中,请在下面滚动并添加以上数据类型


步骤7:建立一个新的jar文件。转到步骤2,weka文件夹,然后键入“ ant exejar”。假设:您已安装ANT。如果您不租赁,请按照此处的说明进行操作


0_MaOAooA7JBXxJ9ZP.png
整合Presto JDBC后成功构建Weka


如您所见,ANT创建了一个名为dist的新文件夹,并提供了一个名为weka.jar的jar文件。这个罐子是我们将用于下一步的罐子

5.机器学习:基于MinIO数据的Weka决策树

至此,我们已经建立了功能强大的现代化数据湖和分析平台。让我们使用Weka在样本数据上应用主要的分类算法之一,决策树。由于我们已经创建了Presto连接器,因此Weka将连接到Presto,从MinIO中提取数据。在进行下一步之前,请快速检查一下:您必须同时运行MinIO和Presto:


0_i1x8onf8DrWV2rJ2.png
1. MinIO启动屏幕2. Presto启动屏幕


第1步:从您创建分发jar的dist目录中启动Weka:

java -jar weka.jar


0_w7Y9loYwL0T2_7un.png


点击“资源管理器”

转到窗口下方:


1_6MwPXISkEt7jKHepCzLwvg.png
单击打开数据库 按钮


您将看到一个SQL-Viewer窗口。该URL将显示jdbc:presto:// @ servername:8080。将Presto在本地运行,将@servername更改为localhost。您可以点击右侧的第一个按钮以设置用户名和密码。输入任何用户名(在我的情况下为MinIO),并保留密码为空。如果在Presto中启用身份验证并配置https,则需要提供有效的用户ID和密码。


1_Im_FLveRwvGX1OZslv5KvQ.png
Weka SQL-Viewer窗口


步骤2:单击OK(确定),然后单击右侧的第二个按钮后,您将看到Info(信息)窗格显示状态。现在编写我们的查询。

选择* from minio.games.gamestats //不要在最后加上分号

点击执行按钮。瞧!我们第一个运行中的MinIO浏览器。


1_8xTFV7tsynfmerGmlkt_Pw.png
Weka从Minio获取数据


现在单击“确定”按钮。您不应获得任何与数据类型相关的错误。如果发现错误,请重新查看我们之前更改的DatabaseUtils.props,然后再次仔细检查。

现在,您将获得功能强大的Weka“预处理”屏幕,您将在其中看到:


1_-hjRflU_wxdmERQu8W1zXg.png
我们的平台现在从Minio获取了结果


步骤3:让我们开始ML动作。通常,当您像上面那样携带数据时,可能会混合使用不同数据类型的列。有些列可能是分类的(您在其中列出了可能的值,通常是字符串)或连续的(离散数字)。您可能需要进行数据清理和转换。为此,Weka通过一系列惊人的过滤器来支持它。您可以通过单击“过滤器”看到它。如果您的数据稀疏,或者您可以删除不相关的值(可能不会为您的ML逻辑添加任何值),甚至我们都可以使用这些选项将某些值替换为null。例如,员工ID在贷款申请结果预测中可能没有任何作用。您在Spark中使用StringIndexer转换数据类型。

对于决策树,单击“分类”按钮。您将在左侧看到一个窗口,其中包含Weka支持的所有算法。选择“树”,然后选择J48。


1_ow7wvdI8OqqiKoJ22QQQZA.png
从“分类”部分中选择Weka中的J48算法


点击“开始”。让其余选项为默认选项。作为机器学习专家,您知道这些是什么。看到我们创建了一个具有70%准确性的模型。对于像我们这样的少量实验数据,这很好,因为我不想进一步调整它。


1_jcv8lXcJRmOJtwl8NGTLkg.png
我们创建了第一个决策树模型,准确率达到70%


将模型保存在您的MinIOlake文件夹中(不保存在MinIO存储中,因为Weka无法读取S3://协议)。将其称为“ MinIOdtree.nodel”。


1_sj89Fo9r0ACyi980ogFnoA.png
保存我们创建的模型


6.测试我们的决策树模型

现在让我们测试模型。为此,我们将创建一个包含两行的文件,其中不知道我们的预测。将该文件命名为Test.csv。它在下面给出。


1_2cKPjmcNvh7FAVQ0osyUQg.png
我们的Test.csv可以预测结果


观察“?” 分数。我们不知道结果如何,我们希望Weka使用我们创建的模型告诉我们。

步骤1:启动Weka。只需单击“文件按钮”,然后提供任何文件。我们将不会使用此文件。如果您正在读取CSV文件,请更改文件类型。在Weka中,除非您提供一些输入文件,否则无法打开“分类”部分。在“分类”中,进入“结果列表”窗口,右键单击并加载上一节中保存的模型。如下所示:


1_Add9IHXaO7SKZ0mJdKPyJw.png
加载模型


选择“ MinIOdtree.model”。然后在“测试选项”上单击“提供的测试集”。遍历MinIOlake文件夹并输入“ Test.csv”。


1_HwvA61oCiFnzf-7QhEN9Ew.png
提供Test.csv以根据我们的模型预测结果


现在单击“更多选项”。确保输出类型为“纯文本”。


1__Wg7RKDCmEROwFSLwKBVkA.png
更改输出预测类型


完成此操作后,右键单击“结果列表”窗格。单击“在当前测试集上重新评估模型”。


1_70IWhi-kpH_9p5YpssJ-3g.png
测试


然后你去。您已经使用我们的模型预测了结果:


1_PISIRuKLwCXPaiw9_8USwA.png
我们的预测结果


最后,您可以在Wek中可视化树。右键单击“结果列表”窗格,然后选择“可视化树”以查看如何评估模型。


1_BhcWChNnc00a7SA3iYTDQg.png
我们模型的视觉表示


奖励:从R连接MinIO

你们中有些人可能是R的核心程序员,而Weka的引入可能并没有使他们感兴趣。对于那些R极客,这是个主意:

  • 下载RPresto软件包并安装到您的R环境中。

  • 请确保Presto和MinIO正在运行。再次,没有蜂巢。

  • 以下是代码:

install.packages(“ RPresto”)
install.packages(“ dplyr”)
install.packages(“ dbplyr”)
my_db <-src_presto(catalog =“ MinIO”,schema =“ games”,用户=“ ravi”,host =“本地主机”,端口= 8080,session.timezone =“美国/东部”)
my_tbl <-dplyr.tbl(my_db,“ gamestats”)
my_tbl

4.生成以下输出:


1_TPSrG8-NfRlM597aDRa06g.png
通过Presto将R与Minio连接


使用变量my_tble,现在您可以在R中编写所有您喜欢的东西。

总而言之,让我们来看看我们所做的架构图。


1_7I9Wy5Z1YCb3vsJ5Y0f8zA.jpeg
基于Minio和其他工具的端到端ML平台


我使用了64 GB的服务器,并且可以对8个属性的约12亿行进行建模。您可以将MinIO群集,将Presto群集以进行更多改进。您可以将NVMe光盘与RDMA连接器一起使用,以提高吞吐量。

希望本文能证明具有MinIO对象存储功能的高级分析框架多么容易和强大。如果您需要更多支持或继续进行对话,请通过LinkedIn与我联系

上一篇 下一篇