当我从hive中的表查询运行一个简单的select count(*)时,我的大型集群中只有两个节点用于映射。我想使用整个集群。
我正在使用一个运行hdfs和Hive 1.2.1(IBM-12)的稍大的集群(每个超过200 GB RAM的数十个节点)。
我有几十亿行的表。当我表演一个简单的
select count(*) from mytable;
hive创建了数百个map任务,但只有4个同时运行。
这意味着我的群集在查询期间大部分处于空闲状态,这看起来很浪费。我已经尝试过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。
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)感兴趣。
答案 0 :(得分:0)
运行并行任务取决于您在纱线中的记忆设置 例如,如果您有4个数据节点,并且您的纱线存储器属性定义如下
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个映射器或减速器任务master,mapper和reducer各使用1 GB内存
所以你需要增加 yarn.nodemanager.resource.memory-mb 来增加map / reduce任务的数量
P.S。 - 这里我们正在考虑可以启动的最大任务,它可能比这还要少