我在本地有一个文件a.txt,我想将该文件移动到hadoop文件系统(HDFS),如下所示,
hadoop fs -put a.txt / user / hive / warehouse / sample_db / sample_table /
当文件a.txt从本地移动到Hadoop位置时,后台发生了什么?
答案 0 :(得分:6)
在后台,源文件被拆分为HDFS块,其大小可配置(通常为128 MB,默认为64 MB)。对于容错,每个块都由HDFS自动复制。默认情况下,每个块的三个副本将写入三个不同的DataNode。复制因子是用户可配置的(默认为3)。 DataNode是服务器,它们是物理机或虚拟机/云实例。 DataNodes构成了Hadoop集群,您可以在其中编写数据并运行MapReduce / Hive / Pig / Impala / Mahout /等。程序
DataNodes是Hadoop集群的工作者,NameNodes是主人。
当要将文件写入HDFS时,写入文件的客户端从NameNode获取可以托管文件第一个块的副本的DataNode列表。
客户端安排一个管道,通过该管道,源文件的第一个块的所有数据字节将被传输到所有参与的DataNode。管道从客户端到第一个DataNode到第二个DataNode到最终(在我们的例子中为第三个)DataNode。数据被分成用于传输的分组,并且跟踪每个分组直到所有DataNode返回acks以指示数据的成功复制。数据包将流式传输到管道中的第一个DataNode,后者存储数据包并将其转发到第二个DataNode,依此类推。如果一个或多个复制失败,基础结构将自动构建新管道并重试该副本。
当所有三个DataNode确认复制成功时,客户端将前进到下一个块,再次从NameNode请求主机DataNode列表,并构建新管道。遵循此过程,直到所有块都已复制到HDFS中。写入的最后一个块可能小于配置的块大小,但是从第一个块到倒数第二个块的所有块都将具有已配置的块大小。
参考:Hadoop:汤姆怀特的权威指南。
答案 1 :(得分:1)
Hadoop fs -put
不会将文件从本地移动到hadoop,只是将文件复制到HDFS。
当您触发hadoop fs -put
命令时,hadoop以块的形式将该文件复制到datanode,并从hadoop配置中选择块的大小。
您可以使用 hadoop -D 选项指定复制文件时的块大小,您可以从中指定该特定复制语句的hadoop属性。