目录
环境变量过多或者参数值过长时,为什么提交作业失败?
为什么Shell作业状态和相关的YARN Application状态不一致?
创建作业和执行计划的区别是什么?
如何查看作业运行记录?
如何在OSS上查看日志?
读写MaxCompute时,报错java.lang.RuntimeException.Parse response failed: ‘…’
多个ConsumerID消费同一个Topic时为什么TPS不一致?
E-MapReduce中是否可以查看Worker上的作业日志?
为什么Spark Streaming作业已经结束,但是E-MapReduce控制台显示作业还处于“运行中”状态?
报错“Error: Could not find or load main class”
如何在MR作业中使用本地共享库?
如何在MR或Spark作业中指定OSS数据源文件路径?
如何查看E-MapReduce服务的日志?
报错"No space left on device"
访问OSS或LogService时报错ConnectTimeoutException或ConnectionException
如何清理已经完成作业的日志数据?
为什么AppMaster调度启动Task的时间过长?
E-MapReduce是否提供实时计算的功能?
作业参数传递至脚本文件该如何处理?
如何使用阿里云E-MapReduce HDFS的Balancer功能以及参数调优?
如果E-MapReduce控制台上没有自定义配置选项,该如何处理?
使用数据开发提交的作业一直处于Submit状态,该如何处理?
作业长时间处于等待状态,如何处理?
Map端是否读取了小文件?
Reduce Task任务耗时,是否出现了数据倾斜?
如何预估Hive作业并发量的上限值?
为什么Hive创建的外部表没有数据?
在哪里可以查看Spark历史作业?
是否支持Standalone模式提交Spark作业?
如何减少Spark2命令行工具的日志输出?
如何使用Spark3的小文件合并功能?
如何处理SparkSQL数据倾斜?
如何指定PySpark使用Python 3版本?
临时生效方式
永久生效方式
为什么Spark Streaming作业运行一段时间后无故结束?
为什么Spark Streaming作业已经结束,但是E-MapReduce控制台显示作业状态还处于“运行中”?
导入RDS数据至EMR时,时间字段显示延迟8小时如何处理?
Message: FailedReason:FailedReason:[[JOB_ENGINE][JOB_ENGINE_START_JOB_FAILED/ERR-200001] Failed to execute job: [FJ-xxxx]].
在E-MapReduce中创建作业,实际只是创建了作业如何运行的配置,该配置中包括该作业要运行的JAR包、数据的输入输出地址以及一些运行参数。该配置创建好后,给它命名即定义了一个作业。
提交作业后,您可以通过数据开发控制台或YARN UI方式查看作业运行记录。
该方式适用于通过控制台方式创建并提交作业的场景。
该方式适用于通过控制台方式和命令行方式创建并提交作业的场景。
java.lang.RuntimeException.Parse response failed: ‘…’
有可能这个Topic在公测或其他环境创建过,导致某些Consumer组消费数据不一致。
可以。您可以通过YARN UI的方式查看Worker上的日志,详细信息请参见YARN UI方式。
“Error: Could not find or load main class”
检查作业配置中作业JAR包的路径协议头是否是ossref
,如果不是请改为ossref
。
您可以在 阿里云E-MapReduce控制台,YARN服务的 配置页面,修改 mapred-site.xml页签如下参数。
mapred.child.java.opts
-Xmx1024m -Djava.library.path=/usr/local/share/
mapreduce.admin.user.env
LD_LIBRARY_PATH=$HADOOP_COMMON_HOME/lib/native:/usr/local/lib
您可以在作业中指定输入输出数据源时使用OSS URL: oss://[accessKeyId:accessKeySecret@]bucket[.endpoint]/object/path
形式,类似hdfs://
。
您在操作OSS数据时:
登录Master节点在/mnt/disk1/log中查看对应服务的日志。
"No space left on device"
select * from tbl limit 10
可以正常运行,但是执行 Hive SQL: select count(1) from tbl
时报错。修改OSS Endpoint地址为内网地址。 alter table tbl set location "oss://bucket.oss-cn-hangzhou-internal.aliyuncs.com/xxx"
alter table tbl partition (pt = 'xxxx-xx-xx') set location "oss://bucket.oss-cn-hangzhou-internal.aliyuncs.com/xxx"
E-MapReduce提供Spark Streaming、Storm和Flink三种实时计算服务。
在Hive作业中,您可以通过 -hivevar
选项,传递作业中配置的参数至脚本中。
${varname}
(例如 ${rating}
)。本示例中脚本的相关信息如下:
use default;
drop table demo;
create table demo (userid int, username string, rating int);
insert into demo values(100,"john",3),(200,"tom",4);
select * from demo where rating=${rating};
本示例执行结果如下。
su hdfs
/usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 10
less /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
tailf /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
说明 当提示信息包含 Successfully
字样时,表示执行成功。
参数 | 描述 |
---|---|
Threshold | 默认值为10%,表示上下浮动10%。 当集群总使用率较高时,需要调小Threshold,避免阈值过高。 当集群新增节点较多时,您可以适当增加Threshold,使数据从高使用率节点移向低使用率节点。 |
dfs.datanode.balance.max.concurrent.moves | 默认值为5。 指定DataNode节点并发移动的最大个数。通常考虑和磁盘数匹配,推荐在DataNode端设置为 28*4 。具体使用时根据集群负载适当调整。在负载较低时,增加concurrent数;在负载较高时,减少concurrent数。 说明 DataNode端需要重启来刷新配置。 |
dfs.balancer.dispatcherThreads | Balancer在移动Block之前,每次迭代时查询出一个Block列表,分发给Mover线程使用。 说明 dispatcherThreads是该分发线程的个数,默认为200。 |
dfs.balancer.rpc.per.sec | 默认值为20,即每秒发送的rpc数量为20。 因为分发线程调用大量getBlocks的rpc查询,所以为了避免NameNode由于分发线程压力过大,需要控制分发线程rpc的发送速度。 例如,您可以在负载高的集群调整参数值,减小10或者5,对整体移动进度不会产生特别大的影响。 |
dfs.balancer.getBlocks.size | Balancer会在移动Block前,每次迭代时查询出一个Block列表,给Mover线程使用,默认Block列表中Block的大小为2GB。因为getBlocks过程会对RPC进行加锁,所以您可以根据NameNode压力进行调整。 |
dfs.balancer.moverThreads | 默认值为1000。 Balancer处理移动Block的线程数,每个Block移动时会使用一个线程。 |
dfs.namenode.balancer.request.standby | 默认值为false。 Balancer是否在Standby NameNode上查询要移动的Block。因为此类查询会对NameNode加锁,导致写文件时间较长,所以HA集群开启后只会在Standby NameNode上进行查询。 |
dfs.balancer.getBlocks.min-block-size | Balancer查询需要移动的参数时,对于较小Block(默认10 MB)移动效率较低,可以通过此参数过滤较小的Block,增加查询效率。 |
dfs.balancer.max-iteration-time | 默认值为1200000,单位毫秒。 Balancer一次迭代的最长时间,超过后将进入下一次迭代。 |
dfs.balancer.block-move.timeout | 默认值为0,单位毫秒。 Balancer在移动Block时,会出现由于个别数据块没有完成而导致迭代较长的情况,您可以通过此参数对移动长尾进行控制。 |
参数 | 描述 |
---|---|
dfs.datanode.balance.bandwidthPerSec | 指定DataNode用于Balancer的带宽,通常推荐设置为100 MB/s,您也可以通过dfsadmin -setBalancerBandwidth 参数进行适当调整,无需重启DataNode。 例如,在负载低时,增加Balancer的带宽。在负载高时,减少Balancer的带宽。 |
dfs.datanode.balance.max.concurrent.moves | 指定DataNode上同时用于Balancer待移动Block的最大线程个数。 |
cd /var/lib/ecm-agent/cache/ecm/service/HUE/4.4.0.3.1/package/templates/
本示例以 HUE
为例:
HUE
表示服务的目录。4.4.0.3.1
为Hue的版本。hue.ini
为配置文件。vim hue.ini
当配置项已存在时,您可以根据时间情况修改参数值。
出现此问题,通常是因为EMRFLOW中部分组件状态错误,您需要在控制台重启状态错误的组件。
您可以通过以下步骤定位问题:
可以看到有多个作业处于等待状态。
即可进入队列,您可以看一下当前队列的繁忙程度,来分析是因为队列中没有空闲资源,还是当前任务确实比较耗时。如果是队列资源紧张,您可以考虑切换到空闲队列,否则需要优化代码。
您可以通过以下步骤定位问题:
进入Map Task的详情页面,可以看到每个Map Task读取的数据量,如下图所示,读取的数据量是2个字节记录。如果大部分的Map Task读取的文件量都比较小,就需要考虑小文件合并。
您也可以通过查看Map Task的Log,获取更多的信息。
您可以通过以下步骤定位问题:
查看当前Reduce Task中Reduce Input bytes和Reduce shuffle bytes的信息,如果比其他的Task处理的数据量大很多,则说明出现了倾斜问题。
Hive作业并发量与HiveServer2的内存以及master实例个数有关系。您可以参考以下公式预估Hive作业并发量的上限值。
max_num = master_num * max(5, hive_server2_heapsize/512)
上述公式中涉及到的参数信息如下:
例如:集群有3个master实例,hive_server2_heapsize配置为4 GB,那么根据上述公式可以预估出Hive作业的并发量上限值为24,即可以同时运行24个脚本。
CREATE EXTERNAL TABLE storage_log(content STRING) PARTITIONED BY (ds STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 'oss://log-12453****/your-logs/airtake/pro/storage';
查询没有数据返回。 select * from storage_log;
alter table storage_log add partition(ds=123);
select * from storage_log;
返回如下数据。 OK
abcd 123
efgh 123
您可以在EMR控制台目标集群的访问链接与端口页签,单击Spark UI链接,即查看到Spark历史作业运行信息。访问UI详情,请参见访问链接与端口。
不支持。E-MapReduce支持使用Spark on YARN以及Spark on Kubernetes模式提交作业,不支持Standalone和Mesos模式。
EMR DataLake集群选择Spark2服务后,使用spark-sql和spark-shell等命令行工具时默认输出INFO级别日志,如果想减少日志输出,可以修改log4j日志级别。具体操作如下:
cp /etc/emr/spark-conf/log4j.properties /new/path/to/log4j.properties
log4j.rootCategory=WARN, console
重要 路径需要添加file:前缀。
您可以通过设置参数spark.sql.adaptive.merge.output.small.files.enabled为true,来自动合并小文件。由于合并后的文件会压缩,如果您觉得合并后的文件太小,可以适当调大参数spark.sql.adaptive.advisoryOutputFileSizeInBytes的值,默认值为256 MB。
select /*+ BROADCAST (table1) */ * from table1 join table2 on table1.id = table2.id
select * from table1_1 join table2 on table11.id = table2.id
union all
select /*+ BROADCAST (table1_2) */ * from table1_2 join table2 on table1_2.id = table2.id
select id, value, concat(id, (rand() * 10000) % 3) as new_id from A
select id, value, concat(id, suffix) as new_id
from (
select id, value, suffix
from B Lateral View explode(array(0, 1, 2)) tmp as suffix)
select t1.id, t1.id_rand, t2.name
from (
select id ,
case when id = null then concat(‘SkewData_’, cast(rand() as string))
else id end as id_rand
from test1
where statis_date = ‘20221130’) t1
left join test2 t2
on t1.id_rand = t2.id
下面内容以可选服务为Spark2,EMR-5.7.0版本的DataLake集群为例,介绍如何指定PySpark使用Python 3版本。
您可以通过以下两种方式修改Python的版本:
export PYSPARK_PYTHON=/usr/bin/python3
pyspark
当返回信息中包含如下信息时,表示已修改Python版本为Python 3。 Using Python version 3.6.8
source /etc/profile
pyspark
当返回信息中包含如下信息时,表示已修改Python版本为Python 3。 Using Python version 3.6.8
Spark 1.6之前版本存在内存泄漏的问题,会导致Container被中止掉。
检查作业提交方式是否为Yarn-Client模式,因为E-MapReduce对Yarn-Client模式的Spark Streaming作业的状态监控存在问题,所以请修改为Yarn-Cluster模式。
sqoop import \
--connect jdbc:mysql://rm-2ze****341.mysql.rds.aliyuncs.com:3306/s***o_sqoopp_db \
--username s***o \
--password ****** \
--table play_evolutions \
--target-dir /user/hadoop/output \
--delete-target-dir \
--direct \
--split-by id \
--fields-terminated-by '|' \
-m 1
查询结果显示,源数据的时间字段显示延迟8小时。
sqoop import \
--connect jdbc:mysql://rm-2ze****341.mysql.rds.aliyuncs.com:3306/s***o_sqoopp_db \
--username s***o \
--password ****** \
--table play_evolutions \
--target-dir /user/hadoop/output \
--delete-target-dir \
--split-by id \
--fields-terminated-by '|' \
-m 1
查询结果显示正常。