hadoop将输入数据的内容分解成块,而不考虑内容。
正如一篇帖子所描述的:
hdfs不知道(也不关心)文件中存储了什么,所以原始文件不会按照我们人类理解的规则进行分割。例如,人类希望记录的边界——显示记录开始和结束位置的线条——得到尊重。
我不清楚的一点是,如果只根据数据大小而不考虑内容来分割数据,那么是否会对以后执行的查询的准确性产生影响?例如,一个经常出现的城市和每日温度列表的例子。一个城市可能在一个街区,而它的温度在其他地方,那么Map操作如何正确地查询信息。关于block和mr查询,我似乎缺少一些基本的东西。
任何帮助都将不胜感激。
3条答案
按热度按时间dhxwm5r41#
一个城市会在一个街区,而它的温度会在别的地方吗
这是完全可能的,是的。在本例中,记录边界跨越两个块,并且两个块都被收集。
准确度没有损失,但性能是,当然,在磁盘和网络io方面。当检测到一个块的结尾而没有到达inputsplit时,则读取下一个块。即使这个分割在下一个块的前几个字节内,它的字节流仍然被处理。
mqkwyuun2#
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,那又怎么样-
hadoop1gateway将文件分为两个块(64mb和36mb),hadoop2gateway将文件分为一个块,并根据您的配置顺序复制这些块。
如果您使用hadoop为map reduce作业放置jar,那么您可以在那里设置
org.apache.hadoop.mapreduce.Job
方法内部的javaMap器将reducer类转换为1,并在测试后为mr作业导出jar,如下所示。然后运行hadoop fs脚本,如下所示:
如果您使用sqoop从rdbms引擎导入数据,那么您可以使用“-m1”来设置单个文件结果,但这与您的问题不同。
希望我的回答能让你对这个问题有一个大致的了解,谢谢。