hadoop数据块和数据内容

k3bvogb1  于 2021-06-01  发布在  Hadoop
关注(0)|答案(3)|浏览(368)

hadoop将输入数据的内容分解成块,而不考虑内容。
正如一篇帖子所描述的:
hdfs不知道(也不关心)文件中存储了什么,所以原始文件不会按照我们人类理解的规则进行分割。例如,人类希望记录的边界——显示记录开始和结束位置的线条——得到尊重。
我不清楚的一点是,如果只根据数据大小而不考虑内容来分割数据,那么是否会对以后执行的查询的准确性产生影响?例如,一个经常出现的城市和每日温度列表的例子。一个城市可能在一个街区,而它的温度在其他地方,那么Map操作如何正确地查询信息。关于block和mr查询,我似乎缺少一些基本的东西。
任何帮助都将不胜感激。

dhxwm5r4

dhxwm5r41#

一个城市会在一个街区,而它的温度会在别的地方吗
这是完全可能的,是的。在本例中,记录边界跨越两个块,并且两个块都被收集。
准确度没有损失,但性能是,当然,在磁盘和网络io方面。当检测到一个块的结尾而没有到达inputsplit时,则读取下一个块。即使这个分割在下一个块的前几个字节内,它的字节流仍然被处理。

mqkwyuun

mqkwyuun2#

Lets get into basics of ext FileSystem(forget HDFS for timebeing). 
 1. In your Hardisk data is stored in form of track and sectors.  Now when a file is stored its not necessary the complete record will be saved in the same block(4kb) and it can span across blocks . 
 2. The Process which is reading the files, reads the block and find the record boundary (Record is a logical entity). A record is a logical entity
 3. The file saved into Hardisk as bytes has no understanding of record or file format. File format and records are logical entities. 

Apply the same logic on HDFS. 
 1. The block size is 128MB. 
 2. Just like ext filesystem HDFS has no clue of the record boundaries. 
 3. What Mappers do is logically find the record boundaries by 
    a. The mapper which reads fileOffset 0 starts reading from start of file, till it finds \n.
    b. All mapper which don't read a file from offset 0 will skip the bytes till they reach \n and then continue reading. The sequences of bytes till newline is ommited. Now this byte sequence can be a complete record or partial record and is consumed by other mapper.  
    c. Mappers will read the block they are supposed to and continue reading till they find \n which is present in other block and not on the block which is local to them.
    d. Except first mapper all other mapper read the block local to them and byte sequence from other block till they find \n.
aemubtdh

aemubtdh3#

见阿里,
数据块是由hadoop hdfs gateway在存储过程中决定的,这将基于hadoop版本1.x或2.x,并取决于文件的大小,您将文件从本地放置到hadoop gateway,稍后在-put命令之后,hadoop gateway将文件块拆分并存储到数据节点目录 /data/dfs/data/current/ (如果您在单个节点上运行,那么它在hadoop目录中)以blk的形式_ <job_process_id> 以及具有相同作业id名称和.meta扩展名的blk的元数据。
在hadoop1中数据块的大小是64mb,在hadoop2中它增加到128mb块大小,然后根据文件大小它按照我前面说的分割块,所以hadoophdfs中没有工具来控制这个东西,如果有什么,请让我知道!
在hadoop1中,我们简单地把一个文件放在集群中,就像下面所说的,如果文件大小是100mb,那又怎么样-

bin/hadoop fs -put <full-path of the input file till ext> </user/datanode/(target-dir)>

hadoop1gateway将文件分为两个块(64mb和36mb),hadoop2gateway将文件分为一个块,并根据您的配置顺序复制这些块。
如果您使用hadoop为map reduce作业放置jar,那么您可以在那里设置 org.apache.hadoop.mapreduce.Job 方法内部的javaMap器将reducer类转换为1,并在测试后为mr作业导出jar,如下所示。

//Setting the Results to Single Target File in Java File inside main method
job.setNumReduceTasks(1);

然后运行hadoop fs脚本,如下所示:

bin/hadoop jar <full class path of your jar file> <full class path of Main class inside jar> <input directory or file path> <give the output target directory>

如果您使用sqoop从rdbms引擎导入数据,那么您可以使用“-m1”来设置单个文件结果,但这与您的问题不同。
希望我的回答能让你对这个问题有一个大致的了解,谢谢。

相关问题