具有MinIO的Modern Data Lake:第2部分
在本系列的第一部分中,我们了解了为什么像Minio这样的对象存储系统是构建敏捷,经济高效且可大规模扩展的现代数据湖的理想方法。
在这篇文章中,我们将学习有关对象存储的更多信息,特别是Minio,然后了解如何将Minio与Apache Spark和Presto之类的工具连接以进行分析工作负载。
对象存储系统的体系结构
对象存储的设计原则之一是使管理员和应用程序远离一些较低的存储层。因此,数据作为对象而不是文件或块被公开和管理。对象包含其他描述性属性,可用于更好的索引或管理。管理员不必执行较低级别的存储功能,如构造和管理逻辑卷以利用磁盘容量或设置RAID级别来处理磁盘故障。
对象存储还允许通过不仅仅是文件名和文件路径来寻址和标识单个对象。对象存储在存储桶内或整个系统中添加了唯一的标识符,以支持更大的名称空间并消除名称冲突。
在对象中包含丰富的自定义元数据
对象存储将文件元数据与数据明确分开,以支持其他功能。与文件系统中固定的元数据(文件名,创建日期,类型等)相反,对象存储提供了完整功能,自定义,对象级别的元数据,以便:
捕获特定于应用程序或特定于用户的信息,以更好地建立索引
支持数据管理策略(例如,用于将对象从一个存储层移动到另一存储层的策略)
集中管理多个单个节点和群集中的存储
独立于数据存储(例如非结构化二进制存储),优化元数据存储(例如,封装的,数据库或键值存储)和缓存/索引(当权威性元数据与对象内部的元数据一起封装时)


将Minio Object Store与Hadoop 3集成
使用Minio文档在您喜欢的平台上部署Minio。然后,按照步骤查看如何将Minio与Hadoop集成。
首先,安装Hadoop 3.1.0。下载tar并将其解压缩到一个文件夹中。如下创建.bashrc或.profile(在Windows中,路径和环境变量)

2)与文件系统相关的Hadoop的所有配置都保存在一个目录中etc/hadoop(这是从您的安装根目录开始的相对目录-我将把根安装目录称为$HADOOP_HOME)。我们需要进行更改core-site.xml以指向新的文件系统。请注意,当我们编写hdfs://用于访问Hadoop文件系统的文件时,默认情况下,它连接到中配置的基础默认FS core-site.xml,该文件以128MB的块进行管理(Hadoop版本1为64 MB),从本质上表明hdfs是块存储。现在我们有了对象存储,访问协议就不能了hdfs://。相反,我们需要使用另一种协议,最常用的是s3a。S3代表由Amazon创建的简单存储服务,被广泛用作对象存储的访问协议。因此在core-site.xml,我们需要编写有关当命令以开头时底层代码应该做什么的信息s3a。有关详细信息,请参考以下文件,并将其更新到core-site.xml您的Hadoop安装中。<属性>
<名称> fs.s3a.endpoint
<描述>要连接到的AWS S3端点。 <值> http:/ / localhost:9000
<!—注意:上面的值是从minio启动窗口获得的-->
<!—注意:上面的值是从minio启动窗口获得的-->
<
<!—注意:上面的值是从minio启动窗口获得的—->
3)要启用s3a,我们需要将一些jar文件复制到$HADOOP_HOME/share/lib/common/lib 目录中。请注意,您还需要将Hadoop版本与下载的jar文件进行匹配。我使用Hadoop版本3.1.1,因此使用hadoop-aws-3.1.1.jar。这些是需要的jar文件:hadoop-aws-3.1.1.jar //应与您的Hadoop版本匹配
aws-java-sdk-1.11.406.jar
aws-java-sdk-1.7.4.jar
aws-java-sdk -core-1.11.234.jar
aws-java-sdk-dynamodb-1.11.234.jar
aws-java-sdk-kms-1.11.234.jar
aws-java-sdk-s3–1.11.406.jar
httpclient-4.5 .3.jar
乔达时间2.9.9.jar


6)现在在本地使用随机文本创建一个示例文件res.txt。然后输入
hadoop fs –put res.txt s3a://mydemobucket/res.txt

此外,请hadoop fs –cat对您可能拥有的任何文件尝试使用命令:

如果所有这些都对您有用,那么我们已经使用成功将Minio与Hadoop集成在一起s3a://。
将Minio Object Store与HIVE 3.1.0集成
下载与Apache Hadoop 3.1.0兼容的最新版本的HIVE。我用过apache-hive-3.1.0。解压缩下载的bin文件。让我们将未压缩的目录称为hive-3.1.0

2)首先将您在Hadoop集成部分中使用上面的步骤3的所有文件复制到$HIVE_HOME/lib 目录中
3)创建hive-site.xml。确保已运行MYSQL以用作元存储。创建一个用户(在此示例中为ravi)
4)自最初以来,我们需要运行一次metatool。添加$HIVE_HOME并装箱到环境变量。请参阅上面的步骤1。
5)在minio中,创建一个名为hive的存储桶和一个目录仓库。我们必须s3a://hive/warehouse有空。
6)取得您的~/.profile。请将MYSQL驱动程序(mysql-connector-java-xyzjar)复制到$HIVE_HOME/lib。然后运行metatool作为

