-
PySpark 是 Apache Spark 的 Python API,用于大规模数据处理。定义与延迟执行:当你调用 df = spark.read.csv(...), df2 = df.filter(df.age > 21), df3 = df2.groupBy(...).agg(...) 时,这些操作并不会立刻读取数据或进行计算。它们只是在构建一个逐步增强的查询计划,称为 Logical Plan(逻辑计划)。优化过程:逻辑计划:表示用户想要执行的抽象操作(读数据、过滤、分组聚合)。物理计划:Spark 的优化器(Catalyst)接收逻辑计划,应用大量优化规则(如谓词下推、常量折叠、列剪枝等),生成多个可能的物理计划。物理计划描述了如何在集群上具体执行这些操作(例如,选择 broadcast join 还是 sort merge join)。成本优化:Catalyst 可能会基于成本和统计信息选择最优的物理计划。执行:最优的物理计划被翻译成 DAG of Stages,进一步分解为可以在集群节点上并行运行的 Tasks。这些 Task 由 Spark 的执行引擎管理,最终在 JVM(Java 虚拟机)的 Executor 中运行,Python 代码通过 Py4J 桥接与 JVM 通信,数据通过 Arrow 进行高效交换。总之:PySpark 就像是一个建筑设计师。你用图纸(Python代码)告诉他要盖什么样的房子(最终数据结果),他会设计出最优的施工方案(逻辑/物理计划),并指挥施工队(Spark集群)高效地完成建设,而你无需关心具体怎么拌水泥、怎么砌砖。
-
华为云师资培训系列直播间抽奖公布如下:华为云师资培训——《云计算》课程直播抽奖公布序号姓名直播活动场次抽奖类型轮次本轮奖品中奖人账号1鲍*泓华为云师资培训——《云计算》课程口令抽奖1HDC定制雨伞b43***c2朱*星华为云师资培训——《云计算》课程口令抽奖1HDC定制雨伞233***a3涂*明华为云师资培训——《云计算》课程口令抽奖1HDC定制雨伞57a***64秦*煜华为云师资培训——《云计算》课程口令抽奖2HDC定制T恤d53***15鄂*龙华为云师资培训——《云计算》课程口令抽奖2HDC定制T恤3d4***96张*华为云师资培训——《云计算》课程在线时长抽奖3华为耳机8b2***d 华为云师资培训——《软件工程》课程直播抽奖公布序号姓名直播活动场次抽奖类型轮次本轮奖品中奖人账号1钟*山华为云师资培训——《软件工程》课程口令抽奖1HDC定制雨伞238***32孙*峰华为云师资培训——《软件工程》课程口令抽奖1HDC定制雨伞8af***93逄*勒华为云师资培训——《软件工程》课程口令抽奖1HDC定制雨伞650***a4 华为云师资培训——《软件工程》课程口令抽奖2HDC定制T恤fe9***75吴*伟华为云师资培训——《软件工程》课程口令抽奖2HDC定制T恤3e6***e6邱*志华为云师资培训——《软件工程》课程在线时长抽奖3华为耳机c3d***3 华为云师资培训——《大数据》课程直播抽奖公布序号姓名直播活动场次抽奖类型轮次本轮奖品中奖人账号1祝*哲华为云师资培训——《大数据》课程口令抽奖1HDC定制雨伞10a***82陈*华为云师资培训——《大数据》课程口令抽奖1HDC定制雨伞b3b***c3彭*和华为云师资培训——《大数据》课程口令抽奖1HDC定制雨伞3c7***d4小*华为云师资培训——《大数据》课程口令抽奖2HDC定制T恤512***95李*华为云师资培训——《大数据》课程口令抽奖2HDC定制T恤521***a6戴*华为云师资培训——《大数据》课程在线时长抽奖3华为耳机b38***1*未填写收件信息的视为自动放弃。
-
学习目标 能够了解Hadoop部署的意义 能够了解不同部署模式区分依据 1)要求通过部署Hadoop过程了解Hadoop工作方式,进一步了解Hadoop工作原理。2)本地模式、伪分布式、完全分布式区分依据主要的区别依据是NameNode、 DataNode、 ResourceManager、 NodeManager等模块运行在几个JVM进程、几个 机器。如下表所示:模式名称各个模块占用JVM进程数各个模块运行在几台机器上单机11伪分布式N1完全分布式NNHA+完全分布式NN 八、单机(本地模式)部署学习目标w 能够了解Hadoop默认部署模式w 能够掌握Hadoop部署软件包获取 w 能够对部署完成的Hadoop进行测试1.1)单机部署模式介绍. 单机(本地模式)是Hadoop的默认部署模式。 当配置文件为空时, Hadoop完全运行在本地。. 不需要与其他节点交互,单机(本地模式)就不使用HDFS ,也不加载任何Hadoop的守护进程。 该模式主要用于开发调试MapReduce程序的应用逻辑。 1.2)部署软件包获取1.2.1 )获取hadoop软件包 [root@localhost ~]#wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz1.2.2)获取JDK软件包 1 [root@localhost ~]#firefox http://download.oracle.com 1.3)部署1.3.1)jdk部署[root@localhost ~]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local [root@localhost ~]# cd /usr/local[root@localhost local]# mv jdk1.8.0_191 jdk解压到指定目录后,请修改目录名称1.3.2 )hadoop部署[root@localhost ~]# tar xf hadoop-2.8.5.tar.gz -C /opt [root@localhost ~]# cd /opt[root@localhost opt]# mv hadoop-2.8.5 hadoop解压至指定目录后,请修改目录名称1.3.3 )Linux系统环境变量 [root@localhost ~]# vim /etc/profileexport JAVA_HOME=/usr/local/jdkexport HADOOP_HOME=/opt/hadoopexport PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:$PATH 1.3.4)应用测试1.3.4.1 )加载环境变量1 [root@localhost ~]# source /etc/profile1.3.4.2 )测试hadoop可用性[root@localhost ~]# mkdir /home/input[root@localhost ~]# cp /opt/hadoop/etc/hadoop/*.xml /home/input[root@localhost ~]# hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /home/input/ /home/output/00[root@localhost ~]# cat /home/output/00/*输出目录中有_SUCCESS文件说明JOB运行成功, part-r-00000是输出结果文件。1.3.4.3 )词频统计练习要求 :1. 制作 一个文件,里面包含10-20不同的或部分相同的单词。2. 使用wordcount方法实现单词出现频率统计。九、伪分布式部署学习目标w 能够了解伪分布式部署模式 w 能够正确修改配置文件w 能够掌握YARN架构及架构角色功能w 能够对已部署的Hadoop集群进行应用测试1)伪分布式部署模式介绍 Hadoop守护进程运行在本地机器上,模拟一个小规模的的集群。. 该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况, HDFS输入/输出,以及其他的守护进 程交互。2)获取软件包可参考:第八节 1.2.1与1.2.2小节3)修改配置文件主要涉及的配置文件有: hadoop-env.sh、 mapred-env.sh、yarn-env.sh、core-site.xml3.1 )修改hadoop-env.sh、 mapred-env.sh、yarn-env.sh文件中JAVA_HOME参数1 [root@localhost ~]# vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh修改JAVA_HOME参数为 :export JAVA_HOME=/usr/local/jdk修改 mapred-env.sh、yarn-env.sh3.2)修改core-site.xml绑定主机名和域名[root@hadoop ~]# vim /etc/hosts...192.168.57.50 hd1[root@hadoop ~]# vim ${HADOOP_HOME}/etc/hadoop/core-site.xml(1) 配置fs.defaultFS,配置FS部署的节点<property> <name>fs.defaultFS</name> <value>hdfs://hd1:8020</value> </property>(2) 配置hadoop临时目录<property> <name>hadoop.tmp.dir</name> <value>/opt/data/tmp</value> </property>配置临时目录前,请先创建此目录,不创建也可以。HDFS的NameNode数据默认都存放这个目录下,查看 *-default.xml等默认配置文件,就可以看到很多依赖 ${hadoop.tmp.dir} 的配置。默认的 hadoop.tmp.dir是 /tmp/hadoop-${user.name} ,此时有个问题就是NameNode会将HDFS的元数据存 储在这个/tmp目录下,如果操作系统重启了,系统会清空/tmp目录下的东西,导致NameNode元数据丢失, 是个非常严重的问题,所有我们应该修改这个路径。3.3)配置hdfs-site.xml1 [root@localhost ~]# vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml<property><name>dfs.replication</name><value>1</value></property>dfs.replication配置的是HDFS存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为 1。3.4)格式化hdfs[root@localhost ~]# hdfs namenode -format格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在 NameNode中。格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data/tmp目录)指定的目录下是否有了dfs目录,如 果有,说明格式化成功。3.5)查看hdfs临时目录1 [root@localhost ~]# ls /opt/data/tmp/dfs/name/current fsimage是NameNode元数据在内存满了后,持久化保存到的文件。 fsimage*.md5 是校验文件,用于校验fsimage的完整性。 seen_txid 是hadoop的版本 vession文件里保存: namespaceID :NameNode的唯一ID。 clusterID:集群ID ,NameNode和DataNode的集群ID应该一致,表明是一个集群。4)启动角色请把hadoop安装目录中的sbin目录中的命令添加到/etc/profile环境变量中,不然无法使用hadoop- daemon.sh4.1 )启动namenode将hadoop安装目录中的sbin目录添加到/etc/profile文件中[root@localhost ~]# vim /etc/profile修改此配置。添加sbin目录export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/sbin:${HADOOP_HOME}/bin:$PATH[root@localhost ~]# . /etc/profile[root@localhost ~]# hadoop-daemon.sh start namenode4.2)启动datanode1 [root@localhost ~]#hadoop-daemon.sh start datanode4.3)验证JPS命令查看是否已经启动成功,有结果就是启动成功了。1 [root@localhost ~]#jps5) HDFS上测试创建目录、上传、下载文件5.1)创建目录查看根目录[root@localhost ~]# hdfs dfs -ls /创建[root@localhost ~]# hdfs dfs -mkdir /test[root@localhost ~]# hdfs dfs -ls /5.2)上传文件[root@localhost ~]# echo “123”>1.txt[root@localhost ~]# hdfs dfs -put 1.txt /test[root@localhost ~]# hdfs dfs -ls /test5.3)读取内容1 [root@localhost ~]# hdfs dfs -cat /test/1.txt5.4)下载文件到本地1 [root@localhost ~]# hdfs dfs -get /test/1.txt 6)配置yarn6.1)Yarn介绍. A framework for job scheduling and cluster resource management.。 功能:任务调度 和 集群资源管理. YARN (Yet An other Resouce Negotiator) 另一种资源协调者是 Hadoop 2.0新增加的一个子项目,弥补了Hadoop 1.0(MRv1)扩展性差、可靠性资源利用率低以及无法支持 其他计算框架等不足。 Hadoop的下一代计算框架MRv2将资源管理功能抽象成一个通用系统YARN. MRv1的 jobtracker和tasktrack也不复存在,计算框架 (MR, storm, spark)同时运行在之上,使得hadoop进入了多计算框架的弹性平台时代。 总结: yarn是一种资源协调者 . 从mapreduce拆分而来 带来的好处:让hadoop平台性能及扩展性得到更好发挥6.2)使用Yarn好处 在某些时间,有些资源计算框架的集群紧张,而另外一些集群资源空闲。 那么这框架共享使用一个则可以大提高利率些集群资源空闲。 维护成本低。 数据共享。 避免了集群之间移动数据。 YARN 主从架构o ResourceManager 资源管理 o NodeManager 节点管理o ResourceManager负责对各个NodeManager 上的资源进行统一管理和任务调度。 o NodeManager在各个计算节点运行,用于接收RM中ApplicationsManager 的计算任务、启动/停止任务、和RM中 Scheduler 汇报并协商资源、监控并汇报本节点的情况。6.3) 配置mapred-site.xml默认没有mapred-site.xml文件,但是有个mapred-site.xml.template配置模板文件。复制模板生成mapred- site.xml。[root@localhost ~]# cd /opt/hadoop/etc/hadoop[root@localhost ~]# cp mapred-site.xml.template mapred-site.xml[root@localhost ~]# vim mapred-site.xml<property><name>mapreduce.framework.name</name> <value>yarn</value></property>指定mapreduce运行在yarn框架上。6.4)配置yarn-site.xml[root@localhost ~]# vim yarn-site.xml<property><name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value></property> <property><name>yarn.resourcemanager.hostname</name> <value>hd1</value></property>yarn.nodemanager.aux-services配置了yarn的默认混洗方式,选择为mapreduce的默认混洗算法。 yarn.resourcemanager.hostname指定了Resourcemanager运行在哪个节点上。6.5)启动yarn启动yarn之前要保证NameNode和DataNode启动[root@localhost ~]# jps如果没有发现DataNode和NameNode。则启动[root@localhost ~]# hadoop-daemon.sh start namenode[root@localhost ~]# hadoop-daemon.sh start datanode1 [root@localhost ~]# yarn-daemon.sh start resourcemanager1 [root@localhost ~]# yarn-daemon.sh start nodemanager1 [root@localhost ~]# jps6.6)YARN的Web页面YARN的Web客户端端口号是8088 ,通过http://IP:8088可以查看。6.7)测试在Hadoop的share 目录里,自带了一些jar包,里面带有一些mapreduce实例小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar ,可以运行这些例子体验刚搭建好的Hadoop 平台,我们这里来运行最经典的WordCount实例。# hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /test /output/00# hdfs dfs -ls /output6.7.1)创建目录[root@localhost ~]# hdfs dfs -mkdir -p /test/input[root@localhost ~]# vim /opt/data/wc.inputtom jimehadoop hivehbase hadoop tom创建原始文件:在本地/opt/data目录创建一个文件wc.input,内容如下:tom jimehadoop hivehbase hadoop tom6.7.2) 上传文件将wc.input文件上传到HDFS的/test/input目录中:1 [root@localhost ~]# hdfs dfs -put /opt/data/wc.input /test/input6.7.3) 运行实例[root@localhost ~]#yarn jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /test/input /test/output6.7.4)查看输出结果 [root@localhost ~]#hdfs dfs -ls /test/outputoutput目录中有两个文件, _SUCCESS文件是空文件,有这个文件说明Job执行成功。part-r-00000文件是结果文件,其中-r-说明这个文件是Reduce阶段产生的结果, mapreduce程序执行时,可 以没有reduce阶段,但是肯定会有map阶段,如果没有reduce阶段这个地方有是-m-。一个reduce会产生一个part-r-开头的文件。7)停止hadoop[root@localhost ~]#hadoop-daemon.sh stop namenode[root@localhost ~]#hadoop-daemon.sh stop datanode[root@localhost ~]#yarn-daemon.sh stop resourcemanager[root@localhost ~]#yarn-daemon.sh stop nodemanager
-
直播时间:2025/8/12 15:00-16:30 直播嘉宾:贺行简-DTSE开发者技术专家吕晨-DTSE开发者技术专家 立即报名,参与直播!直播间可抽取华为耳机、华为定制雨伞、定制T恤哦~cid:link_0 直播链接:cid:link_1 直播简介:华为云师资培训直播,带您掌握产业级大数据课程体系与华为开发者空间实战能力,助力高校数字化转型!
-
体验华为开发者空间大数据案例——Docker安装Flink实现数据实时统计,反馈改进建议,请直接在评论区反馈即可体验指导:cid:link_0
-
[问题求助] 【麒麟V10】麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台报错RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoo麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台,报错:2025-05-20 16:49:12,547 - The 'hadoop-hdfs-client' component did not advertise a version. This may indicate a problem with the component packaging.Traceback (most recent call last): File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/hdfs_client.py", line 78, in <module> HdfsClient().execute() File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 352, in execute method(env) File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/hdfs_client.py", line 37, in install self.install_packages(env) File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 853, in install_packages retry_count=agent_stack_retry_count) File "/usr/lib/ambari-agent/lib/resource_management/core/base.py", line 166, in __init__ self.env.run() File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 160, in run self.run_action(resource, action) File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 124, in run_action provider_action() File "/usr/lib/ambari-agent/lib/resource_management/core/providers/packaging.py", line 30, in action_install self._pkg_manager.install_package(package_name, self.__create_context()) File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 219, in install_package shell.repository_manager_executor(cmd, self.properties, context) File "/usr/lib/ambari-agent/lib/ambari_commons/shell.py", line 753, in repository_manager_executor raise RuntimeError(message)RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoop_3_1_5_0_152', exited with code '1', message: 'Error: Problem: cannot install the best candidate for the job - nothing provides redhat-lsb needed by hadoop_3_1_5_0_152-3.1.1.3.1.5.0-152.x86_64服务器和ambari版本信息如下截图:求助大佬帮助解决,感谢。
-
【HDC2025】 HDC2025大会,大家希望现场能看到那些技术
-
优化器的计划生成方法cid:link_1多列过滤条件估算思想cid:link_2JoinRel 行数估算cid:link_3多组Join条件估算思想cid:link_4路径生成cid:link_5最优路径cid:link_6Join Path的生成cid:link_7Aggregate Path 的生成cid:link_8静态内存管理机制及限制cid:link_9下盘机制cid:link_10内存自适应技术cid:link_11生成计划cid:link_0内存自适应的使用和参数控制cid:link_12简单查询代价估算详解cid:link_13最简单的表的行数估算https://bbs.huaweicloud.com/forum/thread-0275182961438721078-1-1.html
-
统计信息是历史数据,表的元组数在随时变化。例如:Analyze数据采样时有10个页面,存在50条元组;实际执行时有20个页面,可能存在多少条元组?用你最朴素的情感想一想是不是,很可能是100条元组对不对? 表大小的估算方法在函数estimate_rel_size -> table_relation_estimate_size -> heapam_estimate_rel_size 中。 1) 先通过表物理文件的大小计算实际页面数 actual_pages = file_size / BLOCKSIZE; 2) 计算页面的元组密度 a) 如果relpages大于0,density = reltuples / (double) relpages; b) 如果relpages为空,density = (BLCKSZ - SizeOfPageHeaderData) / tuple_width, 页面大小 / 元组宽度。 3) 估算表元组个数 = 页面元组密度 * 实际页面数 = density * actual_pages 所以,估算rows的10000 = (10000 / 358) * 358,历史页面密度 * 新的页面数,以推算当前元组数。查询引擎在查询语法树的WHERE子句中识别出比较条件,再到pg_operator中根据操作符和数据类型找到oprrest为scalarltsel,这是通用的标量数据类型的小于操作符的代价估算函数。最终是在 scalarineqsel -> ineq_histogram_selectivity 中进行直方图代价估算。 在PG中采用的是等高直方图,也叫等频直方图。将样本范围划分成N等份的若干个子区间,取所有子区间的边界值,构成直方图。 使用:使用时认为子区间(也叫桶)内的值是线性单调分布的,也认为直方图的覆盖范围就是整个数据列的范围。因此,只需计算出在直方图中的占比,既是总体中的占比。
-
生命周期:词法分析(Lex) -> 语法分析(YACC) -> 分析重写 -> 查询优化(逻辑优化和物理优化) -> 查询计划生成 -> 查询执行。词法分析:描述词法分析器的*.l文件经Lex 工具编译生成lex.yy.c, 再由 C编译器生成可执行的词法分析器。基本功能就是将一堆字符串根据设定的保留关键字和非保留关键字,转化成相应的标识符。SQL生命周期:词法分析(Lex) -> 语法分析(YACC) -> 分析重写 -> 查询优化(逻辑优化和物理优化) -> 查询计划生成 -> 查询执行。 词法分析:描述词法分析器的*.l文件经Lex工具编译生成lex.yy.c, 再由C编译器生成可执行的词法分析器。基本功能就是将一堆字符串根据设定的保留关键字和非保留关键字,转化成相应的标识符(Tokens); 语法分析:语法规则描述文件*.y经YACC工具编译生成gram.c,再由C编译器生成可执行的语法分析器。基本功能就是将一堆标识符(Tokens)根据设定的语法规则,转化成原始语法树; 分析重写:查询分析将原始语法树转换为查询语法树(各种transform); 查 询 重写根据pg_rewrite中的规则改写表和视图,最终得到查询语法树; 查询优化:经过逻辑优化和物理优化(生成最优路径); 查询计划生成:将最优的查询路径转化为查询计划; 查询执行:通过执行器去执行查询计划生成查询的结果集。 在物理优化阶段,同样的一条SQL语句可以产生很多种查询路径,例如:多表JOIN操作,不同的JOIN顺序产生不同的执行路径,也导致中间结果元组规模的不同。查询引擎会在所有可行的查询访问路径中选择执行代价最低的一条。 通常我们依据 COST = COST(CPU) + COST(IO) 这一公式来选择最优执行计划。这里最主要的问题是如何确定满足某个条件的元组数量,基本方法就是依据统计信息和一定的统计模型。某条件的查询代价 = tuple_num * per_tuple_cost。
-
通过开启use_workload_manager 和 enable_dynamic_workload 两个参数开启GaussDB(DWS)的内存自适应控制机制。 使用内存自适应机制时,打印SQL语句的explain performance执行计划运行信息时,会包含以下额外的信息辅助定位问题: 1) 在最下方的 Query Summary 一栏中,会显示出 System available mem、Query max mem和Query estimated mem,分别表示:系统当前可用内存、语句可用最大内存(系统可用最大内存),语句估算内存使用量,均为单DN的衡量值。表示当前语句的语句最大可用内存和系统当前可用内存均为 22G,语句估算内存使用为1.6G;2) 在Memory Information一栏,会显示CN和每个DN的内存使用峰值,语句实际内存使用,单DN使用16GB,CN使用76MB;3) 在Memory Information一栏下方每个算子对应的位置,会显示每个算子单DN的内存峰值,同时会显示每个DN上内存使用的自动扩展和提前下盘情况,可以看出第15号HashJoin算子,每个SMP线程的内存使用均为3.8GB,估算内存是860MB,经历了五次内存自动扩展,在第五次扩展后,系统内存告急,算子未用到第五次扩展后的峰值即提前下盘;4) 在explain performance最顶层的表格中,汇总了每个算子的估算内存和实际使用内存的情况,见下图的E-memory和Peak Memory两列所示。与上面信息对应,第15号算子单SMP线程的peak memory,最大值为3766MB,最小值为3753MB,估算内存值(单DN4个SMP线程)为860MB。
-
1) 对于每个 SQL,生成计划前首先从资源管理模块获取系统当前的最大可用内存(Query Max Mem)和当前可用内存(System Available Mem)。最大可用内存通常为每个DN的最大可用内存去除系统预分配内存,例如:数据缓存等,表示语句可用的最大内存,如果语句使用内存超过该值,必须下盘。当前可用内存用于表示当前系统的繁忙程度,如果当前可用内存比较小,倾向于选择耗费内存少的计划; 2) 依据当前可用内存生成计划,同时根据SQL引擎优化器计划生成过程中的cost估算值估算每个物化算子的内存使用量,以及流水线场景下整个查询使用的内存总量估算值。如果该值大于当前可用内存,则尝试将整个查询的内存使用量调到当前可用内存以下,此时会造成部分算子下盘; 3) 将语句及估算的语句内存发送到CCN,如果当前可用内存小于语句估算内存,则估算语句的内存进一步减少是否对查询性能造成较大的影响,如果根据cost评估影响不大,则进一步减少算子的内存使用,使语句内存使用满足当前可用内存,将语句下发执行,否则则进入排队状态; 4) 由于每个算子的内存使用量是基于 cost 评估获得,可能存在一定的误差。因此,在SQL语句执行时,支持内存的动态调整,包括:执行算子内存的自动扩展和提前下盘。当算子达到估算的内存值上限,但系统还有宽裕的内存时,会进行算子内存的扩展,继续保持不下盘的状态。当系统已用内存达到80%或更高时,如果算子已有最小内存保证,则会触发提前下盘逻辑,保证不会由于内存不足而报错。
-
针对静态内存管理机制的弊端,GaussDB(DWS)设计实现了内存自适应控制技术,主要目的如下: GaussDB(DWS)技术原理-优化器 1) 去除静态内存管理对work_mem的依赖。可以由SQL引擎优化器模块自动估算每个算子所需的内存; 2) 避免大并发场景下内存不足现象的发生。资源管理模块根据SQL引擎优化器对于每个查询内存的估算值,对每个查询进行调度,如果超过系统可用内存,则进行排队。 动态资源管理与内存自适应技术的组件图如上图所示。我们从多个CN中选择一个CN,命名为 CCN(Central CN),进行语句队列的管理。对于每个查询SQL,CN在生成完执行计划后,为每个物化算子分配合适的内存,同时计算整个语句内存使用量,并将语句及对应的内存使用量发给CCN。CCN维护系统可用的内存值,对于新来的语句,如果语句内存使用量小于可用内存值,则允许其下发到DN执行,否则挂起,等到有语句结束释放内存后再次将其唤醒,是否可以下发。
-
GaussDB(DWS)也提供下盘的机制,当上述操作符需要使用的内存太大时,可以将部分或全部的数据下盘处理,提高内存的使用效率,但相应的查询性能也会受到影响。PG 使用 work_mem 参数来控制算子可使用内存的阈值,当使用内存超过阈值时,就需要做下盘处理。GaussDB(DWS)的静态内存管理机制也延续了 PG 的处理机制,使用work_mem来控制单算子的内存使用上限。 静态内存管理存在较大弊端,需要调优人员能够根据数据量、语句复杂程度和系统的内存大小设置合理的work_mem,既避免 work_mem设置太大导致系统资源不够用,还要考虑到数据规模,保证大部分算子不下盘。通常情况下,这个是很难做到的,有以下几点原因: 1) 通常情况下,复杂语句的执行计划中包含多个复杂算子,每个算子的内存使用上限是work_mem,我们没有办法计算一个语句要使用多少内存,因此也就不容易设置一个最优的work_mem参数,保证尽可能不下盘,同时内存又够用。并发场景更无法设置了; 2) work_mem只是每个算子内存使用的上限,并不是预分配;如果数据量没有那么大的话,实际内存使用是达不到work_mem的。因此也会影响work_mem的设置; 3) 每个语句的场景不一样,有的语句包含多个物化算子,而另外的语句只有一个物化算子,而这个算子对内存的需求会比较大,因此无法全局统一地进行设置。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签