文档

数据开发常见问题

更新时间:

本文汇总了数据开发时的常见问题。

环境变量过多或者参数值过长时,为什么提交作业失败?

  • 问题现象:提交作业时,报错信息如下。

    Message: FailedReason:FailedReason:[[JOB_ENGINE][JOB_ENGINE_START_JOB_FAILED/ERR-200001] Failed to execute job: [FJ-xxxx]].
  • 问题分析:数据开发系统存在单项目变量总数和长度限制。如果环境变量过多或者参数值过长(大于1024)都会导致提交作业失败。

  • 解决方案:如果确实存在大量需要编辑的变量,请分项目添加变量,确保单项目变量数和长度较小。

为什么Shell作业状态和相关的YARN Application状态不一致?

  • 问题现象:在数据开发页面编辑Shell作业类型,任意编写一个会拉起YARN Application的作业,例如hive -f xxx.sql。在YARN Application未结束前,单击作业终止按钮,此时数据开发作业状态为KILLED,但YARN Application仍然会继续运行,直到自然结束。

  • 问题分析:终止Shell作业时会给Shell进程发送终止信号,如果YARN Application的驱动程序和Shell进程不存在父子进程关系,则YARN Application不会随Shell进程的终止而终止。例如Hive、sqoop、spark-submit(cluster模式)均存在这种情况。

  • 解决方案:建议不要使用Shell类型作业开发Hive、Spark或Sqoop等作业,尽可能使用原生作业类型(例如,Hive、Spark或Sqoop等类型)进行开发,这些作业类型存在一定的关联机制,可以确保作业驱动程序本身和YARN Application状态的一致性。

创建作业和执行计划的区别是什么?

  • 创建作业

    在E-MapReduce中创建作业,实际只是创建了作业如何运行的配置,该配置中包括该作业要运行的JAR包、数据的输入输出地址以及一些运行参数。该配置创建好后,给它命名即定义了一个作业。

  • 执行计划

    执行计划是将作业与集群关联起来的一个纽带:

    • 可以把多个作业组合成一个作业序列。

    • 可以为作业准备一个运行集群(或者自动创建出一个临时集群或者关联一个已存在的集群)。

    • 可以为这个作业序列设置周期执行计划,并在完成任务后自动释放集群。

    • 可以在执行记录列表上查看每一次执行的情况与对应的日志。

如何查看作业运行记录?

提交作业后,您可以通过数据开发控制台或YARN UI方式查看作业运行记录。

  • 数据开发控制台方式

    该方式适用于通过控制台方式创建并提交作业的场景。

    1. 作业运行后,您可以在日志页签中查看作业运行的日志。

    2. 单击运行记录页签,可以查看作业实例的运行情况。作业运行记录

    3. 单击目标运行记录右侧的详情,跳转到运维中心,可以查看作业实例信息、提交日志和YARN容器列表。

  • YARN UI方式

    该方式适用于通过控制台方式和命令行方式创建并提交作业的场景。

    1. 开启8443端口。

    2. 在目标集群的集群管理页签下,单击左侧菜单访问链接与端口

    3. 单击YARN UI后面的链接。

      在使用Knox账号访问YARN UI页面时,需要Knox账号的用户名和密码。

    4. 在Hadoop控制台,单击目标作业的ID,可以查看作业运行的详情。Hadoop控制台

如何在OSS上查看日志?

  1. 在E-MapReduce数据开发的页面,找到对应的工作流实例,单击运行记录

  2. 运行记录区域,单击待查看工作流实例所在行的详情,在作业实例信息页面查看执行集群ID。

  3. 在日志保存目录OSS://mybucket/emr/spark下,查找执行集群ID目录。

  4. OSS://mybucket/emr/spark/clusterID/jobs目录下会按照作业的执行ID存放多个目录,每个目录下存放了这个作业的运行日志文件。

读写MaxCompute时,报错java.lang.RuntimeException.Parse response failed: ‘<!DOCTYPE html>…’

  • 问题分析:可能是MaxCompute Tunnel Endpoint填写错误。

  • 解决方法:输入正确的MaxCompute Tunnel Endpoint,详情请参见Endpoint

多个ConsumerID消费同一个Topic时为什么TPS不一致?

有可能这个Topic在公测或其他环境创建过,导致某些Consumer组消费数据不一致。

E-MapReduce中是否可以查看Worker上的作业日志?

可以。您可以通过YARN UI的方式查看Worker上的日志,详细信息请参见YARN UI方式

