Q:作业和执行计划的区别

A:在阿里云E-MapReduce中,要运行作业,需要有分成两个步骤,分别是:

  • 创建作业

    在E-MapReduce中创建了一个作业,实际只是创建了一个作业如何运行的配置,该配置中包括该作业要运行的jar包、数据的输入输出地址以及一些运行参数。该配置创建好后,给它命名即定义了一个作业。当您需要调试运行作业的时候就需要执行计划了。

  • 创建执行计划

    执行计划,是将作业与集群关联起来的一个纽带。通过它,我们可以把多个作业组合成一个作业序列,通过它我们可以为作业准备一个运行集群(或者自动创建出一个临时集群或者关联一个已存在的集群),通过它我们可以为这个作业序列设置周期执行计划,并在完成任务后自动释放集群。我们也可以在执行记录列表上查看每一次执行的执行成功情况与日志。

    执行计划,是将作业与集群关联起来的一个纽带。通过它可以把多个作业组合成一个作业序列。可以为作业准备一个运行集群(或者自动创建出一个临时集群或者关联一个已存在的集群)。可以为这个作业序列设置周期执行计划,并在完成任务后自动释放集群。也可以在执行记录列表上查看每一次执行的执行成功情况与日志。

Q:如何查看作业日志

A:在E-MapReduce系统里,系统已经将作业运行日志按照JobID的规划上传到OSS中(路径由用户在创建集群时设置),用户可以直接在网页上单击查看作业日志。如果用户是登录到Master机器进行作业提交和脚本运行等,则日志根据用户自己的脚本而定,用户可以自行规划。

Q:如何登录Core节点

A:按照如下步骤:
  1. 首先在Master节点上切换到Hadoop账号:
    su hadoop
  2. 然后即可免密码SSH登录到对应的Core节点:
    ssh emr-worker-1
  3. 通过sudo可以获得root权限:
    sudo vi /etc/hosts

Q:如何在OSS上查看日志

A:用户也可以直接从OSS上查找所有的日志文件,并下载。但是因为OSS不能直接查看日志,使用起来会比较麻烦一些。如果用户创建集群时打开了运行日志功能,并且指定了一个OSS的日志位置,那么作业的日志要如何找到呢?例如对下面这个保存位置OSS://mybucket/emr/spark
  1. 首先来到执行计划的页面,找到对应的执行计划,单击运行记录进入运行记录页面。
  2. 在运行记录页面找到具体的那一条执行记录,例如最后的一条执行记录。然后单击它对应的执行集群查看这个执行集群的ID。
  3. 然后在OSS://mybucket/emr/spark目录下,寻找OSS://mybucket/emr/spark/集群ID这个目录。
  4. OSS://mybucket/emr/spark/clusterID/jobs目录下会按照作业的执行ID存放多个目录,每一个目录下存放了这个作业的运行日志文件。

Q:集群、执行计划以及运行作业的计时策略

A:三种计时策略如下:
  • 集群的计时策略

    在集群列表里可以看到每个集群的运行时间,该运行时间的计算策略为运行时间=集群释放时刻-集群开始构建时刻。即集群一旦开始构建就开始计时,直到集群的生命周期结束。

  • 执行计划的计时策略
    在执行计划的运行记录列表,可以看到每次执行记录运行的时间,该时间的计时策略总结为两种情况:
    • 如果执行计划是按需执行的,每次执行记录的运行过程涉及到创建集群、提交作业运行、释放集群。所以按需执行计划的运行时间计算策略为,运行时间=构建集群的时间+执行计划包含所有作业全部运行结束的总耗时+集群释放的时间。
    • 如果执行计划是关联已有集群运行的,整个运行周期不涉及到创建集群和释放集群,所以其运行时间=执行计划包含所有作业全部运行结束的总耗时。
  • 作业的计时策略

    这里的作业指的是被挂载到执行计划里面的作业。单击每条执行计划运行记录右侧的查看作业列表,可以查看到该执行计划下的作业列表。这里每个作业运行时间的计算策略为,运行时间=作业运行结束的实际时间-作业开始运行的实际时间。作业运行开始(结束)的实际时间指的是作业被Spark或Hadoop集群实际开始调度运行或运行结束的时间点。

Q:第一次使用执行计划时没有安全组可选

A:因为一些安全的原因,E-MapReduce目前的安全组并不能直接选择用户的已有安全组来使用,所以如果您还没有在E-MapReduce中创建过安全组的话,在执行计划上将无法选择到可用的安全组。我们推荐您先手动创建一个按需集群来进行作业的测试,手动创建集群的时候可以创建一个新的E-MapReduce安全组,等到测试都通过了以后,再设置您的执行计划来周期调度。这个时候之前创建的安全组也会出现在这里可供选择。

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

A:检查MaxCompute tunnel endpoint是否正确,如果写错会出现这个错误。

Q:多个ConsumerID消费同一个Topic时出现TPS不一致问题

A:有可能这个Topic在公测或其他环境创建过,导致某些Consumer组消费数据不一致。请将对应的Topic和ConsumerID提交工单到消息队列 RocketMQ处理。

Q:E-MapReduce中能否查看作业的Worker上日志

A:可以。前置条件:是创建集群时打开运行日志选项。查看日志位置:执行计划列表 > 更多 > 运行记录 > 运行记录 > 查看作业列表 > 作业列表 > 作业实例