7)通过$ HIVE_HOME / bin / hiveserver2启动Hive服务器和元存储区启动$ HIVE_HOME / bin / hiveserver2-服务元存储
区
8)将一些数据文件复制到mydemobucket我们之前创建的。您可以在上面的步骤6中使用minio客户端。我有myschools.csv,其中包含schoolid,schoolname,schoolcity,schoolstate和schoolnick。该文件如下:

执行以下命令,对数据文件的位置和名称进行适当的更改。确保将数据复制到本地。


10)创建一个HIVE表,现在的数据指向s3。请注意,您必须放弃父目录,而不是文件名。我已突出显示您提供文件名时可能会收到的错误消息

现在,您已经从s3数据创建了一个HIVE表。这意味着,使用基础文件系统作为S3,我们可以创建不依赖HDFS的数据仓库。
集成Presto —具有Minio对象存储的统一数据架构平台
您现在可能需要另一个重要的组件:当转移到对象存储时,如何将数据与现有系统结合?您可能希望将组织的MYSQL数据库中的数据与HIVE中的数据进行比较(在S3上)。这是世界上最顶尖的,免费的(开源)统一数据架构系统之一,这是Facebook的历史。
现在,让我们将presto与整个系统集成在一起。从https://github.com/prestodb/presto下载最新版本。按照部署说明进行操作。至少,我们需要presto服务器和presto客户端来访问服务器。它的分布式SQL查询引擎使您可以编写SQL,以从具有丰富SQL功能集的多个系统中获取数据。
安装Presto。您将从根目录开始具有以下目录结构。在目录目录中,您将提到需要Presto查询的连接器。连接器是Presto可以查询的系统。Presto提供了许多默认连接器。

2)打开hive.properties。我们应该有以下数据。再次从minio启动屏幕获得访问密钥和秘密


4)运行presto客户端。这是通过以下命令完成的:

5)首先,您需要提及catalogname。databasename。tablename获取数据的格式。我们的目录名称是HIVE,数据库是默认名称,表名称是school。因此

6)您现在可以将mysql目录与hive目录结合起来-无缝地统一来自多个系统的数据。请参阅以下Presto中的查询(例如,仅交叉查询)

集成Spark —带有Minio对象存储的统一分析
在之前的步骤中,我们已经完成了针对Minio运行Spark的所有先决条件。这包括获取正确的jar并core-site.xml在Hadoop 3.1.1中进行设置。值得注意的是,您需要下载没有Hadoop的Spark版本。原因是,Spark尚未针对3.1.1 Hadoop进行认证,因此将Spark包含在Hadoop中将与jar文件产生许多冲突。您可以从https://archive.apache.org/dist/spark/spark-2.3.1/下载不带Hadoop的Spark
1)使用前面在与Hadoop集成部分的步骤3中提到的所有jar,启动Spark shell。您可以创建一个bin目录,复制所有jar。或参考您之前的罐子。

2)让我们在Spark中创建一个RDD。输入
spark.sparkContext.hadoopConfiguration.set(“fs.s3a.endpoint”, “http://localhost:9000");
spark.sparkContext.hadoopConfiguration.set(“fs.s3a.access.key”, “UC8VCVUZMY185KVDBV32”);
spark.sparkContext.hadoopConfiguration.set(“fs.s3a.secret.key”, “/ISE3ew43qUL5vX7XGQ/Br86ptYEiH/7HWShhATw”);
spark.sparkContext.hadoopConfiguration.set(“fs.s3a.path.style.access”, “true”);
spark.sparkContext.hadoopConfiguration.set(“fs.s3a.connection.ssl.enabled”, “false”);
spark.sparkContext.hadoopConfiguration.set(“fs.s3a.impl”, “org.apache.hadoop.fs.s3a.S3AFileSystem”);
val b1 = sc.textFile(“s3a://mydemobucket/myschools.csv”)
3)您可以将RDD转换为dataFrame,然后获取值

4)最后,让我们使用Spark的s3协议将其写回到minio对象存储中。在执行以下命令之前,请确保已创建了一个名为spark-test的存储桶(假设resultdf是现有的存储桶)。

集成Spark —我们在写文件还是对象?
您是否注意到,当我们通过S3使用Spark编写文件时,这些文件被写为普通文件-理想情况下,当我们使用基础对象存储Minio时,情况不应如此。我们可以将数据作为对象写入Minio吗?以下代码显示了如何。诀窍是在您的Java或Scala代码中集成minio客户端Java SDK。使用foreachPartition Spark功能直接写入Minio。
首先,编写一个更新为Minio的函数。

现在,在您的Spark代码中使用上述功能,如下所示:


概要
我们已经证明,使用Minio的对象存储是创建数据湖的非常有效的方法。数据湖所需的所有必要组件都通过s3a协议与Minio无缝协作。
您的数据湖的总体架构可以是:

希望您能够探索这些概念并在各种用例中使用它。请享用!