如何将数据移入和移出Hadoop?大数据应用

来源:互联网 / 作者:SKY / 2018-10-09 18:04 / 点击:
本文是《Hadoop从入门到精通》大型专题的第5章,将完全解答上述问题,让企业走上无忧数据移动之路。本章,我们将首先介绍如何将不同位置和不同格式的数据移动到H

【新产品上线啦】51CTO播客,随时随地,碎片化学习

企业在项目中完全使用Hadoop之前,数据移动是必须解决的事情之一。如何将数千台主机日志数据放入Hadoop?从关系型或者No/NewSQL系统以及Hadoop中获取数据的最有效方法是什么?如何将Hadoop中生成的Lucene索引输出到服务器?这些流程如何实现自动化?

本文是《Hadoop从入门到精通》大型专题的第5章,将完全解答上述问题,让企业走上无忧数据移动之路。本章,我们将首先介绍如何将不同位置和不同格式的数据移动到Hadoop,之后将讲解如何将数据移出Hadoop。

5.1 数据移动的关键要素

将大量数据移入和移出Hadoop面临很多挑战,包括数据一致性和资源对数据源和目标的影响。然而,在深入研究这些技术之前,我们需要讨论在处理数据移动时应该注意的因素。

幂等

在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。换句话说,幂等操作无论执行多少次都会产生相同的结果。在关系数据库中,插入通常不是幂等的,因为多次执行不会产生相同的结果数据库状态。或者,更新通常是幂等的,因为它们将产生相同的最终结果。

无论何时写入数据,都应该考虑幂等性,Hadoop中的数据入口和出口没有很大区别。分布式日志收集框架如何处理数据重传?如何在多个任务并行插入数据库的MapReduce作业中确保幂等行为?

聚合

数据聚合过程组合了多个数据元素。在数据入口的上下文中,这将大量小文件移动到HDFS。在实际操作中,我们可能会面临NameNode内存以及MapReduce执行时间慢等问题,将文件或数据聚合在一起可以缓解此类问题,这是一个需要考虑的功能。

数据格式转换

数据格式转换将一种数据转换为另一种格式的操作。通常,源数据格式不适合在MapReduce等工具中进行处理。例如,如果源数据采用多行XML或JSON格式,则可能需要考虑预处理步骤。这会将数据转换为可以拆分的形式,例如每行一个JSON或XML元素,或者将其转换为Avro等格式。

数据压缩

数据压缩不仅有助于减少静态数据的占用空间,而且在读取和写入数据时也具有I/O优势。

可用性和可恢复性

可恢复性允许入口或出口工具在操作失败时重试。由于任何数据源,接收器或Hadoop本身都不可能100%可用,因此在发生故障时可重试非常重要。

可靠的数据传输和数据验证

在数据传输中,检查正确性的方法是验证数据在传输过程中是否发生损坏。当使用异构系统(如Hadoop数据入口和出口)时,数据通过不同主机,网络和协议传输只会增加数据传输过程中出现问题的可能性。检查原始数据(如存储设备)正确性的常用方法是循环冗余校验(CRC),这是HDFS内部用于维护块级完整性的常用方法。

此外,由于生成数据的软件存在错误,源数据本身可能存在问题。在入口时执行数据验证允许进行一次性检查,而不是在发生问题时处理数据的所有下游消费者,强迫这些消费者必须更新以处理数据中的错误。

资源消耗和性能

资源消耗和性能分别是系统资源利用率和系统效率的度量。入口和出口工具通常不会对系统施加大量负载(资源消耗),除非有非常可观的数据量。对于性能,要考虑的问题包括工具是否并行执行操作,如果是,提供了什么机制来调整并行度。如果数据源是生产数据库并且正在使用MapReduce提取该数据,请不要使用大量并发map任务来导入数据。

监控

