华为云用户手册

  • 回答 在进行rollup和cube操作时,用户通常是基于维度进行分析,需要的是度量的结果,因此不会对维度进行聚合操作。 例如当前有表src(d1, d2, m),那么语句1“select d1, sum(m) from src group by d1, d2 with rollup”就是对维度d1和d2进行上卷操作计算度量m的结果,因此有实际业务意义,而其结果也跟预期是一致的。但语句2“select d1, sum(d1) from src group by d1, d2 with rollup”则从业务上无法解释。当前对于语句2所有聚合(sum/avg/max/min)结果均为0。 只有在rollup和cube操作中对出现在group by中的字段进行聚合结果才是0,非rollup和cube操作其结果跟预期一致。
  • Ranger统一鉴权特性 特性说明:在Kafka 2.4.0之前版本,Kafka组件仅支持社区自带的SimpleAclAuthorizer鉴权插件,Kafka 2.4.0及之后版本, MRS Kafka同时支持Ranger鉴权插件和社区自带鉴权插件。默认使用Ranger鉴权,基于Ranger鉴权插件,可进行细粒度的Kafka Acl管理。 服务端使用Ranger鉴权插件时,如果“allow.everyone.if.no.acl.found”配置为“true”,使用非安全端口访问时,所有行为将直接放行。建议使用Ranger鉴权插件的安全集群,不要开启“allow.everyone.if.no.acl.found”。
  • 回答 该应用程序中使用了DStream中的print算子来显示结果,该算子会调用RDD中的take算子来实现底层的计算。 Take算子会以Partition为单位多次触发计算。 在该问题中,由于Shuffle操作,导致take算子默认有两个Partition,Spark首先计算第一个Partition,但由于没有数据输入,导致获取结果不足10个,从而触发第二次计算,因此会出现RDD的DAG结构打印两次的现象。 在代码中将print算子修改为foreach(collect),该问题则不会出现。
  • 回答 原因分析: 这是由于Spark2x与Spark1.5存储DataSoure表信息的格式不一致导致的。Spark1.5会将schema信息分成多个part,使用path.park.0作为key进行存储,读取时再将各个part都读取出来,重新拼成完整的信息。而Spark2x直接使用相应的key获取对应的信息。这样在Spark2x中去读取Spark1.5创建的DataSource表时,就无法成功读取到key对应的信息,导致解析DataSource表信息失败。 而在处理Hive格式的表时,Spark2x与Spark1.5的存储方式一致,所以Spark2x可以直接读取Spark1.5创建的表,不存在上述问题。 规避措施: Spark2x可以通过创建外表的方式来创建一张指向Spark1.5表实际数据的表,这样可以实现在Spark2x中读取Spark1.5创建的DataSource表。同时,Spark1.5更新过数据后,Spark2x中访问也能感知到变化 ,反过来一样。这样即可实现Spark2x对Spark1.5创建的DataSource表的访问。
  • Kafka Idempotent特性 特性说明:Kafka从0.11.0.0版本引入了创建幂等性Producer的功能,开启此特性后,Producer自动升级成幂等性Producer,当Producer发送了相同字段值的消息后,Broker会自动感知消息是否重复,继而避免数据重复。需要注意的是,这个特性只能保证单分区上的幂等性,即一个幂等性Producer能够保证某个主题的一个分区内不出现重复消息;只能实现单会话上的幂等性,这里的会话指的是Producer进程的一次运行,即重启Producer进程后,幂等性不保证。 开启方法: 二次开发代码中添加“props.put(“enable.idempotence”,true)”。 客户端配置文件中添加“enable.idempotence = true”。
  • 回答 创建大量节点后,follower与leader同步时数据量大,在集群数据同步限定时间内不能完成同步过程,导致超时,各个ZooKeeper Server启动失败。 参考修改集群服务配置参数章节,进入ZooKeeper服务“全部配置”页面。不断尝试调大ZooKeeper配置文件“zoo.cfg”中的“syncLimit”和“initLimit”两参数值,直到ZooKeeperServer正常。 表1 参数说明 参数 描述 默认值 syncLimit follower与leader进行同步的时间间隔(时长为ticket时长的倍数)。如果在该时间范围内leader没响应,连接将不能被建立。 15 initLimit follower连接到leader并与leader同步的时间(时长为ticket时长的倍数)。 15 如果将参数“initLimit”和“syncLimit”的参数值均配置为“300”之后,ZooKeeper server仍然无法恢复,则需确认没有其他应用程序正在kill ZooKeeper。例如,参数值为“300”,ticket时长为2000毫秒,即同步限定时间为300*2000ms=600s。 可能存在以下场景,在ZooKeeper中创建的数据过大,需要大量时间与leader同步,并保存到硬盘。在这个过程中,如果ZooKeeper需要运行很长时间,则需确保没有其他监控应用程序kill ZooKeeper而判断其服务停止。
  • 跨域关键技术和优势 无单点瓶颈:HSFabric可进行水平扩展,多通道并行传输,速率最大化,跨地域延迟不再成为瓶颈。 更好地计算资源利用:将数据压缩,序列化的任务下推到Worker并行计算。 高效序列化:优化数据序列化格式,同等数据量级下,更低的数据传输量。 流式传输:基于HTTP 2.0 stream, 保证HTTP协议通用性的同时,减少大量数据传输中RPC 重复调用。 断点续传:防止数据传输过程中连接异常断开后重传大量数据。 流量管控:支持按地区限制数据传输所占用的网络带宽,避免在跨地域有限带宽场景下因流量独占而影响其他业务的正常使用。
  • 问题 添加HBase的Ranger访问权限策略时,在策略中使用通配符搜索已存在的HBase表时,搜索不到已存在的表,并且在/var/log/Bigdata/ranger/rangeradmin/ranger-admin-*log中报以下错误 Caused by: javax.security.sasl.SaslException: No common protection layer between client and serverat com.sun.security.sasl.gsskerb.GssKrb5Client.doFinalHandshake(GssKrb5Client.java:253)at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:186)at org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.evaluateChallenge(AbstractHBaseSaslRpcClient.java:142)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler$2.run(NettyHBaseSaslRpcClientHandler.java:142)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler$2.run(NettyHBaseSaslRpcClientHandler.java:138)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:422)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1761)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.channelRead0(NettyHBaseSaslRpcClientHandler.java:138)at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.channelRead0(NettyHBaseSaslRpcClientHandler.java:42)at org.apache.hbase.thirdparty.io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)at org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
  • 跨源功能使用指导 HetuEngine能够支持多种数据源的快速联合查询并提供可视化的数据源配置、管理页面,可通过HSConsole界面快速添加如下数据源,配置数据源前请先参考HetuEngine交互查询引擎概述: 添加Hive数据源 添加Hudi数据源 添加ClickHouse数据源 添加GAUSSDB数据源 添加HBase数据源 添加跨集群HetuEngine数据源 添加IoTDB数据源 添加MySQL数据源 添加Oracle数据源 添加GBase数据源
  • 回答 Ranger界面上HBase服务插件的“hbase.rpc.protection”参数值和HBase服务端的“hbase.rpc.protection”参数值必须保持一致。 参考登录Ranger WebUI界面章节,登录Ranger管理界面。 在首页中“HBASE”区域,单击组件插件名称,如HBase的按钮 搜索配置项“hbase.rpc.protection”,修改配置项的value值,与HBase服务端的“hbase.rpc.protection”的值保持一致。 单击“保存”。
  • GAUSSDB数据类型映射 GAUSSDB数据类型(data type) HetuEngine数据类型(data type) BOOLEAN BOOLEAN TINYINT TINYINT SMALLINT SMALLINT INTEGER INTEGER BINARY_INTEGER INTEGER BIGINT BIGINT SMALLSERIAL SMALLINT SERIAL INTEGER BIGSERIAL BIGINT FLOAT4 (REAL) REAL FLOAT8(DOUBLE PRECISION) DOUBLE PRECISION DECIMAL[p (,s)] DECIMAL[p (,s)] NUMERIC[p (,s)] DECIMAL[p (,s)] CHAR(n) CHAR(n) CHARACTER(n) CHAR(n) NCHAR(n) CHAR(n) VARCHAR(n) VARCHAR(n) CHARACTER VARYING(55) VARCHAR(n) VARCHAR2(n) VARCHAR(n) NVARCHAR2(n) VARCHAR TEXT(CLOB) VARCHAR DATE TIMESTAMP TIMESTAMP TIMESTAMP UUID UUID JSON JSON
  • 添加GAUSSDB数据源约束 不支持如下语法:GRANT、REVOKE、SHOW GRANTS、SHOW ROLES、SHOW ROLE GRANTS。 UPDATE和DELETE语法不支持筛选条件子句中包含跨catalog的条件,例如:UPDATE mppdb.table SET column1=value WHERE column2 IN (SELECT column2 from hive.table)。 UPDATE语法不支持更新DATE/TIMESTAMP/VARBINARY字段。 不支持查询WHERE语句条件为REAL,例如SELECT * FROM mppdb.table WHERE column1 = REAL '1.1'。 DELETE语法不支持筛选条件子句中包含子查询,例如:DELETE FROM mppdb.table WHERE column IN (SELECT column FROM mppdb.table1)。 HetuEngine支持 GaussDB 数据源Decimal/Number/Numeric类型数据的最大精度不超过38位。 当谓词的前后两端任意一端包含子查询时,该谓词不会下推,如示例语句count(*) 后面存在子查询,则不下推,但子查询中的min函数可以下推。 select count(*) from item where i_current_price = (select min(i_current_price) from item);
  • 添加GAUSSDB数据源前提条件 数据源所在集群与HetuEngine集群节点网络互通。 在HetuEngine所在集群的所有节点的“/etc/hosts”文件中,添加待对接数据源所在集群的主机名称和对应的IP映射,及其“/etc/hosts”文件中的“10.10.10.10 hadoop.系统 域名 ”(如“10.10.10.10 hadoop.hadoop.com”),否则HetuEngine无法根据主机名称连接到非本集群节点。 已创建HetuEngine计算实例。
  • 回答 这是因为ResourceManager感知到NodeManager关闭时,Executor(s)已经因空闲超时而被driver请求结束掉,但因NodeManager已经关闭,这些Executor(s)实际上并不能被结束掉。 因此driver不能感知到这些Executor(s)的LOST事件,所以并未从自身的Executor list中移除,从而导致在driver页面上还能看到这些Executor(s)。 这是YARN NodeManager关闭之后的正常现象,NodeManager再次启动后,这些Executor(s)会被移除。
  • 操作步骤 并行度可以通过如下三种方式来设置,用户可以根据实际的内存、CPU、数据以及应用程序逻辑的情况调整并行度参数。 在会产生shuffle的操作函数内设置并行度参数,优先级最高。 testRDD.groupByKey(24) 在代码中配置“spark.default.parallelism”设置并行度,优先级次之。 val conf = new SparkConf()conf.set("spark.default.parallelism", 24) 在“$SPARK_HOME/conf/spark-defaults.conf”文件中配置“spark.default.parallelism”的值,优先级最低。 spark.default.parallelism 24
  • 回答 Spark SQL对用户SQL语句的执行逻辑是:首先解析出语句中包含的表,再获取表的元数据信息,然后对权限进行检查。 当表是parquet表时,元数据信息包括文件的Split信息。Split信息需要调用HDFS的接口去读取,当表包含的文件数量很多时,串行读取Split信息变得缓慢,影响性能。故对此做了优化,当表包含的文件大于一定阈值(即spark.sql.sources.parallelSplitDiscovery.threshold参数值)时,会生成一个Job,利用Executor的并行能力去读取,从而提升执行效率。 由于权限检查在获取表元数据之后,因此当读取的parquet表包含的文件数量很多时,会在报“Missing Privileges”之前,运行一个Job来并行读取元数据信息。
  • 问题 向动态分区表中插入数据时,shuffle过程中大面积shuffle文件损坏(磁盘掉线、节点故障等)后,为什么会在重试的task中出现"Failed to CREATE_FILE"异常? 2016-06-25 15:11:31,323 | ERROR | [Executor task launch worker-0] | Exception in task 15.0 in stage 10.1 (TID 1258) | org.apache.spark.Logging$class.logError(Logging.scala:96)org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException): Failed to CREATE_FILE /user/hive/warehouse/testdb.db/web_sales/.hive-staging_hive_2016-06-25_15-09-16_999_8137121701603617850-1/-ext-10000/_temporary/0/_temporary/attempt_201606251509_0010_m_000015_0/ws_sold_date=1999-12-17/part-00015 for DFSClient_attempt_201606251509_0010_m_000015_0_353134803_151 on 10.1.1.5 because this file lease is currently owned by DFSClient_attempt_201606251509_0010_m_000015_0_-848353830_156 on 10.1.1.6
  • 回答 动态分区表插入数据的最后一步是读取shuffle文件的数据,再写入到表对应的分区文件中。 当大面积shuffle文件损坏后,会引起大批量task失败,然后进行job重试。重试前Spark会将写表分区文件的句柄关闭,大批量task关闭句柄时HDFS无法及时处理。在task进行下一次重试时,句柄在NameNode端未被及时释放,即会发生"Failed to CREATE_FILE"异常。 这种现象仅会在大面积shuffle文件损坏时发生,出现异常后task会重试,重试耗时在毫秒级,影响较小,可以忽略不计。
  • 回答 对于Hash shuffle,在shuffle的过程中写数据时不做排序操作,只是将数据根据Hash的结果,将各个reduce分区的数据写到各自的磁盘文件中。 这样带来的问题是如果reduce分区的数量比较大的话,将会产生大量的磁盘文件(比如:该问题中将产生1000000 * 100000 = 10^11个shuffle文件)。如果磁盘文件数量特别巨大,对文件读写的性能会带来比较大的影响,此外由于同时打开的文件句柄数量多,序列化以及压缩等操作需要占用非常大的临时内存空间,对内存的使用和GC带来很大的压力,从而容易造成Executor无法响应Driver。 因此,建议使用Sort shuffle,而不使用Hash shuffle。
  • 回答 在yarn-client模式下,Spark的Driver和ApplicationMaster作为两个独立的进程在运行。当Driver完成任务退出时,会通知ApplicationMaster向ResourceManager注销自身,即调用unregister方法。 由于是远程调用,则存在发生网络故障的可能性。当发生网络故障时,ApplicationMaster会使用Yarn客户端的重试机制进行重试。在达到最大重试次数之前网络恢复正常,则ApplicationMaster会正常退出。 如果超过重试次数和重试时长,则ApplicationMaster注销失败,ResourceManager会认为ApplicationMaster异常退出并尝试重新启动ApplicationMaster。新启动的ApplicationMaster在尝试连接已经退出的Driver失败后,会在ResourceManager页面上标记此次Application为FAILED状态。
  • 问题 ZooKeeper客户端刷新TGT失败,无法连接ZooKeeper。报错内容如下: Login: Could not renew TGT due to problem running shell command: '***/kinit -R'; exception was:org.apache.zookeeper.Shell$ExitCodeException: kinit: Ticket expired while renewing credentials
  • 回答 HDFS_DELEGATION_TOKEN到期的异常是由于token没有更新或者超出了最大生命周期。 在token的最大生命周期内确保下面的参数值大于作业的运行时间。 “dfs.namenode.delegation.token.max-lifetime”=“604800000”(默认是一星期) 参考修改集群服务配置参数,进入HDFS“全部配置”页面,在搜索框搜索该参数。 建议在token的最大生命周期内参数值为多倍小时数。
  • 前提条件 HDFS和Oozie组件安装完成且运行正常,客户端安装成功。 如果当前客户端为旧版本,需要重新下载和安装客户端。 已创建或获取访问Oozie服务的人机用户账号及密码。 该用户需要从属于hadoop、supergroup、hive组,同时添加Oozie的角色操作权限。如果使用Hive多实例,该用户还需要从属于具体的Hive实例组,如hive3。 用户同时还需要至少有manager_viewer权限的角色。
  • 操作步骤 访问Hue WebUI,请参考访问Hue WebUI界面。 单击菜单左侧的,在打开的页面中可以查看Workflow、计划、Bundles任务的相关信息。 默认显示当前集群的所有作业。 作业浏览器显示的数字表示集群中所有作业的总数。 “作业浏览器”将显示作业以下信息: 表1 MRS作业属性介绍 属性名 描述 名称 表示作业的名称。 用户 表示启动该作业的用户。 类型 表示作业的类型。 状态 表示作业的状态,包含“成功”、“正在运行”、“失败”。 进度 表示作业运行进度。 组 表示作业所属组。 开始 表示作业开始时间。 持续时间 表示作业运行使用的时间。 Id 表示作业的编号,由系统自动生成。 如果MRS集群安装了Spark组件,则默认会启动一个作业“Spark-JD BCS erver”,用于执行任务。
  • 操作步骤 Spark程序运行时,在shuffle和RDD Cache等过程中,会有大量的数据需要序列化,默认使用JavaSerializer,通过配置让KryoSerializer作为数据序列化器来提升序列化性能。 在开发应用程序时,添加如下代码来使用KryoSerializer作为数据序列化器。 实现类注册器并手动注册类。 package com.etl.common;import com.esotericsoftware.kryo.Kryo;import org.apache.spark.serializer.KryoRegistrator; public class DemoRegistrator implements KryoRegistrator{ @Override public void registerClasses(Kryo kryo) { //以下为示例类,请注册自定义的类 kryo.register(AggrateKey.class); kryo.register(AggrateValue.class); }} 您可以在Spark客户端对spark.kryo.registrationRequired参数进行配置,设置是否需要Kryo注册序列化。 当参数设置为true时,如果工程中存在未被序列化的类,则会发生异常。如果设置为false(默认值),Kryo会自动将未注册的类名写到对应的对象中。此操作会对系统性能造成影响。设置为true时,用户需手动注册类,针对未序列化的类,系统不会自动写入类名,而是发生异常,相对比false,其性能较好。 配置KryoSerializer作为数据序列化器和类注册器。 val conf = new SparkConf()conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").set("spark.kryo.registrator", "com.etl.common.DemoRegistrator")
  • 操作场景 Spark支持两种方式的序列化 : Java原生序列化JavaSerializer Kryo序列化KryoSerializer 序列化对于Spark应用的性能来说,具有很大的影响。在特定的数据格式的情况下,KryoSerializer的性能可以达到JavaSerializer的10倍以上,而对于一些Int之类的基本类型数据,性能的提升就几乎可以忽略。 KryoSerializer依赖Twitter的Chill库来实现,相对于JavaSerializer,主要的问题在于不是所有的Java Serializable对象都能支持,兼容性不好,所以需要手动注册类。 序列化功能用在两个地方:序列化任务和序列化数据。Spark任务序列化只支持JavaSerializer,数据序列化支持JavaSerializer和KryoSerializer。
  • 操作步骤 配置Driver内存。 Driver负责任务的调度,和Executor、AM之间的消息通信。当任务数变多,任务平行度增大时,Driver内存都需要相应增大。 您可以根据实际任务数量的多少,为Driver设置一个合适的内存。 将“spark-defaults.conf”中的“spark.driver.memory”配置项设置为合适大小。 在使用spark-submit命令时,添加“--driver-memory MEM”参数设置内存。 配置Executor个数。 每个Executor每个核同时能跑一个task,所以增加了Executor的个数相当于增大了任务的并发度。在资源充足的情况下,可以相应增加Executor的个数,以提高运行效率。 将“spark-defaults.conf”中的“spark.executor.instance”配置项或者“spark-env.sh”中的“SPARK_EXECUTOR_INSTAN CES ”配置项设置为合适大小。 在使用spark-submit命令时,添加“--num-executors NUM”参数设置Executor个数。 配置Executor核数。 每个Executor多个核同时能跑多个task,相当于增大了任务的并发度。但是由于所有核共用Executor的内存,所以要在内存和核数之间做好平衡。 将“spark-defaults.conf”中的“spark.executor.cores”配置项或者“spark-env.sh”中的“SPARK_EXECUTOR_CORES”配置项设置为合适大小。 在使用spark-submit命令时,添加“--executor-cores NUM”参数设置核数。 配置Executor内存。 Executor的内存主要用于任务执行、通信等。当一个任务很大的时候,可能需要较多资源,因而内存也可以做相应的增加;当一个任务较小运行较快时,就可以增大并发度减少内存。 将“spark-defaults.conf”中的“spark.executor.memory”配置项或者“spark-env.sh”中的“SPARK_EXECUTOR_MEMORY”配置项设置为合适大小。 在使用spark-submit命令时,添加“--executor-memory MEM”参数设置内存。
  • 示例 在执行spark wordcount计算中。1.6T数据,250个executor。 在默认参数下执行失败,出现Futures timed out和OOM错误。 因为数据量大,task数多,而wordcount每个task都比较小,完成速度快。当task数多时driver端相应的一些对象就变大了,而且每个task完成时executor和driver都要通信,这就会导致由于内存不足,进程之间通信断连等问题。 当把Driver的内存设置到4g时,应用成功跑完。 使用JDB CS erver执行TPC-DS测试套,默认参数配置下也报了很多错误:Executor Lost等。而当配置Driver内存为30g,executor核数为2,executor个数为125,executor内存为6g时,所有任务才执行成功。
  • 操作场景 Spark on Yarn模式下,有Driver、ApplicationMaster、Executor三种进程。在任务调度和运行的过程中,Driver和Executor承担了很大的责任,而ApplicationMaster主要负责container的启停。 因而Driver和Executor的参数配置对Spark应用的执行有着很大的影响意义。用户可通过如下操作对Spark集群性能做优化。
  • 回答 由于Spark存在一个机制,为了提高性能会缓存Parquet的元数据信息。当通过Hive或其他方式更新了Parquet表时,缓存的元数据信息未更新,导致Spark SQL查询不到新插入的数据。 对于存储类型为Parquet的Hive分区表,在执行插入数据操作后,如果分区信息未改变,则缓存的元数据信息未更新,导致Spark SQL查询不到新插入的数据。 解决措施:在使用Spark SQL查询之前,需执行Refresh操作更新元数据信息。 REFRESH TABLE table_name; table_name为刷新的表名,该表必须存在,否则会出错。 执行查询语句时,即可获取到最新插入的数据。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全