【问题标题】:Hadoop - How to run another mapreduce job while one is running?Hadoop - 如何在运行时运行另一个 mapreduce 作业?
【发布时间】:2019-03-26 09:21:43
【问题描述】:

我的集群上已经有一个耗时的 map reduce 作业正在运行。当我提交另一个作业时,它卡在以下点,这表明它正在等待当前正在运行的作业完成:

hive> select distinct(circle) from vf_final_table_orc_format1;
Query ID = hduser_20181022153503_335ffd89-1528-49be-b091-21213d702a03
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 10
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1539782606189_0033, Tracking URL = http://secondary:8088/proxy/application_1539782606189_0033/
Kill Command = /home/hduser/hadoop/bin/hadoop job  -kill job_1539782606189_0033

我目前正在对 166GB 的数据运行 mapreduce 作业。我的设置包括7 nodes,其中5DN with 32GB RAM8.7TB HDD,而1 NN1 SN32 GB RAM1.1TB HDD

为了并行执行作业,我需要调整哪些设置?我目前正在使用hadoop 2.5.2 version.

编辑:现在我的集群在每个节点的 32 GB 中仅消耗 8-10 GB 的 RAM。其他 HIVE 查询,MR 作业被卡住并等待单个作业完成。如何增加内存消耗以促进更多作业并行执行。这是ps 命令的当前输出:

[hduser@secondary ~]$ ps -ef | grep -i runjar | grep -v grep
hduser   110398      1  0 Nov11 ?        00:07:15 /opt/jdk1.8.0_77//bin/java -Dproc_jar -Xmx1000m 
-Dhadoop.log.dir=/home/hduser/hadoop/logs -Dyarn.log.dir=/home/hduser/hadoop/logs 
-Dhadoop.log.file=yarn.log -Dyarn.log.file=yarn.log -Dyarn.home.dir= 
-Dyarn.id.str= -Dhadoop.root.logger=INFO,console -Dyarn.root.logger=INFO,console -Dyarn.policy.file=hadoop-policy.xml
-Dhadoop.log.dir=/home/hduser/hadoop/logs -Dyarn.log.dir=/home/hduser/hadoop/logs 
-Dhadoop.log.file=yarn.log -Dyarn.log.file=yarn.log 
-Dyarn.home.dir=/home/hduser/hadoop -Dhadoop.home.dir=/home/hduser/hadoop 
-Dhadoop.root.logger=INFO,console 
-Dyarn.root.logger=INFO,console 
-classpath /home/hduser/hadoop/etc/hadoop:/home/hduser/hadoop/etc/hadoop:/home/hduser/hadoop/etc/hadoop:/home/hduser/hadoop/share/hadoop/common/lib/*:/home/hduser/hadoop/share/hadoop/common/*:/home/hduser/hadoop/share/hadoop/hdfs:/home/hduser/hadoop/share/hadoop/hdfs/lib/*:/home/hduser/hadoop/share/hadoop/hdfs/*:/home/hduser/hadoop/share/hadoop/yarn/lib/*:/home/hduser/hadoop/share/hadoop/yarn/*:/home/hduser/hadoop/share/hadoop/mapreduce/lib/*:/home/hduser/hadoop/share/hadoop/mapreduce/*:/home/hduser/hadoop/contrib/capacity-scheduler/*.jar:/home/hduser/hadoop/share/hadoop/yarn/*:/home/hduser/hadoop/share/hadoop/yarn/lib/* 
org.apache.hadoop.util.RunJar abc.jar def.mydriver2 /raw_data /mr_output/

【问题讨论】:

    标签: hadoop hive mapreduce hadoop-yarn hadoop2


    【解决方案1】:

    步骤

    Hive 分阶段运行查询计划。 某些阶段依赖于其他阶段,并且在前一个阶段完成之前无法开始。

    但是,其他一些阶段可以与其他阶段同时运行。让阶段并行运行可以节省整体作业运行时间。 要启用阶段的并行执行,请执行以下操作:

    set hive.exec.parallel=true;
    set hive.exec.parallel.thread.number=8;
    

    并行执行会增加集群利用率。 如果集群的利用率已经很高,那么并行执行对整体性能的帮助不大。

    如果这有帮助,请告诉我。

    【讨论】:

    • 即使是简单的select * from tablename 也在等待另一个作业完成后再开始执行。我想需要进行一些集群利用率优化,因为我的集群在所有 DN 和 NN 上有 32 GB RAM,在 DN 上有 8.7TB 硬盘,在 NN 上有 1.1TB 硬盘。
    • 在没有where 子句的情况下执行select * from tablename 在大数据中绝不是一个好主意。它会尝试获取正确占用空间的所有行和所有列。尝试在查询中添加一些过滤器,然后并行执行 1 个以上的查询。
    • 即使我在查询中使用limit 10,它也在等待其他作业完成后再开始执行。
    • 请在您的查询中使用过滤器,例如where col=5。另外,您是否设置了属性set hive.exec.parallel=true;
    • 我已经在hive-site.xml 中设置了这个属性。我将对此进行测试并回复您。但是,这似乎是一个配置单元属性,我面临的问题是,在通过 java mapreduce jar 在大型数据集上提交作业后,其他作业(HIVE queries) 正在等待它在开始之前完成。我想我需要调整 YARN 配置中的一些设置,以允许它消耗更多 RAM 来并行启动进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2013-01-16
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多