我是 Hadoop 新手,想知道 Hadoop 在一个场景中工作。
在创建 Dynamic Web 项目期间,我曾经通过从 Java/C# 发送查询来存储和获取 MySQL 数据库中的数据。
我在我的项目中使用 Hadoop 服务,并且 hadoop 提供了任何构建数据库系统,我们可以在其中存储数据并在需要时检索它,而不是使用外部数据库。
提前致谢。
Hadoop 不提供任何内置数据库。这只是两件事:
我假设您需要非常快速的响应,因为您正在处理 Web 服务。恕我直言,Hadoop(准确地说是 HDFS)或任何其他 FS 在这种情况下都不是合适的选择。原因是 HDFS 缺乏随机/读取功能,这对于任何 Web 项目都非常重要。
Hive 也是如此。尽管它以类似于 RDBMS 的方式管理数据,但它实际上不是 RDBMS。底层存储机制仍然是HDFS 文件。此外,当您发出 Hive 查询以获取结果时,该查询首先会转换为 MR 作业,然后生成结果,从而导致响应缓慢。
您最安全的选择是使用HBase。当您需要对数据进行随机、实时的读/写访问时,这绝对是一个更好的选择,就像您的情况一样。虽然它不是 Hadoop 平台的一部分,但它是为与 Hadoop 一起使用而构建的。在您现有的 HDFS 集群之上工作,可以直接通过不同的 HBase API(适合您的情况)或通过 MR(不适用于实时数据。适合您需要批量处理大量数据时)。易于设置和使用,无需额外的基础设施。
这里要注意的一件重要事情是,HBase 是一个 NoSQL DB,不遵循 RDBMS 约定和术语。因此,您最初可能需要在设计上做一些工作。
除了 HBase,你还有一些其他的选择,比如Cassandra,它也是一个 NoSQL DB。
高温高压
Hadoop 作业使用 anInputFormat
创建InputSplit
s。虽然大多数示例使用文件输入并使用 HDFS 片段作为输入拆分,但这个概念是抽象的,可以映射到其他输入。一个典型的例子是已经存在的DataDrivenDBInputSplit
,它表示表中的一组行。这种输入格式/输入拆分是Apache Sqoop(一个提供多个命令的命令行工具)用来读取数据库输入的。
它的要点是绝对有可能使用数据库作为工作的输入,你必须意识到你将实现的是释放一个计算节点集群来通过对一系列行的请求来冲击你的关系数据库。您的后端很可能无法处理负载,或者充其量只能缓慢处理。Hadoop 的强大功能来自于处理与简化的本地存储访问的集成,而您明确要求放弃它。
因此,如果您的目标是在 RDBMS 和 HDFS 之间移动数据,Scoop 在以下情况下为您提供帮助
从数据库中导入所有表 ( import-all-tables )
导入一张表(sqoop-import)
导入表的一部分(特定行或特定列)(分别为--where 或 --columns 参数)
将数据从 HDFS 导出到关系数据库 ( sqoop-export )
Hadoop Core 不包含任何数据库。
数据库很棒。对索引/调整的数据库发出 SQL SELECT 调用,响应会在几毫秒内返回。想要更改该数据?SQL UPDATE 和变化。Hadoop 不这样做。
Hadoop将数据存储在文件中,并且不对它们进行索引。如果你想找到一些东西,你必须运行一个 MapReduce 作业来遍历所有数据。这需要时间,并且意味着您不能直接使用 Hadoop 作为数据库的替代品。Hadoop 工作的地方是数据对于数据库来说太大(即您已达到技术限制,而不仅仅是您不想为数据库许可证付费)。对于非常大的数据集,重新生成索引的成本非常高,您无法轻松索引更改数据。由于许多机器试图写入数据库,您无法锁定它。在这里,分布式文件系统中模糊相关文件的想法可以发挥作用。
有一个在 Hadoop HDFS 之上运行的高性能列表数据库:Apache HBase。这是保存从原始数据中提取的结果的好地方。
您还可以使用Apache Hive,它让您感觉像 MySQL 的关系数据库(尽管有缺点)。在幕后,它使用 Mapreduce 帮助您利用 Hadoop 处理大数据。请注意,Hive 不是为 OLTP 工作负载设计的,不提供实时查询或行级更新