- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
例如,我在 HDFS 中有一个 1 Gb 的文件,例如
2018-10-10 12:30
EVENT INFORMATION
2018-10-10 12:35
ANOTHER EVENT INFORMATION
...
所以我需要使用 NLineInputFormat
(N = 2),对吗?
问题是关于更多的概念性原则。这个 1 Gb 文件何时何地转换为 InputSplits
? hadoop如何处理不同的拆分逻辑?它是否需要解析整个文件以创建拆分(因为我们需要遍历文件以逐行计数)?
这个文件在HDFS(1024/128)中分为8个 block 。因此,当我提交作业时,hadoop 在每个节点上使用此文件的 block (使用默认拆分大小)启动映射器。
如果我的文件分割不整齐会怎样?喜欢
<block1>
...
2018-10-10 12:
</block1>
<block2>
40
EVENT INFORMATION
...
</block2>
第一个映射器如何知道位于另一个数据节点上的剩余部分?
如果拆分大小 = 1/2 block 大小会怎样?还是 4/5 block 大小?应用程序主机如何知道应该选择哪个节点来运行拆分?
能否请您说清楚并给我一些链接以更深入地了解它?
最佳答案
数据的划分(将File划分为Block),这是物理上真正的划分
Split和HDFS Block是一对多的关系;
HDFS block是数据的物理表示,Split是block中数据的逻辑表示。
在数据局部性的情况下,程序也会从远程节点读取少量数据,因为行被切割到不同的Block。
当你读取一个文件时,它是这样的
客户端通过调用FileSystem对象的open()方法打开文件(对应HDFS文件系统,调用DistributedFileSystem对象)(即图中第一步)。 DistributedFileSystem通过RPC(Remote Procedure Call)调用调用NameNode来获取这个。文件前几个 block 的文件位置(第 2 步)。对于每一个block,namenode返回所有拥有这个block备份的namenode的地址信息(在集群的拓扑网络中按照距离client的远近排序,Hadoop集群中如何进行网络拓扑见下文) .
If the client itself is a datanode (if the client is a mapreduce task) and the datanode itself has the required file block, the client reads the file locally.
以上步骤完成后,DistributedFileSystem会返回一个FSDataInputStream(支持文件查找),客户端可以从FSDataInputStream中读取数据。 FSDataInputStream 包装了一个 DFSInputSteam 类,该类处理名称节点和数据节点的 I/O 操作。
然后client执行read()方法(第3步),DFSInputStream(里面已经存储了要读取的文件前几 block 的位置信息)连接到第一个datanode(也就是最近的datanode) ) 获取数据。通过反复调用read()方法(第四步和第五步),将文件中的数据流式传输到客户端。当读取到 block 的末尾时,DFSInputStream 关闭指向该 block 的流,转而查找下一个 block 的位置信息,然后重复调用 read() 方法继续流式传输该 block 。
这些过程对用户来说是透明的,在用户看来这是一个不间断的流式传输整个文件。
当整个文件被读取时,客户端调用 FSDataInputSteam 中的 close() 方法关闭文件输入流(第 6 步)。
关于hadoop - split 发生在何时何地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53207837/
我有使用 namespace 的代码,其中有一些,我的大脑有些困惑。 如果我有类似的东西: #include protected: vector mRegistryList; 编译器提示 v
是否有好的算法/分词器/正则表达式或其他一些技术可以检测用户输入的英语句子的哪一部分是“谁”、“什么”、“何时”和“哪里”? 理想情况下,它可以在 Elasticsearch 或 javascript
我因使用 uint 而不是 size_t 而受到很多批评,但每次我检查我正在使用的工具链时都会发现 size_t 被定义为一个 uint。 是否有任何编译器实现中 size_t 实际上不是 uint?
在使用 MongoDB 的应用程序中,何时/何地是进行关系数据库中迁移的数据库更改的最佳位置? 比如创建索引或者设置shard key应该如何管理?这段代码应该去哪里? 最佳答案 最好有意识地在 sh
我是一名优秀的程序员,十分优秀!