云服务器内容精选

  • 怎么确认当前用户创建的表是v1还是v2表? 1. 使用datasource语法建表: CREATE TABLE IF NOT EXISTS table_name (id STRING) USING parquet; 2. 执行show create table查看TBLPROPERTIES下的"verison"字段的值 "v1"为V1表;"v2"则为V2表。 如需修改V1表为V2表请提交工单联系客户支持获取操作帮助。
  • 升级示例 升级Spark引擎和修改数据表时,如新建队列时切换了计算资源类型可能会导致计费资源的费用变化。 如果原队列使用的是弹性资源池类型的计算资源,那么新建队列不涉及计算资源的费用变化。 如果原队列使用的是非弹性资源池的类型的计算资源,那么使用弹性资源池资源新建队列后计算资源的费用将发生变化,具体情况以计算资源的价格详情为准。 示例1:使用SQL队列,将Spark版本从Spark 2.4.x升级至Spark 3.3.1对数据表的版本有影响吗? 不需要,Spark 2.4.x的SQL队列支持V1表和V2表,因此升级Spark版本只需要考虑Spark版本对SQL语法的兼容性。 示例2:使用通用队列,将Spark版本从Spark 2.4.x升级至Spark 3.3.1对数据表的版本有影响吗? Spark 2.4.x通用队列支持V1表和V2表,但Spark3.3.x通用队列不支持V1表。 因此如需将Spark版本从Spark 2.4.x升级至Spark 3.3.1需经过以下步骤: 将Spark 2.4.x的V1表修改为V2表。 升级Spark 2.4.x的V2表升级为Spark 3.3.1的V2表。 同时还需考虑Spark jar作业API语法的兼容性。 表3 DLI 各Spark版本对V1、V2表兼容列表 表类型 Spark2.4 通用队列 Spark3.3 通用队列 V1表 √ 部分支持 V2表 √ √ 示例3:使用通用队列,怎样将Spark 2.3.2的V1表升级为Spark 3.3.1的V2表? Spark 2.3.2通用队列不支持V2表,Spark 3.3.1通用队列不支持V1表: 将Spark 2.3.2的V1表升级至Spark 2.4.5的V1表。 将Spark 2.4.5的V1表修改为V2表。 升级Spark 2.4.5的V2表升级为Spark 3.3.1的V2表。 同时还需考虑Spark jar作业API语法的兼容性。 表4 DLI各Spark版本对V1、V2表兼容列表 表类型 Spark2.3 通用队列 Spark2.4 通用队列 Spark3.3 通用队列 V1表 √ √ 部分支持 V2表 × √ √
  • DLI各Spark版本对V1、V2表兼容性 表1 DLI各Spark版本对V1、V2表兼容列表 表类型 Spark2.3 SQL队列 Spark2.3 通用队列 Spark2.4 SQL队列 Spark2.4 通用队列 Spark3.1 SQL队列 Spark3.1 通用队列 Spark3.3 SQL队列 Spark3.3 通用队列 V1表 √ √ √ √ √ √ √ 部分支持 V2表 × × √ √ × × √ √ 表2 Spark3.3 通用队列语法支持列表 表类型 select create table create table like CTAS insert into insert overwrite load data alter table set location truncate table V1表 √ √ √ × × × × × × V2表 √ √ √ √ √ √ √ √ √
  • 什么是DLI datasourcev1表和DLI datasourcev2表? DLI datasource v1表(以下简称V1表):DLI的Datasource表格式,建表/插入/truncate命令使用DLI自定义的command,表的数据路径为$tablepath/UUID/数据文件。 图1 DLI datasource v1表 DLI datasource v2表(以下简称V2表):spark开源的Datasource表,建表/插入/truncate命令使用spark开源的command,表的数据路径为$tablepath/数据文件。 图2 DLI datasource v2表
  • 工具介绍 在Hadoop大规模生产集群中,由于HDFS的元数据都保存在NameNode的内存中,集群规模受制于NameNode单点的内存限制。如果HDFS中有大量的小文件,会消耗NameNode大量内存,还会大幅降低读写性能,延长作业运行时间。因此,小文件问题是制约Hadoop集群规模扩展的关键问题。 本工具主要有如下两个功能: 扫描表中有多少低于用户设定阈值的小文件,返回该表目录中所有数据文件的平均大小。 对表文件提供合并功能,用户可设置合并后的平均文件大小。
  • 解决方法 应用无法访问到SparkUI的IP:PORT。可能有以下原因: 可能原因一:集群节点与客户端节点网络不通。 解决方法: 查看客户端节点“/etc/hosts”文件中是否配置集群节点映射,在客户端节点执行命令: ping sparkui的IP 如果ping不通,检查映射配置与网络设置。 可能原因二:客户端节点防火墙未关闭。 解决方法: 执行如下命令可查看是否关闭: systemctl status firewalld(不同的操作系统查询命令不一致,此命令以CentOS为例) 如下图所示:dead表示关闭。 防火墙开则影响通信,执行如下命令关闭防火墙: service firewalld stop(不同的操作系统查询命令不一致,此命令以CentOS为例) 可能原因三:端口被占用,每一个Spark任务都会占用一个SparkUI端口,默认为22600,如果被占用则依次递增端口重试。但是有个默认重试次数,为16次。16次重试都失败后,会放弃该任务的运行。 查看端口是否被占用: ssh -v -p port username@ip 如果输出“Connection established”,则表示连接成功,端口已被占用。 Spark UI端口范围由配置文件spark-defaults.conf中的参数“spark.random.port.min”和“spark.random.port.max”决定,如果该范围端口都已被占用,则 导致无端口可用从而连接失败。 解决方法:调节重连次数spark.port.maxRetries=50,并且调节executor随机端口范围spark.random.port.max+100 可能原因四:客户端Spark配置参数错误。 解决方法: 在客户端节点执行命令cat spark-env.sh,查看SPARK_LOCAL_HOSTNAME,是否为本机IP。 该问题容易出现在从其他节点直接复制客户端时,配置参数未修改。 需修改SPARK_LOCAL_HOSTNAME为本机IP。 注:如果集群使用EIP通信,则需要设置以下参数。 spark-default.conf中添加spark.driver.host = EIP(客户端节点弹性公网IP) spark-default.conf中添加spark.driver.bindAddress=本地IP spark-env.sh中修改SPARK_LOCAL_HOSTNAME=EIP(客户端节点弹性公网IP) 可能原因五:代码问题。 解决方法: Spark在启动任务时会在客户端创建sparkDriverEnv并绑定DRIVER_BIND_ADDRESS,该逻辑并没有走到服务端,所以该问题产生的原因也是客户端节点操作系统环境问题导致sparkDriver获取不到对应的主机IP。 可以尝试执行export SPARK_LOCAL_HOSTNAME=172.0.0.1或者设置spark.driver.bindAddress=127.0.0.1,使提交任务driver端可以加载到loopbackAddress,从而规避问题。
  • 问题 安装集群外客户端或使用集群外客户端时,有时会出现连接Spark任务端口失败的问题。 异常信息:Failed to bind SparkUi Cannot assign requested address: Service ‘sparkDriver’ failed after 16 retries (on a random free port)! Consider explicitly setting the appropriate binding address for the service ‘sparkDriver’ (for example spark.driver.bindAddress for SparkDriver) to the correct binding address.
  • 前提条件 配置前,请先购买OBS桶或并行文件系统。大数据场景推荐使用并行文件系统,并行文件系统(Parallel File System)是 对象存储服务 (Object Storage Service,OBS)提供的一种经过优化的高性能文件系统,提供毫秒级别访问时延,以及TB/s级别带宽和百万级别的IOPS,能够快速处理高性能计算(HPC)工作负载。 并行文件系统的详细介绍和使用说明,请参见《并行文件系统特性指南》。
  • (推荐)方案1:使用临时AK/SK 建议使用临时AK/SK,获取方式可参见 统一身份认证 服务_获取临时AK/SK。 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 表1 DLI获取访问凭据相关开发指南 类型 操作指导 说明 FLink作业场景 Flink Opensource SQL使用DEW管理访问凭据 Flink Opensource SQL场景使用DEW管理和访问凭据的操作指导,将Flink作业的输出数据写入到Mysql或DWS时,在connector中设置账号、密码等属性。 Flink Jar 使用DEW获取访问凭证读写OBS 访问OBS的AKSK为例介绍Flink Jar使用DEW获取访问凭证读写OBS的操作指导。 用户获取Flink作业委托临时凭证 DLI提供了一个通用接口,可用于获取用户在启动Flink作业时设置的委托的临时凭证。该接口将获取到的该作业委托的临时凭证封装到com.huaweicloud.sdk.core.auth.BasicCredentials类中。 本操作介绍获取Flink作业委托临时凭证的操作方法。 Spark作业场景 Spark Jar 使用DEW获取访问凭证读写OBS 访问OBS的AKSK为例介绍Spark Jar使用DEW获取访问凭证读写OBS的操作指导。 用户获取Spark作业委托临时凭证 本操作介绍获取Spark Jar作业委托临时凭证的操作方法。
  • 方案2:Spark Jar作业设置获取AK/SK 获取结果为AK/SK时,设置如下: 代码创建SparkContext val sc: SparkContext = new SparkContext() sc.hadoopConfiguration.set("fs.obs.access.key", ak) sc.hadoopConfiguration.set("fs.obs.secret.key", sk) 代码创建SparkSession val sparkSession: SparkSession = SparkSession .builder() .config("spark.hadoop.fs.obs.access.key", ak) .config("spark.hadoop.fs.obs.secret.key", sk) .enableHiveSupport() .getOrCreate() 获取结果为AK/SK和Securitytoken时,鉴权时,临时AK/SK和Securitytoken必须同时使用,设置如下: 代码创建SparkContext val sc: SparkContext = new SparkContext() sc.hadoopConfiguration.set("fs.obs.access.key", ak) sc.hadoopConfiguration.set("fs.obs.secret.key", sk) sc.hadoopConfiguration.set("fs.obs.session.token", sts) 代码创建SparkSession val sparkSession: SparkSession = SparkSession .builder() .config("spark.hadoop.fs.obs.access.key", ak) .config("spark.hadoop.fs.obs.secret.key", sk) .config("spark.hadoop.fs.obs.session.token", sts) .enableHiveSupport() .getOrCreate()
  • 操作步骤 (可选)在公有云管理控制台上方的“服务列表”中选择“大数据”中的“ 数据湖探索 ”,单击右上角的“常用链接”下载DLI JDBC驱动(例如:dli-jdbc-1.1.0-jar-with-dependencies-jdk1.7.jar)。具体操作请参考下载JDBC驱动包。 JDBC认证方式支持AK/SK方式和Token方式,建议采用AK/SK方式。 询问永洪客服,获取永洪SaaS生产环境用户账号和密码。 登入永洪SaaS生产环境,输入用户账号和密码。
  • 提交命令 假设用例代码打包后的jar包名为spark-hbaseContext-test-1.0.jar,并将jar包放在客户端“$SPARK_HOME”目录下,以下命令均在“$SPARK_HOME”目录执行,Java接口对应的类名前有Java字样,请参考具体样例代码进行书写。 yarn-client模式: java/scala 版本(类名等请与实际代码保持一致,此处仅为示例) bin/spark-submit --master yarn --deploy-mode client --class com.huawei.bigdata.spark.examples.hbasecontext.JavaHBaseBulkDeleteExample SparkOnHbaseJavaExample-1.0.jar bulktable python版本(文件名等于实际保持一致,此处仅为示例) bin/spark-submit --master yarn --deploy-mode client --jars SparkOnHbaseJavaExample-1.0.jar HBaseBulkDeleteExample.py bulktable yarn-cluster模式: java/scala 版本(类名等请与实际代码保持一致,此处仅为示例) bin/spark-submit --master yarn --deploy-mode cluster --class com.huawei.bigdata.spark.examples.hbasecontext.JavaHBaseBulkDeleteExample SparkOnHbaseJavaExample-1.0.jar bulktable python版本(文件名等于实际保持一致,此处仅为示例) bin/spark-submit --master yarn --deploy-mode cluster --jars SparkOnHbaseJavaExample-1.0.jar HBaseBulkDeleteExample.py bulktable
  • Python样例代码 下面代码片段仅为演示,具体代码参见SparkOnHbasePythonExample中HBaseBulkDeleteExample文件: def main(args: Array[String]) { # -*- coding:utf-8 -*- """ 【说明】 由于pyspark不提供Hbase相关api,本样例使用Python调用Java的方式实现 """ from py4j.java_gateway import java_import from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession\ .builder\ .appName("JavaHBaseBulkDeleteExample")\ .getOrCreate() # 向sc._jvm中导入要运行的类 java_import(spark._jvm, 'com.huawei.bigdata.spark.examples.hbasecontext.JavaHBaseBulkDeleteExample') # 创建类实例并调用方法,传递sc._jsc参数 spark._jvm.JavaHBaseBulkDeleteExample().execute(spark._jsc, sys.argv) # 停止SparkSession spark.stop()
  • 打包项目 通过IDEA自带的Maven工具,打包项目,生成jar包。具体操作请参考在Linux环境中编包并运行Spark程序。 将打包生成的jar包上传到Spark客户端所在服务器的任意目录(例如“$SPARK_HOME” )下。 若运行“Spark on HBase”样例程序,需要在Spark客户端的“spark-defaults.conf”配置文件中将配置项“spark.yarn.security.credentials.hbase.enabled”设置为“true”(该参数值默认为“false”,改为“true”后对已有业务没有影响。如果要卸载HBase服务,卸载前请将此参数值改回“false”),将配置项“spark.inputFormat.cache.enabled”设置为“false”。
  • 打包项目 通过IDEA自带的Maven工具,打包项目,生成jar包。具体操作请参考在Linux环境中调测Spark应用。 将打包生成的jar包上传到Spark客户端所在服务器的任意目录(例如“$SPARK_HOME” )下。 若运行“Spark on HBase”样例程序,需要在Spark客户端的“spark-defaults.conf”配置文件中将配置项“spark.yarn.security.credentials.hbase.enabled”设置为“true”(该参数值默认为“false”,改为“true”后对已有业务没有影响。如果要卸载HBase服务,卸载前请将此参数值改回“false”),将配置项“spark.inputFormat.cache.enabled”设置为“false”。