在中小型企业中,我们一般配置为容量调度器
请先检查本地host配置
127.0.0.1 datanode
127.0.0.1 namenode
127.0.0.1 resourcemanager
127.0.0.1 nodemanager
127.0.0.1 nodemanager2
127.0.0.1 historyserver
1.容器调度器配置多队列
需求 1:default 队列占总内存的40%,最大资源容量占总资源60%,hive 队列占总内存
的60%,最大资源容量占总资源80%。
需求 2:配置队列优先级
多队列配置需要/opt/hadoop-3.2.1/etc/hadoop/capacity-scheduler.xml,我们先将容器中该文件拷贝出来
docker cp fd7a9150237:/opt/hadoop-3.2.1/etc/hadoop/capacity-scheduler.xml .
对于docker-compose.yml中所有容器进行挂载
volumes:
- ./capacity-scheduler.xml:/opt/hadoop-3.2.1/etc/hadoop/capacity-scheduler.xml
同时我们对nodemanager映射端口8042,historyserver映射端口8188,并且新增1个nodemanager节点【笔者执行WordCount时单节点资源不够导致mapreduce无法进行】
nodemanager:
ports:
- 8042:8042
nodemanager2:
image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
container_name: nodemanager2
hostname: nodemanager2
ports:
- 8043:8042
environment:
SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
volumes:
- ./capacity-scheduler.xml:/opt/hadoop-3.2.1/etc/hadoop/capacity-scheduler.xml
env_file:
- ./hadoop.env
historyserver:
ports:
- 8188:8188
【修改】capacity-scheduler.xml中配置
<!-- 指定多队列,增加 hive 队列 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,hive</value>
</property>
<!-- 降低 default 队列资源额定容量为 40%,默认 100% -->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>40</value>
</property>
<!-- 降低 default 队列资源最大容量为 60%,默认 100% -->
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>60</value>
</property>
【新增】capacity-scheduler.xml中配置
<!-- 指定 hive 队列的资源额定容量 -->
<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>60</value>
</property>
<!-- 用户最多可以使用队列多少资源,1 表示 -->
<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
</property>
<!-- 指定 hive 队列的资源最大容量 -->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
</property>
<!-- 启动 hive 队列 -->
<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
</property>
<!-- 哪些用户有权向队列提交作业 -->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
</property>
<!-- 哪些用户有权操作队列,管理员权限(查看/杀死) -->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
</property>
<!-- 哪些用户有权配置提交任务优先级 -->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
</property>
<!-- 如果 application 指定了超时时间,则提交到该队列的 application 能够指定的最大超时
时间不能超过该值,-1不超时 -->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
<value>-1</value>
</property>
<!-- 如果 application 没指定超时时间,则用 default-application-lifetime 作为默认
值 -->
<property>
<name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
<value>-1</value>
</property>
【修改】hadoop.env文件,根据情况相应调整
MAPRED_CONF_mapred_child_java_opts=-Xmx1024m
MAPRED_CONF_mapreduce_map_memory_mb=2048
MAPRED_CONF_mapreduce_reduce_memory_mb=2048
MAPRED_CONF_mapreduce_map_java_opts=-Xmx1024m
MAPRED_CONF_mapreduce_reduce_java_opts=-Xmx2048m
配置好后,再次执行docker-compose up -d
会recreate容器
访问http://resourcemanager:8088/cluster/scheduler后可以看到hive队列已出现
2.向hive队列中提交任务
hadoop jar /opt/hadoop-3.2.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount -D mapreduce.job.queuename=hive /shenjian/input /shenjian/output
当然我们也可以通过在WordCountDriver中配置
conf.set("mapreduce.job.queuename", "hive");
一会可以在FINSHED中看到完成信息,如下图所示
点击ID,可以点击LOGS查看具体日志信息,当然失败时会有不同的文件生成,点击查看错误日志即可
3.任务优先级设置
在hadoop.env中配置
// 任务最高优先级为5
YARN_CONF_yarn_cluster_max___application___priority=5
提交优先级高的任务
hadoop jar /opt/hadoop-3.2.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar pi -D mapreduce.job.priority=5 5 2000000
也可以通过以下命令修改正在执行的任务的优先级
yarn application -appID <Application ID> -updatePriority 优先级