相关文章推荐
潇洒的雪糕  ·  62. ...·  2 月前    · 
深情的山羊  ·  Hive Read & Write | ...·  1 月前    · 
坚韧的闹钟  ·  Data Masking: 8 ...·  1 年前    · 
踏实的墨镜  ·  * 和 ?在 shell ...·  1 年前    · 
绅士的跑步机  ·  Single_Phase_Passive_I ...·  1 年前    · 
仗义的长颈鹿  ·  西藏教育考试院·  2 年前    · 

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

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

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

    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_enabled true

    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. 基础设置 页面,设置参数的 Key Value ,其中 Key 为脚本文件中的变量名,必须与脚本一致,例如 rating config_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状态,该如何处理?

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

  1. 进入EMRFLOW页面。

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

      说明

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

    2. 单击 部署拓扑 页签。

  2. 启动组件。

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

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

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

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

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

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

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

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

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

      说明

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