概要

当我从 hive 中的表查询运行简单的select count(*)时,大型集群中只有两个节点用于映射。我想使用整个集群。

细节

我正在使用运行hdfs和Hive 1.2.1(IBM-12)的较大群集(每个节点有20个以上的200 GB内存)。

我有一个数十亿行的表。当我执行一个简单的

select count(*) from mytable;

配置单元创建了数百个 map task ,但是只有四个同时运行。

这意味着查询期间我的集群大部分处于空闲状态,这似乎很浪费。我尝试过对正在使用的节点进行ssh'ing,但它们并未充分利用CPU或内存。我们的集群由Infiniband网络和Isilon文件存储作为后盾,这两个文件似乎都没有加载。

我们正在使用mapreduce作为引擎。我尝试消除对我可以找到的资源的任何限制,但是这并没有改变仅使用两个节点(4个并发映射器)的事实。

内存设置如下:
yarn.nodemanager.resource.memory-mb     188928  MB
yarn.scheduler.minimum-allocation-mb    20992   MB
yarn.scheduler.maximum-allocation-mb    188928  MB
yarn.app.mapreduce.am.resource.mb       20992   MB
mapreduce.map.memory.mb                 20992   MB
mapreduce.reduce.memory.mb              20992   MB

并且我们在41个节点上运行。根据我的计算,我应该能够获得41 * 188928/20992 = 369个map / reduce任务。相反,我得到4。

Vcore设置:
yarn.nodemanager.resource.cpu-vcores       24
yarn.scheduler.minimum-allocation-vcores   1
yarn.scheduler.maximum-allocation-vcores   24
yarn.app.mapreduce.am.resource.cpu-vcores  1
mapreduce.map.cpu.vcores                   1
mapreduce.reduce.cpu.vcores                1
  • 是否有办法使hive / mapreduce使用更多群集?
  • 如何解决瓶颈?
  • 可能是Yarn没有足够快地分配任务吗?

  • 我猜想使用tez可以提高性能,但是我仍然对为什么资源利用率如此有限(并且我们没有在ATM上安装它)感兴趣。

    最佳答案

    运行并行任务取决于 yarn 中的内存设置
    例如,如果您有4个数据节点,并且 yarn 存储属性定义如下

    yarn.nodemanager.resource.memory-mb 1 GB
    yarn.scheduler.minimum-allocation-mb    1 GB
    yarn.scheduler.maximum-allocation-mb    1 GB
    yarn.app.mapreduce.am.resource.mb   1 GB
    mapreduce.map.memory.mb 1 GB
    mapreduce.reduce.memory.mb  1 GB
    

    根据此设置,您有4个数据节点,因此 yarn.nodemanager.resource.memory-mb 总数将是4 GB,可用于启动容器
    由于容器可以占用1 GB的内存,因此这意味着在任何给定的时间点您可以启动4个容器,应用程序主节点将使用一个容器,因此自应用程序以来的任何给定时间点最多可以有3个mapper或reducer任务主机,映射器和 reducer 均使用1 GB内存

    因此,您需要增加 yarn.nodemanager.resource.memory-mb 来增加映射/ reduce task 的数量

    附言-在这里,我们正在考虑可以启动的最大任务数,可能比这还少

    关于hadoop - 如何将Hive并发映射器增加到4个以上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43370134/

    10-16 03:30