我们仍然对来找我们寻求从 HDFS 迁移到 MinIO 等现代对象存储的客户数量感到惊讶。我们以为现在每个人都已经完成了转型,但每周我们都会与一家决定进行转型的大型技术型组织进行交谈。
在这些讨论中,他们经常会希望在迁移后保留一些基础架构元素。HDFS 生态系统中诞生的框架和软件得到了大量开发人员的支持,并且在现代数据堆栈中仍然占有一席之地。事实上,我们经常说 HDFS 生态系统带来了很多好处。根本问题在于紧密耦合的存储和计算,而不一定在于大数据时代的工具和服务。
这篇博文将重点介绍如何在不拆除和更换有价值的工具和服务的情况下进行迁移。现实情况是,如果您不实现基础设施现代化,您就无法实现组织所需的 AI/ML 进步,但您不必为了实现这一目标而抛弃一切。
我们已经经历了一些
计算节点: Kubernetes 高效管理计算节点上无状态的 Apache Spark 和 Apache Hive 容器,确保最佳资源利用率和动态扩展。
存储层: MinIO
访问层:所有对MinIO对象存储的访问都通过S3 API统一,提供了与存储数据交互的无缝接口。
安全层:数据安全至关重要。MinIO 使用每个对象密钥加密所有数据,确保对未经授权的访问提供强大的保护。
身份管理: MinIO Enterprise 与 WSO2、Keycloak、Okta、Ping Identity 等身份提供商完全集成,以允许应用程序或用户进行身份验证。
Hadoop 的完全现代化替代品,允许您的组织保留 Hive、YARN 和任何其他可以与对象存储集成的 Hadoop 生态系统数据产品,而对象存储几乎是现代数据堆栈中的所有内容。
对于寻求从 Hadoop 过渡的应用程序来说,S3a 是一个必不可少的端点,它与 Hadoop 生态系统中的各种应用程序兼容。自 2006 年以来,与 S3 兼容的对象存储后端已作为默认功能无缝集成到 Hadoop 生态系统中的众多数据平台中。这种集成可以追溯到 S3 客户端实现在新兴技术中的应用。
在所有与 Hadoop 相关的平台上,采用hadoop-aws
模块和aws-java-sdk-bundle
都是标准做法,可确保对 S3 API 提供强大的支持。这种标准化方法有助于应用程序从 HDFS 和 S3 存储后端顺利过渡。只需指定适当的协议,开发人员就可以轻松地将应用程序从 Hadoop 切换到现代对象存储。S3 的协议方案由 s3a:// 表示,而对于 HDFS,则表示为 hdfs://。
可以详细讨论从 Hadoop 迁移到现代对象存储的好处。如果您正在阅读本文,那么您已经大致知道,如果不从 Hadoop 等传统平台迁移,AI 和其他现代数据产品的进步可能会被搁置。原因归结为性能和规模。
毫无疑问,现代工作负载需要出色的性能才能与正在处理的数据量和现在所需的任务复杂性相抗衡。当性能不仅仅是虚荣基准测试,而是一项硬性要求时,Hadoop 替代品的竞争者领域
推动迁移的另一个因素是云原生规模。当云的概念不再是一个物理位置,而是一个
这一概念的重要组成部分是摆脱供应商锁定所带来的经济效益,这使得组织可以为特定工作负载选择一流的选项。更不用说,组织不再需要维护三个单独的数据副本来保护数据,而使用
在深入了解我们的架构细节之前,您需要启动并运行一些组件。要从 Hadoop 迁移,显然您必须首先安装它。如果您想模拟这种体验,您可以通过在此处设置 Hortonworks Hadoop 发行版来开始本教程。
否则,您可以按照以下安装步骤开始:
设置 Ambari:下一步,
安装 Apache Spark: Spark 对于处理大规模数据至关重要。请按照
安装 MinIO :根据您的环境,您可以选择两种安装方法:
成功安装这些元素后,您可以将 Spark 和 Hive 配置为使用 MinIO 而不是 HDFS。导航到 Ambari UI http://<ambari-server>:8080/并使用默认凭据登录: username: admin, password: admin
,
在 Ambari 中,导航到服务,然后导航到 HDFS,然后导航到配置面板,如下面的屏幕截图所示。在此部分中,您将配置 Ambari 以使用 S3a 和 MinIO 而不是 HDFS。
向下滚动并导航到Custom core-site
。这是您将配置 S3a 的地方。
sudo pip install yq alias kv-pairify='yq ".configuration[]" | jq ".[]" | jq -r ".name + \"=\" + .value"'
从这里开始,您的配置将取决于您的基础架构。但是,以下内容可以代表core-site.xml
配置 S3a 的方法,该 S3a 带有在 12 个节点和 1.2TiB 内存上运行的 MinIO。
cat ${HADOOP_CONF_DIR}/core-site.xml | kv-pairify | grep "mapred" mapred.maxthreads.generate.mapoutput=2 # Num threads to write map outputs mapred.maxthreads.partition.closer=0 # Asynchronous map flushers mapreduce.fileoutputcommitter.algorithm.version=2 # Use the latest committer version mapreduce.job.reduce.slowstart.completedmaps=0.99 # 99% map, then reduce mapreduce.reduce.shuffle.input.buffer.percent=0.9 # Min % buffer in RAM mapreduce.reduce.shuffle.merge.percent=0.9 # Minimum % merges in RAM mapreduce.reduce.speculative=false # Disable speculation for reducing mapreduce.task.io.sort.factor=999 # Threshold before writing to drive mapreduce.task.sort.spill.percent=0.9 # Minimum % before spilling to drive
通过查看此迁移模式的文档,可以探索很多优化方法
当您对配置满意时,请重新启动全部。
您还需要导航到 Spark2 配置面板。
向下滚动到Custom spark-defaults
并添加以下属性以使用 MinIO 进行配置:
spark.hadoop.fs.s3a.access.key minio spark.hadoop.fs.s3a.secret.key minio123 spark.hadoop.fs.s3a.path.style.access true spark.hadoop.fs.s3a.block.size 512M spark.hadoop.fs.s3a.buffer.dir ${hadoop.tmp.dir}/s3a spark.hadoop.fs.s3a.committer.magic.enabled false spark.hadoop.fs.s3a.committer.name directory spark.hadoop.fs.s3a.committer.staging.abort.pending.uploads true spark.hadoop.fs.s3a.committer.staging.conflict-mode append spark.hadoop.fs.s3a.committer.staging.tmp.path /tmp/staging spark.hadoop.fs.s3a.committer.staging.unique-filenames true spark.hadoop.fs.s3a.committer.threads 2048 # number of threads writing to MinIO spark.hadoop.fs.s3a.connection.establish.timeout 5000 spark.hadoop.fs.s3a.connection.maximum 8192 # maximum number of concurrent conns spark.hadoop.fs.s3a.connection.ssl.enabled false spark.hadoop.fs.s3a.connection.timeout 200000 spark.hadoop.fs.s3a.endpoint http://minio:9000 spark.hadoop.fs.s3a.fast.upload.active.blocks 2048 # number of parallel uploads spark.hadoop.fs.s3a.fast.upload.buffer disk # use disk as the buffer for uploads spark.hadoop.fs.s3a.fast.upload true # turn on fast upload mode spark.hadoop.fs.s3a.impl org.apache.hadoop.spark.hadoop.fs.s3a.S3AFileSystem spark.hadoop.fs.s3a.max.total.tasks 2048 # maximum number of parallel tasks spark.hadoop.fs.s3a.multipart.size 512M # size of each multipart chunk spark.hadoop.fs.s3a.multipart.threshold 512M # size before using multipart uploads spark.hadoop.fs.s3a.socket.recv.buffer 65536 # read socket buffer hint spark.hadoop.fs.s3a.socket.send.buffer 65536 # write socket buffer hint spark.hadoop.fs.s3a.threads.max 2048 # maximum number of threads for S3A
应用配置更改后重新启动所有内容。
导航到 Hive 面板完成配置。
向下滚动到Custom hive-site
并添加以下属性:
hive.blobstore.use.blobstore.as.scratchdir=true hive.exec.input.listing.max.threads=50 hive.load.dynamic.partitions.thread=25 hive.metastore.fshandler.threads=50 hive.mv.files.threads=40 mapreduce.input.fileinputformat.list-status.num-threads=50
您可以找到更多微调配置信息
就这样,您现在可以测试您的集成了。
这篇博文概述了一种从 Hadoop 迁移的现代方法,无需彻底改造现有系统。通过利用 Kubernetes 管理 Apache Spark 和 Apache Hive,并集成 MinIO 进行有状态对象存储,组织可以实现支持动态扩展和高效资源利用的平衡架构。这种设置不仅保留了数据处理环境的功能,还增强了其功能,使其更加强大且面向未来。
借助 MinIO,您可以从存储解决方案中获益,该解决方案在商用硬件上提供高性能,通过纠删码(消除 Hadoop 数据复制的冗余)降低成本,并绕过供应商锁定和对基于 Cassandra 的元数据存储的需求等限制。这些优势对于希望利用高级 AI/ML 工作负载而不丢弃现有数据系统核心元素的组织至关重要。
欢迎随时联系我们,获取更详细的讨论或具体指导,了解如何定制此迁移策略以满足贵组织的独特需求。无论是通过电子邮件 [email protected] 还是通过我们的社区