【数据结构】堆(二)
把每天当作最后一天来过,那么你就能够学会珍惜。你珍惜了时间,时间自然会对你有所回报。目录 🎄堆的创建:堆排序: 向下调整的时间复杂度: 向上调整的时间复杂度: TOP-K问题: 🎄堆的创建:这次是是对上一章节进行了优化,可以替换掉HeapInit函数如需了解,请看http://t.csdn.cn/SEvl0这一文章,是堆的简单创建//堆的创建
void HeapCreat(HP* hph, HPDataType* a, int n)
{
assert(hph);
hph->a = (HPDataType*)malloc(sizeof(HPDataType) * n);
if (hph->a == NULL)
{
perror("malloc fail:");
exit(-1);
}
memcpy(hph->a, a, sizeof(HPDataType) * n);
hph->size = hph->capacity = n;
//建堆算法
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
AdjustDown(hph->a, n, i);
}
}
//堆的销毁
void HeapDestory(HP* hph)
{
assert(hph);
free(hph->a);
hph->a = NULL;
hph->capacity = 0;
hph->size = 0;
}
void TestHeap3()
{
int array[] = { 27, 15, 19, 18, 28, 34, 65, 49, 25, 37 };
HP hp;
HeapCreat(&hp, array, sizeof(array) / sizeof(int));
HeapPrint(&hp);
HeapDestory(&hp);
}堆排序: 实现堆排序:向下调整优于向上调整(下面时间复杂度详解)先利用Ajustdown排序好数组,然后再用交换Ajustdown实现小堆。void HeapSort(HPDataType* a,int n)
{
//这里采用向下调整O(n)
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
AdjustDown(a, n, i);
}
int end = n - 1;
//N*O(m=n)
while (end > 0)
{
Swap(&a[0], &a[end]);
AdjustDown(a, end, 0);
--end;
}
}
void TestHeap4()
{
int array[] = { 27, 15, 19, 18, 28, 34, 65, 49, 25, 37 };
HeapSort(array, sizeof(array) / sizeof(HPDataType));
for (int i = 0; i < sizeof(array) / sizeof(HPDataType); i++)
{
printf("%d ", array[i]);
}
}向下调整的时间复杂度://向下调整
void AdjustDown(HPDataType* a, int n, int parent)
{
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1< n && a[child] > a[child + 1])
{
child = child + 1;
}
//child 大于 parent 就交换
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}假设树高为h:第一层有2^0个结点;第二层有2^1个结点;第三层有2^2个结点;第h层有2^(h-1)个结点;进行向下调整的时候要向下调整:第一层要想下调整2^0*(h-1)次;第二层要想下调整2^1*(h-2)次;第h-1层要想下调整2^(h-2)*1次;第h层要想下调整2^(h-1)*0次;当h高的次数,最多调整层数为:F(h)= 2^(h-2)*1+2^(h-3)*2+..........+2^2*(h-3)+2^1*(h-2)+2^0*(h-1) ——①2*F(h)= 2^(h-1)*1+2^ (h-2)*2+2^(h-3)*3+.........+2^2*(h-2)+2^1*(h-1) ——②有错位相减②-①可得:F(h)= 2^(h-1) + 2^(h-2) + 2^(h-3) +......+ 2^2 + 2^1 - h-1F(h)=2^h-1-h ——③ 当树高为h时,节点总个数N为:N=2^0+2^1+...+2^(h-2)+2^(h-1)N=2^h-1 ——④有④可得:h=log(N+1) ——⑤综合③④⑤可得:F(N)=N-log(N+1)因此时间复杂度为O(N)向上调整的时间复杂度://向上调整
//child和parent都是下标
void AdjusUp(HPDataType* a, int child)
{
int parent = (child - 1) / 2;
while (child>0)
{
if (a[parent] < a[child])
{
Swap(&a[parent], &a[child]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}F(h)=2^1*1+2^2*2+....+2^(h-1)*(h-1)。由错位相减可得:F(N)=2N(1-log(N+1))时间复杂度为O(N*logN)TOP-K问题: TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能 数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:用数据集合中前K个元素来建堆 前k个最大的元素,则建小堆 前k个最小的元素,则建大堆用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素 将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。
void TestHeap6()
{
// 造数据
int n, k;
printf("请输入n和k:>");
scanf("%d%d", &n, &k);
srand(time(0));
FILE* fin = fopen("Data1.txt", "w");
if (fin == NULL)
{
perror("fopen fail");
return;
}
int randK = k;
for (size_t i = 0; i < n; ++i)
{
//随机数插入
int val = rand() % 10000;
fprintf(fin, "%d\n", val);
}
fclose(fin);
/
// 找topk
FILE* fout = fopen("Data1.txt", "r");
if (fout == NULL)
{
perror("fopen fail");
return;
}
//int minHeap[5];
int* minHeap = malloc(sizeof(int) * k);
if (minHeap == NULL)
{
perror("malloc fail");
return;
}
for (int i = 0; i < k; ++i)
{
fscanf(fout, "%d", &minHeap[i]);
}
// 建小堆
for (int i = (k - 1 - 1) / 2; i >= 0; --i)
{
AdjustDown(minHeap, k, i);
}
int val = 0;
while (fscanf(fout, "%d", &val) != EOF)
{
if (val > minHeap[0])
{
minHeap[0] = val;
AdjustDown(minHeap, k, 0);
}
}
for (int i = 0; i < k; ++i)
{
printf("%d ", minHeap[i]);
}
printf("\n");
fclose(fout);
}
int main()
{
TestHeap6();
return 0;
}
分布式算法之一致性 Hash 算法
tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。
推荐:体系化学习Java(Java面试专题)
1、什么是一致性 Hash 算法
一致性哈希算法(Consistent Hashing)是一种分布式哈希算法,用于在分布式系统中解决节点动态变化带来的数据迁移问题。在一致性哈希算法中,哈希值的范围是一个环形空间,每个节点在环上占据一个位置,数据的哈希值也映射到环上,然后按照顺时针方向找到第一个节点,将数据存储在该节点上。当节点动态变化时,只需要对受影响的数据进行重新哈希,将其映射到新的节点上即可,无需对整个数据集进行重新分配。这种方式可以有效地减少数据迁移的开销,提高系统的可扩展性和稳定性。
2、一致性 Hash 算法详解
一致性哈希算法包含以下内容:
哈希环: 将数据的键值哈希到一个固定的范围内,通常是一个环形空间。
节点: 将节点的标识符哈希到环形空间上的一个位置,每个节点在环上占据一个位置。
数据分布: 将数据的键值哈希到环形空间上的一个位置,然后按照顺时针方向找到第一个节点,将数据存储在该节点上。
节点动态变化: 当节点动态变化时,只需要对受影响的数据进行重新哈希,将其映射到新的节点上即可,无需对整个数据集进行重新分配。
负载均衡: 由于节点在环上均匀分布,因此可以实现负载均衡,将数据均匀地分布在不同的节点上,避免单个节点的负载过高。
容错性: 由于节点在环上均匀分布,当某个节点发生故障时,只会影响其前一个节点到故障节点之间的数据,其他数据不会受到影响。 一致性哈希算法通过将数据的键值和节点的标识符映射到同一个环形空间上,实现了数据分布和负载均衡,并且具有良好的容错性和可扩展性。 2.1、Hash 环
哈希环(Hash Ring)是一种数据结构,通常用于实现一致性哈希算法。哈希环是一个环形结构,其中每个节点表示一个哈希值,节点按照哈希值的大小顺序排列,形成一个环。当需要将数据映射到节点时,可以通过哈希函数计算数据的哈希值,然后在哈希环上找到第一个大于等于该哈希值的节点,将数据映射到该节点上。
以下是自己手写一个 Hash 环的代码:
package com.pany.camp.algorithm;
import java.util.*;
/**
*
* @description: Hash 环
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-09 12:58
*/
public class HashRing<T> {
private final TreeMap<Integer, T> ring = new TreeMap<>();
private final HashFunction hashFunction;
public HashRing(Collection<T> nodes, HashFunction hashFunction) {
this.hashFunction = hashFunction;
for (T node : nodes) {
addNode(node);
}
}
public void addNode(T node) {
for (int i = 0; i < 3; i++) {
// 每个节点在哈希环上占据 3 个位置,增加数据的分布均匀性
int hash = hashFunction.hash(node.toString() + i);
ring.put(hash, node);
}
}
public void removeNode(T node) {
for (int i = 0; i < 3; i++) {
int hash = hashFunction.hash(node.toString() + i);
ring.remove(hash);
}
}
public T getNode(String key) {
if (ring.isEmpty()) {
return null;
}
int hash = hashFunction.hash(key);
if (!ring.containsKey(hash)) {
Map.Entry<Integer, T> entry = ring.ceilingEntry(hash);
if (entry == null) {
entry = ring.firstEntry();
}
return entry.getValue();
}
return ring.get(hash);
}
public interface HashFunction {
int hash(String key);
}
}
根据 Hash 环,举个一个负载均衡的例子。LoadBalancer 类封装了一个 HashRing 对象,用于存储服务器节点。构造函数中需要传入服务器集合,getServer 方法用于将请求映射到服务器节点上。在 main 方法中,创建一个 LoadBalancer 对象,然后循环发送 10 个请求,将请求映射到不同的服务器上。由于 HashRing 实现了一致性哈希算法,因此可以保证请求的负载均衡性。
package com.pany.camp.algorithm;
import java.util.*;
/**
*
* @description: 负载均衡
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-09 12:58
*/
public class LoadBalancer {
private final HashRing<String> serverRing;
public LoadBalancer(Collection<String> servers) {
serverRing = new HashRing<>(servers, key -> Math.abs(key.hashCode()));
}
public String getServer(String request) {
return serverRing.getNode(request);
}
public static void main(String[] args) {
List<String> servers = Arrays.asList("server1", "server2", "server3");
LoadBalancer lb = new LoadBalancer(servers);
for (int i = 0; i < 10; i++) {
String request = "request" + i;
String server = lb.getServer(request);
System.out.println("Request " + request + " is sent to server " + server);
}
}
}
2.2、增删节点
根据上面的 HashRing 解释一致性哈希算法的增删节点逻辑:
添加节点添加节点时,需要计算节点的哈希值,并将其添加到哈希环上。在 HashRing 中,可以通过 addNode 方法来添加节点。该方法首先计算节点的哈希值,然后将其添加到哈希环上。如果节点已经存在,则不会进行任何操作。通常情况下,每个节点会在哈希环上占据多个位置,以增加数据的分布均匀性。在 HashRing 中,可以通过 replicaCount 参数来指定每个节点在哈希环上占据的位置数。
删除节点删除节点时,需要将节点从哈希环上删除。在 HashRing 中,可以通过 removeNode 方法来删除节点。该方法首先计算节点的哈希值,然后将其从哈希环上删除。如果节点不存在,则不会进行任何操作。
查找节点查找节点时,需要先计算数据的哈希值,然后在哈希环上找到第一个大于等于该哈希值的节点,将数据映射到该节点上。如果不存在该节点,则取哈希环上最小的节点。在 HashRing 中,可以通过 getNode 方法来查找节点。该方法首先计算数据的哈希值,然后在哈希环上查找第一个大于等于该哈希值的节点。如果找不到该节点,则返回哈希环上最小的节点。
需要注意的是,当添加或删除节点时,可能会导致某些数据映射到新的节点上,从而需要重新分配数据。为了减少数据的迁移量,可以使用虚拟节点(也称为虚拟哈希环)来增加节点数量,从而使得每个节点在哈希环上占据更多的位置。在 HashRing 中,可以通过虚拟节点来实现。具体来说,可以为每个节点分配多个虚拟节点,然后将虚拟节点添加到哈希环上。这样,当添加或删除节点时,只需要重新分配少量的数据即可。
2.3、不平衡问题
一致性哈希算法的不平衡问题主要是由于节点数量过少或者节点分布不均匀所导致的。当节点数量较少时,可能会出现节点分布不均匀的情况,从而导致某些节点负载过重,而其他节点负载较轻。当节点分布不均匀时,可能会出现数据倾斜的情况,从而导致某些节点存储的数据过多,而其他节点存储的数据过少。
为了解决这个问题,可以采取以下措施:
增加节点数量增加节点数量可以增加哈希环上的节点数量,从而使得数据分布更加均匀。通常情况下,节点数量应该足够多,以保证数据分布的均匀性。
使用虚拟节点使用虚拟节点可以增加节点数量,从而使得每个节点在哈希环上占据更多的位置。这样可以减少数据的倾斜程度,从而提高负载均衡性。在 HashRing 中,可以通过虚拟节点来实现。
负载均衡策略
可以采用更加智能的负载均衡策略,例如基于节点负载情况的动态负载均衡策略。这样可以使得节点的负载更加均衡,从而提高系统的性能和可靠性。
2.4、虚拟节点
在一致性哈希算法中,虚拟节点是指将一个物理节点映射到多个虚拟节点上的技术。通过将一个物理节点映射到多个虚拟节点上,可以增加节点在哈希环上的占据位置,从而使得数据分布更加均匀。虚拟节点的数量可以根据需要进行调整,通常情况下,虚拟节点的数量要足够多,以保证数据分布的均匀性。
例如,在一个有 3 个物理节点的哈希环中,每个物理节点可以映射到 5 个虚拟节点上,这样总共就会有 15 个虚拟节点。当需要将一个数据存储到哈希环上时,首先需要计算该数据的哈希值,然后将其映射到离其最近的虚拟节点上。由于每个物理节点在哈希环上占据了多个虚拟节点的位置,因此可以使得数据分布更加均匀,从而提高负载均衡性。
虚拟节点的实现可以通过在哈希值的计算过程中,将物理节点和虚拟节点一起计算。在 HashRing 中,可以通过传递一个计算虚拟节点数量的函数来实现虚拟节点的功能。具体而言,计算虚拟节点数量的函数可以将物理节点和虚拟节点的编号拼接在一起,然后计算它们的哈希值。这样就可以将一个物理节点映射到多个虚拟节点上。
3、一致性 Hash 算法的应用
一致性哈希算法是一种常用的分布式算法,它在很多分布式系统和应用中得到了广泛的应用,下面介绍一些常见的应用场景:
分布式缓存一致性哈希算法被广泛应用于分布式缓存系统中,如 Memcached、Redis 等。在分布式缓存系统中,数据通常会被分散到多个缓存节点上,而一致性哈希算法可以有效地将数据均匀地分布到各个缓存节点上,从而提高缓存系统的性能和可扩展性。
负载均衡一致性哈希算法也可以用于负载均衡系统中,如 HTTP 负载均衡、DNS 负载均衡等。在负载均衡系统中,一致性哈希算法可以将请求均匀地分发到多个服务器上,从而提高系统的负载均衡性和可扩展性。
分布式数据库一致性哈希算法也可以用于分布式数据库系统中,如 Cassandra、MongoDB 等。在分布式数据库系统中,数据通常会被分散到多个节点上,而一致性哈希算法可以将数据均匀地分布到各个节点上,从而提高数据的可用性和可扩展性。
分布式文件系统一致性哈希算法也可以用于分布式文件系统中,如 HDFS、GlusterFS 等。在分布式文件系统中,文件通常会被分散到多个节点上,而一致性哈希算法可以将文件均匀地分布到各个节点上,从而提高文件系统的性能和可扩展性。
总之,一致性哈希算法是一种非常实用的分布式算法,可以在很多分布式系统和应用中发挥重要作用。
本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421喜欢的话记得点赞收藏啊
Hadoop家族学习路线图
HDFS:了解分布式文件系统 HDFS 的基本原理和使用方法,可参考 Hadoop 官方文档中的 HDFS Guide。 Apache Hadoop 3.3.5 – HDFS Users GuideMapReduce:了解分布式计算框架 MapReduce 的基本原理和使用方法,可参考 Hadoop 官方文档中的 MapReduce Tutorial。 Apache Hadoop 3.3.5 – MapReduce TutorialYARN:了解资源管理器 YARN 的基本原理和使用方法,可参考 Hadoop 官方文档中的 YARN Guide。 Apache Hadoop 3.3.5 – Apache Hadoop YARNHadoop Common:了解 Hadoop 公共库 Hadoop Common 的基本原理和使用方法,可参考 Hadoop 官方文档中的 Common Utilities Guide。 https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/CommonJars.htmlHive:了解基于 Hadoop 的数据仓库系统Hive 的基本原理和使用方法,可参考 Hive 官方文档中的 Hive Tutorial。 Tutorial - Apache Hive - Apache Software FoundationPig:了解数据流语言和运行环境 Pig 的基本原理和使用方法,可参考 Pig 官方文档中的 Pig Latin Basics。 Pig Latin BasicsHBase:了解分布式 NoSQL 数据库 HBase 的基本原理和使用方法,可参考 HBase 官方文档中的 HBase Reference Guide。 Apache HBase ™ Reference GuideZooKeeper:了解分布式应用程序协调服务 ZooKeeper 的基本原理和使用方法,可参考 ZooKeeper 官方文档中的 Getting Started Guide。 ZooKeeper: Because Coordinating Distributed Systems is a ZooSqoop:了解 Hadoop 和关系型数据库之间数据传输工具 Sqoop 的基本原理和使用方法,可参考 Sqoop 官方文档中的 User Guide。 Sqoop User Guide (v1.4.7)Flume:了解收集、聚合和移动大规模日志数据的分布式系统 Flume 的基本原理和使用方法,可参考 Flume 官方文档中的 User Guide。 Flume 1.11.0 User Guide — Apache FlumeSpark:了解基于内存的分布式计算框架 Spark 的基本原理和使用方法,可参考 Spark 官方文档中的 Quick Start。 Quick Start - Spark 3.4.0 Documentation 1. Hadoop家族产品接下来,我把这20个产品,分成了2类。第一类,是我已经掌握的第二类,是TODO准备继续学习的一句话产品介绍:Apache Hadoop:是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架构。Apache Hive:是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。Apache Pig:是一个基于Hadoop的大规模数据分析工具,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Apache HBase:是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。Apache Sqoop:是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Apache Zookeeper:是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务Apache Mahout:是基于Hadoop的机器学习和数据挖掘的一个分布式框架。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题。Apache Cassandra:是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Apache Avro:是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用。Avro是新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制Apache Ambari:是一种基于Web的工具,支持Hadoop集群的供应、管理和监控。Apache Chukwa:是一个开源的用于监控大型分布式系统的数据收集系统,它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。Apache Hama:是一个基于HDFS的BSP(Bulk Synchronous Parallel)并行计算框架, Hama可用于包括图、矩阵和网络算法在内的大规模、大数据计算。Apache Flume: 是一个分布的、可靠的、高可用的海量日志聚合的系统,可用于日志数据收集,日志数据处理,日志数据传输。Apache Giraph:是一个可伸缩的分布式迭代图处理系统, 基于Hadoop平台,灵感来自 BSP (bulk synchronous parallel) 和 Google 的 Pregel。Apache Oozie: 是一个工作流引擎服务器, 用于管理和协调运行在Hadoop平台上(HDFS、Pig和MapReduce)的任务。Apache Crunch: 是基于Google的FlumeJava库编写的Java库,用于创建MapReduce程序。与Hive,Pig类似,Crunch提供了用于实现如连接数据、执行聚合和排序记录等常见任务的模式库Apache Whirr: 是一套运行于云服务的类库(包括Hadoop),可提供高度的互补性。Whirr学支持Amazon EC2和Rackspace的服务。Apache Bigtop: 是一个对Hadoop及其周边生态进行打包,分发和测试的工具。Apache HCatalog: 是基于Hadoop的数据表和存储管理,实现中央的元数据和模式管理,跨越Hadoop和RDBMS,利用Pig和Hive提供关系视图。Cloudera Hue: 是一个基于WEB的监控和管理系统,实现对HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操作和管理。 2. Hadoop家族学习路线图下面我将分别介绍各个产品的安装和使用,以我经验总结我的学习路线。HadoopHadoop学习路线图Yarn学习路线图用Maven构建Hadoop项目Hadoop历史版本安装Hadoop编程调用HDFS海量Web日志分析 用Hadoop提取KPI统计指标用Hadoop构建电影推荐系统创建Hadoop母体虚拟机克隆虚拟机增加Hadoop节点R语言为Hadoop注入统计血脉RHadoop实践系列之一 Hadoop环境搭建用MapReduce实现矩阵乘法PageRank算法并行实现PeopleRank从社交网络中发现个体价值HiveHive学习路线图Hive安装及使用攻略Hive导入10G数据的测试R利剑NoSQL系列文章 之 Hive用RHive从历史数据中提取逆回购信息PigPig学习路线图ZookeeperZookeeper学习路线图ZooKeeper伪分步式集群安装及使用ZooKeeper实现分布式队列QueueZooKeeper实现分布式FIFO队列基于Zookeeper的分步式队列系统集成案例HBaseHBase学习路线图在Ubuntu中安装HBaseRHadoop实践系列之四 rhbase安装与使用MahoutMahout学习路线图用R解析Mahout用户推荐协同过滤算法(UserCF)RHadoop实践系列之三 R实现MapReduce的协同过滤算法用Maven构建Mahout项目Mahout推荐算法API详解从源代码剖析Mahout推荐引擎Mahout分步式程序开发 基于物品的协同过滤ItemCFMahout分步式程序开发 聚类Kmeans用Mahout构建职位推荐引擎Mahout构建图书推荐系统SqoopSqoop学习路线图CassandraCassandra学习路线图Cassandra单集群实验2个节点R利剑NoSQL系列文章 之 Cassandra
您好,我exec进入docker容器内部,
把polardb的日志拷贝出来可以吗?
问题一:您好,我exec进入docker容器内部, 把polardb的日志拷贝出来可以吗?但比较奇怪的是,刚安装的时候都可以正常启动和运行,重启服务器之后,PolarDB就可能无法正常启动。 问题二:大佬,我刚看了日志,报了这个错误 问题三: 显示的是这些进程 问题四:2023-05-19 00:00:03.599 [Scheduled-Jobs-Worker-Thread-27-thread-27] ERROR c.a.p.o.planmanager.PolarDbXSystemTableBaselineInfo - [] [TDDL] persist baseline_info error, BASELINE_IN = -578786680, tddl version: 5.4.15-20230419 java.sql.SQLException: Field 'tables_hashcode' doesn't have a default value at com.alibaba.polardbx.rpc.result.XResult.internalFetchOneObject(XResult.java:941) at com.alibaba.polardbx.rpc.result.XResult.internalFetchOneObject(XResult.java:557) at com.alibaba.polardbx.rpc.result.XResult.finishBlockMode(XResult.java:165) at com.alibaba.polardbx.rpc.client.XSession.execUpdate(XSession.java:1894) at com.alibaba.polardbx.rpc.pool.XConnection.execUpdate(XConnection.java:432) at com.alibaba.polardbx.rpc.compatible.XPreparedStatement.executeUpdateX(XPreparedStatement.java:302) at com.alibaba.polardbx.rpc.compatible.XPreparedStatement.executeUpdateX(XPreparedStatement.java:285) at com.alibaba.polardbx.rpc.compatible.XPreparedStatement.executeUpdate(XPreparedStatement.java:352) at com.alibaba.polardbx.optimizer.planmanager.PolarDbXSystemTableBaselineInfo.innerPersist(PolarDbXSystemTableBaselineInfo.java:421) at com.alibaba.polardbx.optimizer.planmanager.PolarDbXSystemTableBaselineInfo.persist(PolarDbXSystemTableBaselineInfo.java:367) at com.alibaba.polardbx.executor.scheduler.executor.spm.SPMBaseLineSyncScheduledJob.lambda$execute$0(SPMBaseLineSyncScheduledJob.java:120) at java.base/java.util.concurrent.ConcurrentHashMap$ValuesView.forEach(ConcurrentHashMap.java:4770) at com.alibaba.polardbx.executor.scheduler.executor.spm.SPMBaseLineSyncScheduledJob.execute(SPMBaseLineSyncScheduledJob.java:120) at com.alibaba.polardbx.executor.scheduler.ScheduledJobsManager$SchedulerExecutorRunner.executeByWaitPolicy(ScheduledJobsManager.java:500) at com.alibaba.polardbx.executor.scheduler.ScheduledJobsManager$SchedulerExecutorRunner.executeBySkipPolicy(ScheduledJobsManager.java:513) at com.alibaba.polardbx.executor.scheduler.ScheduledJobsManager$SchedulerExecutorRunner.call(ScheduledJobsManager.java:472) at com.alibaba.polardbx.executor.scheduler.ScheduledJobsManager$SchedulerExecutorRunner.call(ScheduledJobsManager.java:451) at com.alibaba.polardbx.common.async.AsyncCallableTask.call(AsyncCallableTask.java:54) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) 2023-05-19 00:00:04.519 [TsoFetcher] ERROR com.alibaba.polardbx.rpc.result.XResult - [] [TDDL] Prev unfinished: SET autocommit=1 status: XResultStart now: get_tso() status: XResultStart, tddl version: 5.4.15-20230419 2023-05-19 00:57:38.377 [main] WARN com.alibaba.polardbx.gms.ha.impl.StorageHaManager - [] [TDDL] register the learner info for [[]], add the [[]], remove the [[]], tddl version: 5.4.15-20230419 2023-05-19 00:57:38.555 [main] INFO com.alibaba.polardbx.config.loader.ServerLoader - [] Server Properties: {PATH=/home/polarx/polardbx/build/run/polardbx-engine/u01/mysql/bin:/home/polarx/polardbx/build/run/bin:/home/polarx/polardbx/build/run/polardbx-engine/u01/mysql/bin:/home/polarx/polardbx/build/run/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, java.specification.version=11, forceCleanup=false, sun.cpu.isalist=, mpp_notifyBlockedQueryMemory=16777216, sun.arch.data.model=64, processCclTriggerPeriod=2, maxAllowedPacket=16777216, socketSendBuffer=65536, java.vendor.url=https://www.redhat.com/, LD_LIBRARY_PATH=../lib/native, mpp_statusRefreshMaxWait=300000, sun.boot.library.path=/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64/lib, sun.java.command=com.alibaba.polardbx.server.TddlLauncher --port=, jdk.debug=release, initializeGms=false, LESSOPEN=||/usr/bin/lesspipe.sh %s, mpp_tpTaskWorkerThreadsRatio=4, metaDbRootPasswd=, java.specification.vendor=Oracle Corporation, mpp_queryDelayCount=3, java.version.date=2023-01-17, java.home=/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64, enableBucketExecutor=true, mpp_exchangeMaxResponseSize=1000000, apHaMode=RESERVE_ONE_SLAVE, supportSingleDbMultiTbs=false, java.specification.name=Java Platform API Specification, java.vm.specification.vendor=Oracle Corporation, mpp_apPriority=3, mpp_cpuCfsMinQuota=5, mpp_taskWorkerThreadsRatio=4, galaxyXProtocol=2, mpp_httpServerMaxThreads=200, dnPasswordKey=asdf1234ghjk5678, mpp_httpServerMinThreads=2, mpp_maxWorkerThreads=1024, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, java.runtime.version=11.0.18+10-LTS, masterInstanceId=polardbx-polardbx, file.encoding=UTF-8, clusterName=NULL, java.vendor.version=(Red_Hat-11.0.18.0.10-1.el7_9), enableMppWorker=true, mpp_remoteTaskMaxCallbackThreads=100, _=/usr/bin/java, timerTaskExecutor=8, java.io.tmpdir=/tmp, mpp_memoryRevokingTarget=0.75, secretKey=NULL, java.version=11.0.18, balanceWindow=NULL, java.vm.specification.name=Java Virtual Machine Specification, java.awt.printerjob=sun.print.PSPrinterJob, mpp_httpClientMaxConnections=1024, java.library.path=../lib/native:/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib, java.vendor=Red Hat, Inc., metaDbProp=allowMultiQueries=true&autoReconnect=false&characterEncoding=utf8&connectTimeout=10000&failOverReadOnly=false&rewriteBatchedStatements=true&socketTimeout=900000&useServerPrepStmts=false&useSSL=false&useUnicode=true, sun.io.unicode.encoding=UnicodeLittle, enableBalancer=false, maxConnection=20000, logicalDbWarmmingUpExecutorPoolSize=4, propertyFile=classpath:server.properties, TZ=Asia/Shanghai, managerExecutor=256, mpp_taskYieldThreads=1, shardDbCountEachStorageInst=8, user.timezone=Asia/Shanghai, timerExecutor=8, os.name=Linux, java.vm.specification.version=11, LOGNAME=polarx, allowSimpleSequence=false, unitName=NULL, user.home=/home/polarx, OLDPWD=/home/polarx, mpp_taskNotificationThreads=16, sslEnable=false, port=8527, mpp_cpuCfsMaxQuota=95, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.awt.headless=true, logback.configurationFile=/home/polarx/polardbx/build/run/polardbx-sql/bin/../conf/logback.xml, passwordRuleConfig=NULL, mpp_queryMaxDelayTime=1000, storageDbXprotoPort=0, enableRemoteRPC=false, polarxRootUser=polardbx_root, mpp_exchangeClientThreads=50, java.net.preferIPv4Stack=true, mpp_taskMaxRunTime=1800000, mpp_maxAvaliableSpaceThreshold=0.9, path.separator=:, metaDbExecutor=8, os.version=3.10.0-957.axs7.x86_64, BASE=/home/polarx/polardbx/build/run/polardbx-sql/bin/.., mpp_exchangeMaxErrorDuration=180000, mpp_exchangeMinErrorDuration=60000, engine=NULL, slowSqlTime=1000, java.vm.name=OpenJDK 64-Bit Server VM, mpp_taskInfoCacheMaxAliveMillis=60000, serverExecutor=1024, metaDbAddr=127.0.0.1:4886, appName=tddl, os.arch=amd64, metaDbUser=my_polarx, enableMpp=true, java.vm.info=mixed mode, sharing, HOSTNAME=0bb7bfdb3677, idleTimeout=28800000, mpp_httpClientMaxConnectionsPerServer=250, processorHandler=16, java.class.version=55.0, HOME=/home/polarx, enableApLimitRate=false, awt.toolkit=sun.awt.X11.XToolkit, mpp_splitRunQuanta=1000, HISTCONTROL=ignoredups, sun.jnu.encoding=UTF-8, polarxRootPasswd=, processors=4, mem_size=4096, mpp_minQueryExpireTime=0, PWD=/home/polarx/polardbx/build/run/polardbx-sql/bin, dropOldDataBaseAfterSwitchDataSource=true, parserCommentVersion=50148, com.alibaba.java.net.VTOAEnabled=true, mpp_httpClientMaxThreads=200, txc.vip.skip=true, mpp_globalMemoryLimitRatio=1, mpp_maxQueryExpiredReservationTime=864000000, enableMasterMpp=false, mpp_queryExecutionThreadPoolSize=128, mpp_queryManagerThreadPoolSize=1, file.separator=/, enableScaleout=false, slowSqlSizeThresold=16384, java.vm.compressedOopsMode=32-bit, mpp_exchangeConcurrentRequestMultiplier=3, line.separator= , rpcPort=9090, processorKillExecutor=128, mpp_httpTimeoutThreads=3, mpp_maxSpillSpaceThreshold=0.1, SHLVL=4, charset=utf-8, enableCollectorAllTables=false, HISTSIZE=1000, user.name=polarx, serverPort=8527, mpp_blockSize=131072, deadLockCheckPeriod=500, mpp_taskExecutorLowPriorityEnabled=false, mpp_infoUpdateInterval=3000, instanceId=polardbx-polardbx, mpp_httpMaxRequestsPerDestination=50000, enableKill=false, vpcId=, fileUri=NULL, mpp_httpClientMinThreads=8, sqlRecordCount=100, workloadType=NULL, versionPrefix=5.6.29, processorCheckPeriod=15000, instanceType=NULL, sun.os.patch.level=unknown, sqlSimpleMaxLen=16000, endPoint=NULL, trustedIps=127.0.0.1, mpp_schemaMaxMemory=9223372036854775807, mpp_lessRevokeBytes=33554432, socketRecvBuffer=32768, mpp_taskFutureCallbackThreads=16, mpp_maxSpillThreads=8, coronaMode=0, mpp_memoryRevokingThreshold=0.85, dataNodeList=NULL, mpp_taskClientTimeout=60000, java.class.path=.:/home/polarx/polardbx/build/run/polardbx-sql/bin/../conf:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-calcite-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/accessors-smart-2.4.7.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aether-api-1.13.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aether-connector-asynchttpclient-1.13.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aether-connector-file-1.13.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aether-impl-1.13.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aether-spi-1.13.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aether-util-1.13.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aggdesigner-algorithm-6.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aircompressor-0.16.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aliyun-java-sdk-core-3.4.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aliyun-java-sdk-ecs-4.2.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aliyun-java-sdk-kms-2.7.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aliyun-java-sdk-ram-3.0.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aliyun-java-sdk-sts-3.0.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aliyun-sdk-oss-3.10.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/animal-sniffer-annotations-1.18.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/annotations-23.0.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/annotations-4.1.1.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/aopalliance-1.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/asm-9.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/async-http-client-1.6.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/avalon-framework-4.1.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/avatica-core-1.10.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/avatica-metrics-1.10.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/avro-1.7.7.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/bcprov-jdk15on-1.69.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/bootstrap-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/bval-jsr-2.0.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/byte-buddy-1.10.22.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/calcite-linq4j-1.14.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/checker-qual-3.8.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-beanutils-1.9.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-cli-1.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-codec-1.11.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-collections-3.2.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-compiler-3.0.8.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-compress-1.21.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-configuration2-2.1.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-dbcp-1.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-io-2.7.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-lang-2.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-lang3-3.8.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-logging-1.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-math3-3.1.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-net-3.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/commons-text-1.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/concurrent-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/configuration-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/cron-utils-9.1.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/curator-client-2.13.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/curator-framework-2.13.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/curator-recipes-2.13.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/discovery-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/discovery-server-1.30.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/dnsjava-2.1.7.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/druid-1.2.8.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/error_prone_annotations-2.5.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/esri-geometry-api-2.0.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/event-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/event-http-0.193.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/failsafe-2.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/failureaccess-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/fastjson-1.2.67.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/fastutil-7.0.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/groovy-all-2.4.21.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-api-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-context-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-core-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-netty-shaded-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-protobuf-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-protobuf-lite-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/grpc-stub-1.30.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/gson-2.9.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/guava-30.1.1-jre.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/guice-5.1.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-annotations-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-auth-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-client-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-common-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-hdfs-client-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-mapreduce-client-common-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-mapreduce-client-core-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-mapreduce-client-jobclient-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-yarn-api-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-yarn-client-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hadoop-yarn-common-3.2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/HdrHistogram-2.1.9.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hive-storage-api-2.7.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hk2-api-2.5.0-b42.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hk2-locator-2.5.0-b42.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/hk2-utils-2.5.0-b42.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/htrace-core4-4.1.0-incubating.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http2-client-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http2-common-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http2-hpack-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http2-http-client-transport-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http2-server-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http-client-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/httpclient-4.4.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/httpcore-4.4.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/http-server-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/j2objc-annotations-1.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-annotations-2.13.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-core-2.13.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-core-asl-1.9.13.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-databind-2.13.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-dataformat-smile-2.11.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-datatype-guava-2.11.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-datatype-jdk8-2.13.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-datatype-joda-2.11.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-datatype-jsr310-2.11.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-jaxrs-base-2.10.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-jaxrs-json-provider-2.10.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-mapper-asl-1.9.13.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-module-jaxb-annotations-2.10.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jackson-module-parameter-names-2.11.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jakarta.activation-api-1.2.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jakarta.xml.bind-api-2.3.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/janino-3.0.8.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/java-ipv6-0.17.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javassist-3.27.0-GA.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javax.activation-api-1.2.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javax.annotation-api-1.3.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javax.el-3.0.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javax.inject-1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javax.servlet-api-4.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/javax.ws.rs-api-2.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jaxb-api-2.2.11.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jaxrs-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jcip-annotations-1.0-1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jcl-over-slf4j-1.7.21.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jdom2-2.0.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-client-1.19.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-client-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-common-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-container-servlet-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-container-servlet-core-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-core-1.19.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-hk2-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-media-jaxb-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-server-2.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jersey-servlet-1.19.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jettison-1.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-alpn-client-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-alpn-java-client-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-client-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-http-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-io-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-jmx-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-security-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-server-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-servlet-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-util-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-util-ajax-9.4.40.v20210413.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-webapp-9.4.43.v20210629.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jetty-xml-9.4.43.v20210629.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jgrapht-core-0.9.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jmx-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jmx-http-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jmx-http-rpc-0.193.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jmxutils-1.21.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/joda-time-2.10.9.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jol-core-0.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/json-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/json-smart-2.4.7.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jsp-api-2.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jsr305-1.3.9.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jsr311-api-1.1.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/jul-to-slf4j-1.7.26.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-admin-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-client-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-common-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-core-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-crypto-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-identity-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-server-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-simplekdc-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerb-util-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerby-asn1-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerby-config-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerby-pkix-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerby-util-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/kerby-xdr-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/leveldb-0.12.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/leveldb-api-0.12.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/log-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/log4j-1.2.16.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/logback-classic-1.2.8.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/logback-core-1.2.8.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/logkit-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/log-manager-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/lombok-1.18.10.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-aether-provider-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-artifact-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-compat-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-core-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-embedder-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-model-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-model-builder-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-plugin-api-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-repository-metadata-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-settings-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/maven-settings-builder-3.0.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/memory-0.9.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/mysql-connector-java-5.1.49.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/netty-3.6.2.Final.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/nfs-client-1.1.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/nimbus-jose-jwt-9.8.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/node-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/okhttp-2.7.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/okio-1.6.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/orc-shims-1.6.9.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/osgi-resource-locator-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/paranamer-2.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/perfmark-api-0.19.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-cipher-1.7.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-classworlds-2.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-component-annotations-1.5.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-container-default-1.5.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-interpolation-1.14.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-sec-dispatcher-1.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/plexus-utils-2.0.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-common-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-executor-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-gms-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-net-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-optimizer-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-orc-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-parser-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-rpc-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-rule-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-server-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/polardbx-transaction-5.4.15-SNAPSHOT.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/protobuf-java-3.11.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/protobuf-java-format-1.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/proto-google-common-protos-1.17.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/re2j-1.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/reload4j-1.2.18.3.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/resolver-1.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/security-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/sigar-1.6.4.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/sketches-core-0.9.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/slf4j-api-1.7.21.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/snakeyaml-1.31.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/snappy-java-1.0.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/stats-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/stax2-api-4.2.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/stax-api-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/stream-2.9.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/threetenbp-1.3.5.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/threeten-extra-1.5.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/token-provider-1.0.1.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/trace-token-206.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/units-1.6.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/validation-api-2.0.1.Final.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/wagon-provider-api-2.2.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/woodstox-core-5.3.0.jar:/home/polarx/polardbx/build/run/polardbx-sql/bin/../lib/xbean-reflect-3.4.jar:, pid=362, enablePrimaryZoneMaintain=false, java.vm.vendor=Red Hat, Inc., mpp_maxQuerySpillSpaceThreshold=0.3, metaDbName=polardbx_meta_db_polardbx, MAIL=/var/spool/mail/polarx, managerPort=3406, sun.java.launcher=SUN_STANDARD, user.country=US, supportDropAutoSeq=false, sun.cpu.endian=little, user.language=en, ipAddress=172.20.0.2, mpp_clientTimeout=7200000, mpp_tablescanConnectionStrategy=0, whiteIps=NULL, tddl.conf=/home/polarx/polardbx/build/run/polardbx-sql/bin/../conf/server.properties, metaDbRootUser=root, accessKey=NULL, mpp_httpResponseThreads=100, mpp_queryMaxDelayPendingRatio=10, enableMppServer=true, mpp_cpuCfsQuota=0, cclRescheduleTimeoutCheckPeriod=5, defaultPartitionMode=drds, mpp_queryMinDelayPendingRatio=2, mpp_remoteTaskMaxErrorDuration=180000, druid.logType=slf4j, LANG=en_US.UTF-8, mpp_defaultCluster=DEFAULT, java.runtime.name=OpenJDK Runtime Environment, allowManagerLogin=1, blackIps=NULL, BUILD_PATH=/home/polarx/polardbx/build, mpp_spillPaths=[../spill], allowCrossDbQuery=true, mpp_maxQueryHistory=10, mpp_tablescanDsMaxSize=-1, mpp_cpuCfsPeriodUs=100000, mpp_queryMinDelayTime=100, metaDbXprotoPort=34886, java.vendor.url.bug=https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%207&component=java-11-openjdk, mpp_maxSpillFdThreshold=10000, mpp_remoteTaskMinErrorDuration=30000, retryErrorSqlOnOldServer=true, user.dir=/home/polarx/polardbx/build/run/polardbx-sql/bin, USER=polarx, enableForbidPushDmlWithHint=true, enableLogicalDbWarmmingUp=false, java.vm.version=11.0.18+10-LTS, metaDbPasswd=1a3P7z0atSRhp3qrkUa+kJV51p4Yo8KQrmQzZHzjOKeh+1DlWNrojT9ZX0lxPDr2, globalMemoryLimit=1073741824} 2023-05-19 00:57:38.574 [main] INFO com.alibaba.polardbx.config.loader.ServerLoader - [] Global memory pool size: 1 GB 2023-05-19 00:57:39.945 [main] WARN com.alibaba.polardbx.optimizer.planmanager.PlanManager - [] [TDDL] PlanManager init consuming 0.029 seconds, tddl version: 5.4.15-20230419问题五: 还是显示无法启动 问题六:您是启动之后,大概过了多久重启了机器呢,重启之前有先docker stop容器吗? 问题七:/home/polarx/polardbx/build/run/polardbx-sql/bin/tddl.pid 这个文件删掉
实践教程之如何使用PolarDB-X进行数据导入导出
PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。本期实验将指导您如何使用PolarDB-X进行数据导入导出本期免费实验地址本期教学视频地址 前置准备假设已经根据前一讲内容完成了PolarDB-X的搭建部署,使用PolarDB-X Operator安装PolarDB-X,并且可以成功链接上PolarDB-X数据库。PolarDB-X导入导出方式汇总PolarDB-X常见的数据导出方法有:mysql -e命令行导出数据mysqldump工具导出数据select into outfile语句导出数据(默认关闭)Batch Tool工具导出数据(PolarDB-X配套的导入导出工具)PolarDB-X常见的数据导入方法有:source语句导入数据MySQL命令导入数据程序导入数据load data语句导入数据Batch Tool工具导入数据(PolarDB-X配套的导入导出工具)初始数据准备1.建议分屏,两个终端操作。单击右上角的分屏图标,创建两个终端,方便分别进行登录数据库和执行命令操作。说明:a. k8s的操作即kubectl命令都需要在galaxykube用户下才可进行;b. 登录数据库和其它执行命令可在root或galaxykube用户下进行操作,注意文件路径就行。2.执行如下命令,安装sysbench。curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench说明:可通过sysbench --help查看是否安装成功。3.执行如下命令,登陆数据库。使用连接mysql -hip -Pport -uuser -ppassword -Ac登录PolarDB-X。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 -Ac4.执行如下命令,创建数据库。create database sysbench_int;5.通过sysbench导入初始数据。5.1 首先执行exit登出数据库。5.2 执行如下命令,通过sysbench导入初始数据。sysbench oltp_insert --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=polardbx_root --mysql-password=123456 --mysql-db=sysbench_int --db-driver=mysql --tables=1 --table-size=100000 --report-interval=1 prepare6.将sysbench默认建出的单库单表改为分库分表模式。6.1 执行如下命令,使用连接mysql -hip -Pport -uuser -ppassword -Ac登录PolarDB-X。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 -Ac6.2 执行如下命令,先将原表改名。use sysbench_int;
ALTER TABLE sbtest1 RENAME TO sbtest1_single;6.3 执行如下命令,手动创建分库分表。CREATE TABLE `sbtest1` (
`id` int(11) NOT NULL AUTO_INCREMENT BY GROUP,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) dbpartition by hash(`id`) tbpartition by hash(`id`) tbpartitions 2;6.4 执行如下命令,通过insert select执行到新的表中.INSERT INTO sbtest1 SELECT * FROM sbtest1_single;6.5 执行如下命令,可查看初始数据信息。show create table sbtest1;
select min(id),max(id),count(id) from sbtest1;
select * from sbtest1 limit 10;纯数据格式进行导入导出1.先执行exit登出数据库。2.通过mysql -e命令导出数据。2.1 执行如下命令,通过mysql -e命令从PolarDB-X导出数据。time mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 sysbench_int -N -e "SELECT id,k,c,pad FROM sbtest1;" > data_10w.txt
time mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 sysbench_int -N -e "SELECT id,k,c,pad FROM sbtest1;" | sed 's/\t/,/g' >data_10w.csv2.2 执行如下命令,查看文件大小。ll -h wc -l data_10w.txt2.3 执行如下命令,查看数据格式。head -10 data_10w.txt3.通过LoadData语句导入数据3.1 执行如下命令,登录PolarDB-X。说明:需加-local-infile 参数,才能执行LoadData语句。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 -Ac --local-infile3.2 执行如下命令,创建目标数据库表。create database test_one;
use test_one;
create table test1 like sysbench_int.sbtest1;
show create table test1;3.3 执行如下命令,导入数据到目标库表中。-- 文件路径需要对齐
LOAD DATA LOCAL INFILE 'data_10w.txt' INTO TABLE test1;3.4 执行如下命令,查看导入的数据。select min(id),max(id),count(id) from test1;
select * from test1 limit 10;SQL语句格式进行导入导出1.先执行exit登出数据库。2.通过mysqldump进行导出数据。2.1 执行如下命令,通过mysqldump进行导出数据。time mysqldump -h127.0.0.1 -P3306 -upolardbx_root -p123456 --default-character-set=utf8mb4 --net_buffer_length=10240 --no-tablespaces --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset --hex-blob sysbench_int sbtest1 > dump_10w.sqlv2.2 执行如下命令,查看sql语句格式的数据。head -30 dump_10w.sql3.通过source语句进行导入。3.1 执行如下命令,登录PolarDB-X。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 -Ac --local-infile3.2 执行如下命令,创建目标数据库表.create database test_two; use test_two; create table sbtest1 like sysbench_int.sbtest1;3.3 执行如下命令,导入数据到目标表。-- 注意文件路径
source /root/dump_10w.sql;3.4 执行如下命令,检查表数据。-- 可检查表数据
select min(id),max(id),count(id) from sbtest1;4.通过mysql命令导入4.1 执行如下命令,登录PolarDB-X。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 --local-infile4.2 执行如下命令,清空表数据。truncate table test_two.sbtest1;4.3 执行exit退出数据库,然后执行如下导入命令。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 --default-character-set=utf8mb4 test_two < dump_10w.sql4.4 执行如下命令,再次登录数据库检查表数据情况。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 --local-infile use test_two; select min(id),max(id),count(id) from sbtest1;Batch-Tool工具进行导入导出1.安装batch-tool工具(开源工具介绍:https://github.com/ApsaraDB/galaxysql-tools/tree/main/batch-tool)执行如下命令,下载batch-tool。## github下载, 国内使用github下载不稳定时,请您使用下面的oss下载
wget https://github.com/ApsaraDB/galaxysql-tools/releases/download/batch-tool-v1.2.0/batch-tool.jar
## oss下载
wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/PolarDB-X/batch-tool.jar2.执行如下命令,安装java环境。yum install -y java-1.8.0-openjdk.x86_643.通过batch-tool工具导出。3.1 执行如下命令,通过batch-tool工具导出。java -jar batch-tool.jar -h127.0.0.1 -P3306 -upolardbx_root -p123456 -D sysbench_int -o export -t sbtest1 -s , -F 13.2 执行如下命令,查看文件情况。head -30 sbtest1_04.通过batch-tool工具导入。4.1 执行如下命令,登录PolarDB-X。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 -Ac --local-infile4.2 执行如下命令,清空表 test_one.test1 的数据truncate table test_one.test1;4.3 执行exit登出数据库。4.4 执行如下命令,导入数据。java -jar batch-tool.jar -h127.0.0.1 -P3306 -upolardbx_root -p123456 -D test_one -o import -t test1 -s , -f "sbtest1_0" -maxConn 8 -minConn 44.5 执行如下命令,再次登录PolarDB-X查看表的插入情况。mysql -h127.0.0.1 -P3306 -upolardbx_root -p123456 -Ac --local-infile
use test_one;
-- 检查表数据
select min(id),max(id),count(id) from test1;本文来源:PolarDB-X 知乎号,关注阅读更多精彩好文
DNS网络协议初探
DNS协议初探DNS 使用TCP还是UDP协议?DNS 迭代查询 和 递归查询 是什么?如何构建DNS报文?1. 什么是DNS DNS: (Domain Name System) 域名系统, 用户在使用常用网络软件,例如: 浏览器,邮件 等,但是这些服务需要指定服务器的ip地址和端口号,这个难以记忆,大家更喜欢易读、有一定含义的名字,DNS就能满足这个要求,实现将域名映射为IP地址,这个就称为域名解析。目前互联网 DNS为分布式数据库, 域名服务器分布在世界各地,每个服务器也只存储了部分域名信息。1.1 域名层次化 域名结构由标号序列组成,标点符号用点隔开, 例如: juejin.cn. www.jd.com. 可总结为: ....三级域名.二级域名.顶级域名.根域名(可省略)根截止目前为止,全球上共有13个根服务器 ,从 a - m# yum -y install bind-utils
# dig | grep root | awk '{print $NF}' | sort
a.root-servers.net.
b.root-servers.net.
c.root-servers.net.
d.root-servers.net.
e.root-servers.net.
f.root-servers.net.
g.root-servers.net.
h.root-servers.net.
i.root-servers.net.
j.root-servers.net.
k.root-servers.net.
l.root-servers.net.
m.root-servers.net.
#
顶级域名分类:国家顶级域名nTLDcn: 表示中国us: 表示美国jp: 表示日本...通用顶级域名gTLDcom: 表示工商企业net: 表示网络提供商gov: 政府专用...基础结构域名arpa1.2 域名服务器分类 域名服务器以区为单位,可以分为: 1. 根域名服务器 2. 顶级域名服务器 3. 权威域名服务器 4. 中间域名服务器根域名服务器全球共有13个根域名服务器,可通过 dig 获取。顶级域名服务器TLD服务器,负责管理该顶级域名下的二级域名。权威域名服务器负载一个区的域名服务器,保存该区的域名 和 IP地址映射关系。中间服务器不属于如上三种服务器,就是中间域名服务器。1.3 通过实例来判断服务器分类本次查询,DNS服务器信息如下本地域名服务器: 61.139.2.69根域名服务器: a.root-servers.net (198.41.0.4#53)顶级域名服务器: g.dns.cn (66.198.183.65#53)权威域名服务器: vip4.alidns.com (47.113.183.36#53)利用dig追踪日志如下dig +trace 可以追踪请求# dig +trace juejin.cn. @61.139.2.69
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> +trace juejin.cn. @61.139.2.69
;; global options: +cmd
. 28351 IN NS a.root-servers.net.
. 28351 IN NS b.root-servers.net.
. 28351 IN NS c.root-servers.net.
. 28351 IN NS d.root-servers.net.
. 28351 IN NS e.root-servers.net.
. 28351 IN NS f.root-servers.net.
. 28351 IN NS g.root-servers.net.
. 28351 IN NS h.root-servers.net.
. 28351 IN NS i.root-servers.net.
. 28351 IN NS j.root-servers.net.
. 28351 IN NS k.root-servers.net.
. 28351 IN NS l.root-servers.net.
. 28351 IN NS m.root-servers.net.
;; Received 228 bytes from 61.139.2.69#53(61.139.2.69) in 3 ms
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS g.dns.cn.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS ns.cernet.net.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS f.dns.cn.
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 86400 IN DS 57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn. 86400 IN RRSIG DS 8 1 86400 20211211170000 20211128160000 14748 . gM8pprqRpkmDpcu6kNU5kffmW1jo9dmT/CjK7g9dUH4F2purVO1Txiyr RszAgzMWe7HmxeLLEN1s0p2vxbQvQ0uQZn7DMA5eJWbNf/rINyT6vmMK BndvUuTJ74wnEkiXY8Cviim597TEFWl5w7Z9Bn0FwM2nzt5OHBDben24 Fca3vbIXK3Q2n1cDbpO01We/VbiUrgcxlNAxm68wC8gWwLypFNFDXw5V tHVwwX4NsKG1si6n5lyuKramPj+GM9YV/htDNSZKzjEyHTrp/lfwQoxX Eju+cOhmFvnnSFRLS+9EyVmil+i822M2QyVbLhmwjkW8pdER+RxXd+pv vrm6gA==
;; Received 700 bytes from 198.41.0.4#53(a.root-servers.net) in 223 ms
juejin.cn. 86400 IN NS vip3.alidns.com.
juejin.cn. 86400 IN NS vip4.alidns.com.
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN NSEC3 1 1 10 AEF123AB 3QM14FQ32F1CJFTP8D3J5BCTNP5BIELO NS SOA RRSIG DNSKEY NSEC3PARAM
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN RRSIG NSEC3 8 2 21600 20211225190654 20211125181736 38388 cn. B735xzQYqVTspNxPes9yYW+EnnN1GuaKhRhI4UuowLiDdRqwrk1I/+3F aqzWerS2SUO+nhzcSzl+NeiIwBBuOjyh/NgF15e1WBHvc8PR2cG3HXSo rD3usJlX1rlaOZH6EP5k/VkMSktveAeJo3foOF104UXuljG0yRQqp+4v sh0=
DEFPMSCATA3DEUN2HJMIGDHN15FBH1AM.cn. 21600 IN NSEC3 1 1 10 AEF123AB DGCV05BN5EJCBB4F86S87BCR5CJOA3IC NS DS RRSIG
DEFPMSCATA3DEUN2HJMIGDHN15FBH1AM.cn. 21600 IN RRSIG NSEC3 8 2 21600 20211225184833 20211125181738 38388 cn. ghEDLlzom97T/4SL7znLbN5PKD0qyInh6VgcDw6dZPmoDy7eDd0Gk1Vw VoSSnn7dBp7AK8zEkAygKg28QiNFgPlWDlUtM37R3H3OGqfnJRiJ7R85 n/HSMchAunBtMgkSrtmXUVryzUm5inyi/FxH2iVc4fgGQZlLNmZr5BG+ lqQ=
;; Received 577 bytes from 66.198.183.65#53(g.dns.cn) in 274 ms
juejin.cn. 600 IN CNAME juejin.cn.w.cdngslb.com.
;; Received 75 bytes from 47.113.183.36#53(vip4.alidns.com) in 46 ms
#
解析请求图大致如下1.4 DNS递归解析和迭代解析递归查询: 在进行查询时,若没有被查询的域名信息,则进行代理查询,直至查询到IP地址/或者是查询失败 , 然后返回给本地域名服务器。迭代查询: 不会进行代理查询请求,而是将结果或者是下一跳域名服务器返回给本地域名服务器。图示迭代查询递归查询2. DNS报文解析参考 rfc1035 datatracker.ietf.org/doc/html/rf…请求报文响应报文2.1 DNS 整个报文格式+---------------------+
| Header |
+---------------------+
| Question | the question for the name server
+---------------------+
| Answer | RRs answering the question
+---------------------+
| Authority | RRs pointing toward an authority
+---------------------+
| Additional | RRs holding additional information
+---------------------+2.2 Head: 请求头1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ID: 16bit 查询/响应编号作为 查询 和 应答标识IDQR: 1bit 报文类型0: 查询1: 响应Opcode: 4bit 查询的类型0: 标准查询1: 反查询2: 服务器状态请求3-15: 暂时闲置AA: 1bit 权威应答1: 是0: 否TC: 1bit 超出最大允许的长度(UDP包为512字节)UDP 包为 512 字节,若返回报文超过512个字节,则需要将状态标志位 TC 置为1 然后将报文返回给客户端,客户端收到后会再次使用 TCP 进行查询请求1: 超出最大长度,截断0: 正常RD: 1bit 期望递归查询1: 需要递归查询0: 不需要递归查询RA: 1bit 可用递归 , 用于响应报文中1: 支持递归0: 不支持递归Z: 3bit保留RCODE: 4bit 响应代码0: 没有错误1: 格式错误2: 服务器故障3: 名称错误4: 不支持请求类型的查询5: 服务器拒绝查询6-15: 备用2.3 Question 查询请求 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QNAME: 表示查询的域名每个标签由一个8字节的长度 和 响应的字符组成例如 juejin.com在报文中QNAME应该展示为6 j u e j in 3 c o m 0QTYPE: 16bit 请求的类型1: A2: NS3: MD4: MF5: CNAME6: SOA7: MB8: MG9: MR10: NULL11: WKS12: PTR13: HINFO14: MINFO15: MX16: TXTQCLASS: 16bit 请求的方式1: 一般网络请求2: CSNET3: CHAOS4: Hesiod2.4 Answer 响应报文 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
**NAEM: 16bit **资源记录域名 , 采用 2个byte 来表示 , CO 为固定标记位,代表后面的值为偏移量+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 1 1| OFFSET |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+TYPE 16bitRDATA资源类型CLASS: 16bit请求类型TTL: 32bit缓存时间,为0则不能缓存RDLENGTH: 16bitRDATA字节数RDATA: RDLENGTH byte资源记录值3. DNS golang 代码案例3.1 获取请求报文获取/生成A记录报文Demo 代码放在了 gitee 上 gitee.com/pdudo/Sampl…代码package main
import (
"fmt"
"gitee.com/pdudo/SampleDNSTool"
"log"
"net"
)
func main() {
var dnsInfo SampleDNSTool.DNSInfo
udpconn ,err := net.ListenUDP("udp",&net.UDPAddr{
IP: net.IPv4(0,0,0,0),
Port: 53,
})
if err != nil {
log.Fatal("listen udp error" , err)
}
for {
buf := make([]byte,1024)
n , err := udpconn.Read(buf[:])
if err != nil {
log.Println("udpconn error " , err)
}
dnsInfo.GetHeader(buf[:n])
dnsInfo.GetQuestion(buf[:n])
fmt.Println("DNS 查询ID: " ,dnsInfo.Header.ID ,
"HeaderStatus:" , dnsInfo.Header.HeaderStatus ,
"QCount:" , dnsInfo.Header.QCOUNT,
"Qname:" , dnsInfo.QueryInfo.QNAMEString ,
"QTYPE:",dnsInfo.QueryInfo.QTYPE ,
"QCLASS:",dnsInfo.QueryInfo.QCLASS)
}
}
启动服务器 并且 使用nslookup模拟请求# go build
# ./testDNSQuery客户端# nslookup juejin.com 127.0.0.1
;; connection timed out; no servers could be reached
#程序输出# ./testDNSQuery
DNS 查询ID: 27284 HeaderStatus: {0 0 0 0 1 0 0 0} QCount: 1 Qname: juejin.com QTYPE: 1 QCLASS: 1
DNS 查询ID: 27284 HeaderStatus: {0 0 0 0 1 0 0 0} QCount: 1 Qname: juejin.com QTYPE: 1 QCLASS: 1
DNS 查询ID: 27284 HeaderStatus: {0 0 0 0 1 0 0 0} QCount: 1 Qname: juejin.com QTYPE: 1 QCLASS: 1生成响应报文修改代码package main
import (
"fmt"
"gitee.com/pdudo/SampleDNSTool"
"log"
"net"
)
func main() {
var dnsInfo SampleDNSTool.DNSInfo
udpconn ,err := net.ListenUDP("udp",&net.UDPAddr{
IP: net.IPv4(0,0,0,0),
Port: 53,
})
if err != nil {
log.Fatal("listen udp error" , err)
}
for {
buf := make([]byte,1024)
n , fromudpaddr , err := udpconn.ReadFromUDP(buf[:])
if err != nil {
log.Println("udpconn error " , err)
}
dnsInfo.GetHeader(buf[:n])
dnsInfo.GetQuestion(buf[:n])
fmt.Println("DNS收到请求 , 查询ID: " ,dnsInfo.Header.ID ,
"HeaderStatus:" , dnsInfo.Header.HeaderStatus ,
"QCount:" , dnsInfo.Header.QCOUNT,
"Qname:" , dnsInfo.QueryInfo.QNAMEString ,
"QTYPE:",dnsInfo.QueryInfo.QTYPE ,
"QCLASS:",dnsInfo.QueryInfo.QCLASS)
// 构建回复报文
if (1 == dnsInfo.QueryInfo.QTYPE) {
ip := make([]byte,4)
ip[0] = 192
ip[1] = 168
ip[2] = 111
ip[3] = 129
res := dnsInfo.GenerateAnswers(buf[:n],ip,0,1)
//udpconn.Write(res)
udpconn.WriteToUDP(res,fromudpaddr)
}
}
}
利用nslookup查看效果# nslookup juejin.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: juejin.com
Address: 192.168.111.129
;; connection timed out; no servers could be reached完
带你读《全链路数据治理-全域数据集成》之32:1. 背景信息
六、分库分表至 MaxCompute 实践1. 背景信息1) 业务诉求MySQL 分库分表的场景下,上游的表和库非常多,都需要同时写入一张MaxCompute 表,如果要同时配置多个任务则会导致配置非常复杂且运维困难。 针对上诉痛点,阿里云 DataWorks 数据集成分库分表同步解决方案提供了面向业务场景的同步任务配置化方案,支持不同数据源的一键同步功能,方便业务简单快速的进行数据同步。 2) 分库分表至 MaxCompute 同步解决方案分库分表同步至 MaxCompute 解决方案是一种基于 binlog 实时同步、T+1 合并生成离线表的的实时同步解决方案。实时同步数据写入 log 表中,base 表每一个天分区存储全量数据。每天运行合并任务合并前一天的 base 表分区、log 表实时数据,产出新的全量分区,在查询数据时,一般需要查询 base 表最新分区。 在配置分库分表解决方案时,可以通过库表名、正则规则等方式限定源库源表,将符合限定条件的源库源表汇聚成一张目标表。 数据集成分库分表解决方案支持以下几种场景: l 单库-分表: Ø 单个物理库下面分表。 l 分库-分表: Ø 有多个物理库,每个物理库有序号。 Ø 每个物理库有多个物理表,物理表有序号。 Ø 比如有 0-9 的 10 个分库,每个库有 0-99 的 100 个分表。 l 分库-不分表: Ø 常见的有:每个分库下有同一个物理表名。 l 分库分表解决方案支持以下来源数据源类型: Ø MySQL Ø PolarDB for MySQL
带你读《全链路数据治理-全域数据集成》之28:2. 使用限制
2. 使用限制 l 目前仅支持 MySQL/PolarDB for MySQL 单实例同步。 l 需要使用 DataWorks 独享数据集成资源组。
带你读《全链路数据治理-全域数据集成》之6:3. 实时同步场景与配置
3. 实时同步场景与配置1) 单表 ETL 实时同步l 将单个表或者 topic 内的数据同步到另外一个表中,整个流程支持图形化开发无需编写代码,单表实时同步至单表时,支持使用托拽的方式实现任务开发,业务新手也能够轻松上手。 l 单表增量数据实时同步场景下,您可以根据业务需求,对输入数据源进行数据过滤、字符串替换和数据脱敏处理后,再将数据输出至目标数据库。 Ø 数据过滤:可以对数据进行规则过滤,例如过滤字段的大小等,符合规则的数据才会被保留。 Ø 字符串替换:可以通过字符串替换节点替换字符串类型的字段。 Ø 数据脱敏:可以对实时同步的单表数据进行脱敏,将脱敏后的数据输出至目标数据库。 l 具体配置方案请参考配置实时同步任务。 2) 整库实时同步l 将整个数据库的变化日志同步到目标端中,一般用作纯实时日志的收集。 l 可以一次性配置一个实例下多个库的多个表,一个任务中最多支持 3000 个目标表。 l 具体配置方案请参考配置实时同步任务。 3) 整库全增量实时同步l 是实时同步使用最频繁的业务场景,一般用作将源端库持续不停地同步到目标端中,以期实现目标端对于源端的镜像效果。 l 可以一次性配置一个实例下多个库的多个表,一个任务中最多支持 3000 个目标表。 l 除了直接使用已有表作为目标表,也支持自动生成目标 schema/表,并且可以自定义目标 schema/表名生成规则。 l 支持目标表添加附加字段,实时同步默认按照默认按照同名映射,源端同名字段写入目标端同名字段,未映射成功的字段将不参与同步,但支持您定义目标表字段与值。 l 数据集成实时同步在同步 MySQL、Oracle、Loghub 和 PolarDB 类型的数据至 DataHub 或 Kafka 时,会在同步的目标端添加 5 个附加列,以进行元数据管理、排序去重等操作。详情请参见实时同步字段格式。 l 支持定义 DDL/DML 消息处理策略,为保障数据符合预期,实时同步任务支持对不同类型的 DDL/DML 消息定义不同的处理策略。 l 具体配置方案请参考配置同步任务解决方案。
二叉树的理解
前言二叉树可用于实现二叉查找树和二叉堆,二叉树主要应用在以二叉树为基础的各种数据结构上。在计算机科学中,二叉树是每个结点最多有两个子树的树结构,树形结构在计算机中应用非常广,例如文件系统就是依靠树形结构实现的,我们先来介绍树的概念及结构:树是什么(计算机科学)概念解释在数据结构中,树是一种非线性的数据结构,它是由n(n>=0)个有限节点组合成的一个具有层次关系的集合。因为在逻辑结构上,它像一颗倒挂起来的树,是一颗根朝上,叶朝下的树形数据结构。树的定义类似于递归根节点,没有前驱节点就像是族谱中祖宗除根节点外,其余节点被分为M个(M>0)个互不相交的集合T1、T2、…Tm,这些叫做子树。每棵子树的根节点有且只有一个前驱,可以有0或多个后继节点相关必备概念补充节点的度: 一个节点含有的子树的个数;如A的为3,B的为2叶节点(终端节点):度为0的节点称为叶节点;如F、G、I、J为叶节点分支节点(非终端节点):度不为0的节点;父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如A是B的父节点子节点:一个节点含有的子树的根节点称为该节点的子节点;如B是A的子节点兄弟节点:具有相同父节点的节点互称为兄弟节点;如B、C、D是兄弟节点树的度:一棵树中,最大的节点的度称为树的度;如树的度为3节点的层:从根节点开始定义,根为第1层,根的子节点为第2层,以此类推树的高度(深度):树中节点的最大层次;如上图树的深度为4节点的祖先:根节点子孙:以某节点为根的子树中任一节点都称为该节点的子孙;如所有节点都是A节点的子孙森林:由m(m>0)课互不相干的树的集合构成森林树的代码实现以最常用的孩子兄弟表示法展示typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};图示:二叉树概念解释树中节点最大的度,为2的数就叫做二叉树,也就是树的度为2的树①在二叉树中,一个节点最多有两颗子树,二叉树节点的度<=2②二叉树的有左右之分,且子树的次序不能颠倒,因此二叉树是有序树 注意:对于任意的二叉树都是由以下几种情况复合而成的二叉树的两种特殊形式满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。图示:相关性质若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2 ( i − 1 ) 2^(i-1)2 ( i−1)个结点.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^h -12 h −1对任何一棵二叉树, 如果度为0其叶结点个数为n 0 n_0n 0 , 度为2的分支结点个数为n 2 n_2n 2 ,则有n 0 n_0n 0 =n 2 n_2n 2 +1若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=l o g 2 log_2log 2 (n+1). (ps:l o g 2 log_2log 2 (n+1) 是log以2为底,n+1为对数)对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:1.若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子二叉树的实现方式二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。顺序存储顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。链式存储二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。本节完