为什么Spark Streaming作业已经结束,但是E-MapReduce控制台显示作业还处于“运行中”状态?

  • 问题分析:Spark Streaming作业的运行模式是Yarn-Client。

  • 解决方法:因为E-MapReduce对Yarn-Client模式的Spark Streaming作业的状态监控存在问题,所以请修改为Yarn-Cluster模式。

报错“Error: Could not find or load main class”

检查作业配置中作业JAR包的路径协议头是否是ossref,如果不是请改为ossref

如何在MR作业中使用本地共享库?

您可以在阿里云E-MapReduce控制台,YARN服务的配置页面,修改mapred-site.xml页签如下参数。

<property>  
    <name>mapred.child.java.opts</name>  
    <value>-Xmx1024m -Djava.library.path=/usr/local/share/</value>  
  </property>  
  <property>  
    <name>mapreduce.admin.user.env</name>  
    <value>LD_LIBRARY_PATH=$HADOOP_COMMON_HOME/lib/native:/usr/local/lib</value>  
  </property>

如何在MR或Spark作业中指定OSS数据源文件路径?

您可以在作业中指定输入输出数据源时使用OSS URL: oss://[accessKeyId:accessKeySecret@]bucket[.endpoint]/object/path形式,类似hdfs://

您在操作OSS数据时:

  • (建议)E-MapReduce提供了MetaService服务,支持免AccessKey访问OSS数据,直接写oss://bucket/object/path

  • (不建议)可以将AccessKey ID,AccessKey Secret以及Endpoint配置到Configuration(Spark作业是SparkConf,MR作业是Configuration)中,也可以在URI中直接指定AccessKey ID、AccessKey Secret以及Endpoint。

如何查看E-MapReduce服务的日志?

登录Master节点在/mnt/disk1/log中查看对应服务的日志。

报错"No space left on device"

  • 问题分析:

    • Master或Worker节点空间不足,导致作业失败。

    • 磁盘空间满导致本地Hive元数据库(MySQL Server)异常,Hive Metastore连接报错。

  • 解决方法:清理Master节点磁盘空间、系统盘的空间以及HDFS空间。

访问OSS或LogService时报错ConnectTimeoutException或ConnectionException

  • 问题分析:OSS Endpoint需要配置为公网地址,但EMR Worker节点并无公网IP,所以无法访问。

  • 解决方法:

    • 修改OSS Endpoint地址为内网地址。

    • 使用EMR metaservice功能,不指定Endpoint。

    例如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"

如何清理已经完成作业的日志数据?

  • 问题描述:集群的HDFS容量被写满,发现/spark-history下有大量的数据。

  • 解决方法:

    1. 在Spark配置页面的服务配置区域,查看是否有spark_history_fs_cleaner_enabled参数:

      • 是:修改参数值为true,可以周期性清理已经完成的作业的日志数据。

      • 否:在spark-defaults页签下,单击自定义配置,新增spark_history_fs_cleaner_enabledtrue

    2. 单击右上角的操作 > 重启 All Components

    3. 执行集群操作对话框,输入执行原因,单击确定

    4. 在弹出的确认对话框中,单击确定

为什么AppMaster调度启动Task的时间过长?

  • 问题分析:作业Task数目过多或Spark Executor数目过多,导致AppMaster调度启动Task的时间过长,单个Task运行时间较短,作业调度的Overhead较大。

  • 解决方法:

    • 减少Task数目,使用CombinedInputFormat。

    • 提高前序作业产出数据的Block Size(dfs.blocksize)。

    • 提高mapreduce.input.fileinputformat.split.maxsize

    • 对于Spark作业,在阿里云E-MapReduce控制台,Spark服务的配置页面,调节spark.executor.instances减少Executor数目,或者调节spark.default.parallelism降低并发数。

E-MapReduce是否提供实时计算的功能?

E-MapReduce提供Spark Streaming、Storm和Flink三种实时计算服务。

作业参数传递至脚本文件该如何处理?