Q:Hive创建外部表,没有数据

A:例如:
CREATE EXTERNAL TABLE storage_log(content STRING) PARTITIONED BY (ds STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    STORED AS TEXTFILE
    LOCATION 'oss://log-124531712/biz-logs/airtake/pro/storage'; 
    hive> select * from storage_log;
    OK
    Time taken: 0.3 seconds
    创建完外部表后没有数据
实际上Hive并不会自动关联指定目录的partitions目录,您需要手动操作,例如:
alter table storage_log add partition(ds=123);                                                                                                                                             OK
    Time taken: 0.137 seconds
    hive> select * from storage_log;
    OK
    abcd    123
    efgh    123

Q:Spark Streaming作业运行一段时间后无故结束

A:首先检查Spark版本是否是1.6之前版本。Spark 1.6修复了一个内存泄漏的BUG,这个BUG会导致container内存超用然后被中止掉(当然,这只是可能的原因之一,不能说明Spark 1.6 不存在任何问题)。此外,检查自己的代码在使用内存上有没有做好优化。

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

A:检查Spark Streaming作业的运行模式是否是yarn-client,若是建议改成yarn-cluster模式。E-MapReduce对yarn-client模式的Spark Streaming作业的状态监控存在问题,会尽快修复。

Q:“Error: Could not find or load main class”

A:检查作业配置中作业jar包的路径协议头是否是ossref,若不是请改为ossref

Q:集群机器分工使用说明

A:E-MapReduce中包含一个Master节点和多个Slave(或者Worker)节点。其中Master节点不参与数据存储和计算任务,Slave节点用来存储数据和计算任务。例如,3台4 核8G机型的集群,其中一台机器用来作为Master节点,另外两台用来作为Slave节点,也就是集群的可用计算资源为 2台4核8G机器。

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

A:方法有很多,这里给出一种方式。修改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>

只要加上您所需的库文件即可。

Q:如何在MR/Spark作业中指定OSS数据源文件路径

A: 用户在作业中指定输入输出数据源时使用这种URI,OSS URL: oss://[accessKeyId:accessKeySecret@]bucket[.endpoint]/object/path,可以类比hdfs://

用户操作OSS数据时:
  • (建议)E-MapReduce提供了MetaService 服务,支持免AK访问OSS 数据,直接写oss://bucket/object/path
  • (不建议)可以将AccessKeyId,AccessKeySecret以及endpoint配置到Configuration(Spark作业是SparkConf,MR类作业是Configuration)中,也可以在URI中直接指定AccessKeyId、AccessKeySecret以及endpoint。详情请参见开发准备

Q:Spark SQL抛出“Exception in thread “main” java.sql.SQLException: No suitable driver found for jdbc:mysql:xxx”报错

A:
  • 低版本mysql-connector-java有可能出现类似问题,更新到最新版本。
  • 作业参数中使用—driver-class-path ossref://bucket/…/mysql-connector-java-[version].jar来加载mysql-connector-java包,直接将mysql-connector-java打进作业jar包也会出现上述问题,请更新到最新版本。

Q:Spark SQL连RDS出现“Invalid authorization specification, message from server: ip not in whitelist”

A:检查RDS的白名单设置,将集群机器的内网地址加到RDS的白名单中。

Q : 创建低配置机型集群注意事项

A :
  • 若Master节点选择2核4G机型,很容易造成物理内存不够用,建议调大Master内存。
  • 若Slave节点选择2核4G机型,在运行MR作业或者Hive作业时,请调节参数。MR作业添加参数-D yarn.app.mapreduce.am.resource.mb=1024。Hive作业设置参数 set yarn.app.mapreduce.am.resource.mb=1024,避免作业停止。

Q:Hive/Impala作业读取SparkSQL导入的Parquet表报错(表包含 Decimal 格式的列):Failed with exception java.io.IOException:org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1 in file hdfs://…/…/part-00000-xxx.snappy.parquet

A : 由于Hive和SparkSQL在Decimal类型上使用了不同的转换方式写入Parquet,导致Hive无法正确读取SparkSQL所导入的数据。对于已有的使用SparkSQL导入的数据,如果有被Hive/Impala使用的需求,建议加上spark.sql.parquet.writeLegacyFormat=true,重新导入数据。

Q:beeline如何访问Kerberos安全集群

A:
  • HA 集群(Discovery模式)
    
    !connect jdbc:hive2://emr-header-1:2181,emr-header-2:2181,emr-header-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/_HOST@EMR.${clusterId).COM
  • HA集群(直连某台机器)

    连emr-header-1

    !connect jdbc:hive2://emr-header-1:10000/;principal=hive/emr-header-1@EMR.${clusterId}.COM
    连emr-header-2
    !connect jdbc:hive2://emr-header-2:10000/;principal=hive/emr-header-2@EMR.${clusterId}.COM
  • 非HA集群
    !connect jdbc:hive2://emr-header-1:10000/;principal=hive/emr-header-1@EMR.${clusterId}.COM

Q:ThriftServer进程正常,但链接出现异常,报错 “Connection refused telnet emr-header-1 10001” 无法连接

A:可以查看/mnt/disk1/log/spark日志。该问题是由于thrift server oom,需要调大内存,调大spark.driver.memory值即可。

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

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