当前位置: 首页 > 知识库问答 >
问题:

非HDFS文件系统上的Hadoop/Yarn和任务并行化

秦珂
2023-03-14

我实例化了一个Hadoop2.4.1集群,并且发现运行的MapReduce应用程序的并行化程度将不同,这取决于输入数据所在的文件系统类型。

使用HDFS,MapReduce作业将生成足够的容器,以最大限度地利用所有可用内存。例如,一个具有172GB内存的3节点集群,每个map任务分配2GB,将创建大约86个应用程序容器。

在不是HDFS的文件系统上(比如NFS或在我的用例中是并行文件系统),MapReduce作业将只分配可用任务的子集(例如,对于相同的3节点集群,大约创建25-40个容器)。因为我使用的是并行文件系统,所以我并不关心使用NFS时会遇到的瓶颈。

是否有一个纱(yarn-site.xml)或MapReduce(mapred-site.xml)配置允许我有效地最大化资源利用率?

共有1个答案

江阳羽
2023-03-14

这取决于文件系统。

locality的工作方式是,必须在Hadoop文件系统接口内部实现给定文件的getBlockLocations。例如,您可以看到:

下面是来自glusterfs-hadoop文件系统实现的示例实现:

public BlockLocation[] getFileBlockLocations(FileStatus file,long start,long len) throws IOException{
    File f=pathToFile(file.getPath());
    BlockLocation[] result=null;

    result=attr.getPathInfo(f.getPath(), start, len);
    if(result==null){
        log.info("Problem getting destination host for file "+f.getPath());
        return null;
    }

    return result;
}

在优化时,请记住,每个输入拆分都是最终提供给映射器的。

在HDFS中,默认值往往比其他文件系统调优得更好。

通过在hadoop兼容的文件系统中实现更细粒度的阻塞(getBlockLocations),您可以增加块的数量,也可以增加这些块的复制。

此外,您还可以在运行时切换输入拆分的数量(最大值和最小值),作为mapreduce作业参数的一部分。通过更新该值,您可能会提高性能(即机器的使用),但也可能会降低本地性(更多的拆分意味着,如果某些机器本身就更快,mapreduce可能会将拆分流式传送到非本地机器,这可能会占用大量任务。)

 类似资料:
  • 从Hadoop 1.2.1的文件系统Shell中,它显示: FS shell由以下人员调用:

  • 问题内容: 我正在将大量数据存储到hdfs中。我需要将文件从一个文件夹移动到另一个文件夹。 请问一般来说,文件系统重命名方法的成本是多少?假设我必须移动TB的数据。 非常感谢你。 问题答案: 在HDFS或任何文件系统(如果实施得当)中移动文件涉及对名称空间的更改,而不涉及实际数据的移动。遍历代码仅完成“名称”节点中名称空间(内存和编辑日志)的更改。 从NameNode.java类 NameNode

  • 我们的Hadoop集群上的空间用完,该集群是以以下方式设置的: null 将系统分区作为HDFS数据目录添加到DataNode配置是否安全? 恐怕Hadoop会填满分区,使系统无法使用。 最好的方法可能是设置、分离lvm卷或重新分区磁盘。但我会避免走这条路。

  • Hadoop分布式文件系统(HDFS)的设计主旨,在于对超大规模数据集提供可靠的存储功能,并对用户应用程序提供高带宽的输入输出数据流。在大型的集群里,上千台服务器均可直接参与到数据存储和应用程序任务执行。通过多服务器,分布式的存储和计算,计算资源的规模能够按照需要增长,并兼顾在各种规模上经济适用性。 本文主要描述了HDFS的架构,并以Yahoo!企业数据服务为例,介绍了如何使用HDFS系统管理高达

  • 我需要从本地文件系统复制一个文件夹到HDFS。我找不到任何例子移动文件夹(包括它的所有子文件夹)到HDFS

  • 执行任务事件 function onTask(\swoole_server $server, $taskId, $workerId,$callBackObj); 在task_worker进程内被调用,可以用以下方法向task_worker进程投递新的任务 AsyncTaskManager::getInstance()->add(Runner::class); 当前的Task进程在调用onTask回