在Hive作业中,您可以通过-hivevar选项,传递作业中配置的参数至脚本中。

  1. 准备脚本文件。

    脚本文件中引用变量的方式为${varname}(例如${rating})。本示例中脚本的相关信息如下:

    • 脚本名称:hivesql.hive

    • 脚本的OSS路径:oss://bucket_name/path/to/hivesql.hive

    • 脚本内容

      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};
  2. 进入数据开发页面。

    1. 通过阿里云账号登录阿里云E-MapReduce控制台

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组

    3. 单击上方的数据开发页签。

  3. 单击待编辑项目所在行的作业编辑

  4. 新建Hive类型作业。

    1. 在页面左侧,在需要操作的文件夹上单击右键,选择新建作业

    2. 新建作业对话框中,输入作业名称作业描述,从作业类型下拉列表中选择Hive作业类型。

    3. 单击确定

  5. 编辑作业内容。

    1. 基础设置页面,设置参数的KeyValue,其中Key为脚本文件中的变量名,必须与脚本一致,例如ratingconfig_parameter

    2. 作业内容中必须添加-hivevar选项,以便传递作业中配置的参数值至脚本变量。

      -hivevar rating=${rating} -f ossref://bucket_name/path/to/hivesql.hive
  6. 执行作业。

    本示例执行结果如下。submit_log

如何使用阿里云E-MapReduce HDFS的Balancer功能以及参数调优?

  1. 登录待配置集群任意节点。

  2. 执行以下命令,切换到hdfs用户并执行Balancer参数。

    su hdfs
    /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 10
  3. 执行以下命令,查看Balancer运行情况:

    • 方式一

      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字样时,表示执行成功。

    Balancer的主要参数。

    参数

    描述

    Threshold

    默认值为10%,表示上下浮动10%。

    当集群总使用率较高时,需要调小Threshold,避免阈值过高。

    当集群新增节点较多时,您可以适当增加Threshold,使数据从高使用率节点移向低使用率节点。

    dfs.datanode.balance.max.concurrent.moves

    默认值为5。

    指定DataNode节点并发移动的最大个数。通常考虑和磁盘数匹配,推荐在DataNode端设置为4 * 磁盘数作为上限,可以使用Balancer的值进行调节。

    例如:一个DataNode有28块盘,在Balancer端设置为28,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时,会出现由于个别数据块没有完成而导致迭代较长的情况,您可以通过此参数对移动长尾进行控制。

    DataNode的主要参数。

    参数

    描述

    dfs.datanode.balance.bandwidthPerSec

    指定DataNode用于Balancer的带宽,通常推荐设置为100 MB/s,您也可以通过dfsadmin -setBalancerBandwidth 参数进行适当调整,无需重启DataNode。

    例如,在负载低时,增加Balancer的带宽。在负载高时,减少Balancer的带宽。

    dfs.datanode.balance.max.concurrent.moves

    指定DataNode上同时用于Balancer待移动Block的最大线程个数。

如果E-MapReduce控制台上没有自定义配置选项,该如何处理?

  1. 登录集群的Master节点。

  2. 进入配置模板的目录。

    cd /var/lib/ecm-agent/cache/ecm/service/HUE/4.4.0.3.1/package/templates/

    hue templates

    本示例以HUE为例:

    • HUE表示服务的目录。

    • 4.4.0.3.1为Hue的版本。

    • hue.ini为配置文件。

  3. 执行以下命令,添加您需要的配置。

    vim hue.ini

    当配置项已存在时,您可以根据时间情况修改参数值。

  4. 在E-MapReduce控制台,重启服务以生效配置。

使用数据开发提交的作业一直处于Submit状态,该如何处理?

问题现象如下图所示。Submit

出现此问题,通常是因为EMRFLOW中部分组件状态错误,您需要在控制台重启状态错误的组件。

  1. 进入EMRFLOW页面。

    1. 进入任意服务页面,修改访问链接后的服务名为EMRFLOW。hdfs

      说明

      本示例是先进入HDFS服务页面。

    2. 单击部署拓扑页签。

  2. 启动组件。

    1. 部署拓扑页签,单击组件处于STOPPED状态操作列的启动Stopped

    2. 执行集群操作对话中,输入执行原因,单击确定

    3. 确认对话中,单击确定

  3. 查看日志信息,检查组件是否启动。

    1. 单击上方的查看操作历史

    2. 操作历史对话框中,单击操作类型列的Start EMRFLOW FlowAgentDaemonStart Flow

    3. 单击主机名列的emr-header-1emr-header

    4. 单击任务名列的START_FlowAgentDaemon_ON_emr-header-1Start-FlowAgent

    5. 任务日志区域,提示如下图所示时表示组件启动成功。SUCCESS

      说明

      组件启动后,如果还有报错,请根据日志信息排查并处理。如果报错信息提示权限问题,您可以先通过SSH方式登录集群,执行命令sudo chown flowagent:hadoop /mnt/disk1/log/flow-agent/*处理,然后按照上述步骤重新操作以重启状态错误的组件。