概要
当我从 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
我猜想使用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/