监控确保功能在自动化系统中按预期执行。对于数据入口和出口,监控分为两部分:确保入口和出口中涉及的进程存活,并验证源和目标数据是否按预期生成。监控还应包括验证正在移动的数据量是否达到预期水平; 数据中意外的下降或高电流将提醒潜在的系统问题或软件错误。

推测执行

MapReduce具有一个称为推测(Speculative)执行的功能,可以在作业结束时为仍在执行的任务启动备份,这有助于防止缓慢的硬件影响作业执行时间。但是,这种做法也可能有问题,如果使用map任务执行插入关系数据库,你应该知道可以有两个并行进程插入相同的数据。

补充:推测执行(Speculative Execution)是指在集群环境下运行MapReduce,可能是程序Bug,负载不均或者其他的一些问题,导致在一个JOB下的多个TASK速度不一致,比如有的任务已经完成,有的却只跑了10%,根据木桶原理,这些任务将成为整个JOB的短板,如果集群启动了推测执行,这时为了最大限度的提高短板,Hadoop会为该task启动备份任务,让speculative task与原始task同时处理一份数据,哪个先运行完,则将哪个结果作为最终结果,并且在运行完成后Kill掉另外一个任务。

5.2 将数据移入Hadoop

在Hadoop中处理数据的第一步是将其提供给Hadoop。有两种主要方法可用于将数据移入Hadoop:在HDFS层(数据推送)写入外部数据,或在MapReduce层读取外部数据(更像是拉取)。在MapReduce中读取数据具有以下优点:操作可以轻松并行并具有容错能力。然而,并非所有数据都可以使用MapReduce访问,例如在日志文件下,其他系统需要依赖传输,包括用于最终数据hop的HDFS。

本节,我们将介绍将源数据移动到Hadoop的方法,将使用上一节中的设计注意事项作为检查和理解不同工具的标准。

5.2.1 HDFS命令行

Hadoop捆绑了许多方法来将数据导入HDFS。本节将介绍这些内置工具如何满足数据移动中的各种需求,可以使用的第一个也是最简单的工具是HDFS命令行。

为作业选择正确的数据获取工具

本节中的低级工具适用于一次性文件移动,或者处理基于文件的旧数据源和目标。但是,以这种方式移动数据很轻易就会被Flume和Kafka(本章稍后介绍)等工具所淘汰,这些工具提供了自动数据移动管道。

注:Kafka是一个更好的平台,用于从A到B(B可以是Hadoop集群)移动数据,而不是老式的“复制文件”。使用Kafka,只需将数据泵入其中,就拥有了实时(例如通过Storm)或离线/批量作业(例如通过Camus)消费数据。这种方法将在之后的章节中介绍。

使用CLI加载文件

如果需要手动执行,那么HDFS命令行界面(CLI)就是最合适的工具。它允许执行在常规Linux文件系统上可执行的大多数操作。本节,我们将重点介绍如何将数据从本地文件系统复制到HDFS中。

问题

使用shell将文件复制到HDFS。

解决方案

HDFS命令行界面可用于一次性移动,或者可以将其合并到脚本中以进行一系列移动。

讨论

使用hadoop命令将文件从本地磁盘复制到HDFS:

$ hadoop fs -put local-file.txt hdfs-file.txt 

Hadoop -put命令的行为与Linux中的Linux cp命令不同,如果目标已存在,则会被覆盖; 在Hadoop中,副本失败并显示错误:

put: `hdfs-file.txt': File exists 

必须添加-f选项以强制覆盖文件:

$ hadoop fs -put -f local-file.txt hdfs-file.txt 

与Linux cp命令非常相似,可以使用相同的命令复制多个文件。在这种情况下,最后一个参数必须是HDFS中复制本地文件的目录:

$ hadoop fs -put local-file1.txt local-file2.txt /hdfs/dest/ 

可以使用Linux管道将命令输出传递到HDFS文件——使用相同的-put命令并在其后添加单独的连字符,这告诉Hadoop从标准输入读取:

阅读延展

1
3