如何让每个映射器类在hadoop中读取同一个文件
在我的hadoop工作中,除了输入数据文件外,我希望每个映射器类(map方法)读取一个公共文件,并将其放入hdfs中。该文件将被读入每个映射器,并在每个映射器中保存内容。那么如何做到这一点呢?根据您的需要,有不同的方法:如何让每个映射器类在hadoop中读取同一个文件,hadoop,mapper,Hadoop,Mapper,在我的hadoop工作中,除了输入数据文件外,我希望每个映射器类(map方法)读取一个公共文件,并将其放入hdfs中。该文件将被读入每个映射器,并在每个映射器中保存内容。那么如何做到这一点呢?根据您的需要,有不同的方法: 在每个映射器中直接读取文件。只有当公共文件非常小时才建议这样做 用于在每个映射器中一次读取多个文件,然后执行所谓的映射侧连接。这两个文件将以相同的方式进行拆分和分区 在作业设置期间将文件添加到。该文件将存储在所有映射程序都可以访问的每个节点上 根据您的需要,有不同的方法:
- 在每个映射器中直接读取文件。只有当公共文件非常小时才建议这样做
- 用于在每个映射器中一次读取多个文件,然后执行所谓的映射侧连接。这两个文件将以相同的方式进行拆分和分区
- 在作业设置期间将文件添加到。该文件将存储在所有映射程序都可以访问的每个节点上
- 在每个映射器中直接读取文件。只有当公共文件非常小时才建议这样做
- 用于在每个映射器中一次读取多个文件,然后执行所谓的映射侧连接。这两个文件将以相同的方式进行拆分和分区
- 在作业设置期间将文件添加到。该文件将存储在所有映射程序都可以访问的每个节点上
DistributedCache
所有节点都将获得存储在此缓存中的文件的副本。此外,您需要指定在作业设置时(即在实际运行作业之前)要存储在缓存中的文件。在方法(1)中,您可以在工作的任何阶段从HDFS访问任何文件。请注意,对于普通文件,(1)比(3)慢。您好,@harpun:非常感谢。另一个问题是,您知道DistributedCache.getLocalCacheFiles和DistributedCache.getCacheFiles之间的区别吗。我正在编程实现它,使用:cacheFiles=DistributedCache.getLocalCacheFiles(job);URI=DistributedCache.getCacheFiles(作业);但是,cacheFiles必须为null,但URI可以指向hdfs中的my特定文件。DistributedCache
行为在本地模式和分布式模式下是不对称的。您需要在分布式模式下使用DistributedCache.getCacheFiles()。在代码中,您可以进行检查:if(getLocalCacheFiles())
返回null
,然后改用getCacheFiles()
。请将有关DistributedCache
使用的问题作为新问题与您的代码一起发布,因为它们超出了您最初问题的范围。试着搜索谷歌,首先,他们有很多相关的问题。你好,@harpun:我非常感谢你的回答!但我仍然有一些困惑的事情要说:1。我看到,分布式缓存告诉hdfs将副本文件发送到所有节点。这是否意味着每个节点都将获得一份副本?通过这样做,选项(1)和选项(3)@user205214有什么区别?是的,使用DistributedCache
所有节点都将获得存储在此缓存中的文件的副本。此外,您需要指定在作业设置时(即在实际运行作业之前)要存储在缓存中的文件。在方法(1)中,您可以在工作的任何阶段从HDFS访问任何文件。请注意,对于普通文件,(1)比(3)慢。您好,@harpun:非常感谢。另一个问题是,您知道DistributedCache.getLocalCacheFiles和DistributedCache.getCacheFiles之间的区别吗。我正在编程实现它,使用:cacheFiles=DistributedCache.getLocalCacheFiles(job);URI=DistributedCache.getCacheFiles(作业);但是,cacheFiles必须为null,但URI可以指向hdfs中的my特定文件。DistributedCache
行为在本地模式和分布式模式下是不对称的。您需要在分布式模式下使用DistributedCache.getCacheFiles()。在代码中,您可以进行检查:if(getLocalCacheFiles())
返回null
,然后改用getCacheFiles()
。请将有关DistributedCache
使用的问题作为新问题与您的代码一起发布,因为它们超出了您最初问题的范围。尝试搜索谷歌,首先,他们有很多相关的问题。