当前位置: 首页 > news >正文

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用

1.1 概述:

上面我们学会了hbase的操作和原理,以及外部集成的mr的计算方式,但是我们在使用hbase的时候,有的时候我们要直接操作hbase做部分数据的查询和插入,这种原生的方式操作在工作过程中还是比较常见的,以上这些方式需要使用外部的框架进行协助处理,其实hbase也对外提供了一个直接的操作方式接口插件Phoenix,它和mr不一样,是直接集成在hbase之中的,通过一个工具使得hbase可以完全支持sql操作,其实我们可以将Phoenix当成是一个sql插件,一个可以写sql完成hbase操作的插件,并且在hbase中通过regionserver直接执行,还可以做sql的优化,是hbase免费开源出来的一个插件。

 安装过程及配置环境变量过程略。

1.2 创建测试表

在phoenix中创建测试表,必须指定主键,主键对应hbase的rowkey(唯一且非空)

-- 表名不带双引号,默认转成大写
create table phtest1(pk varchar not null primary key,col1 varchar,col2 varchar,col3 varchar
);
-- 表名带双引号,不转大写
create table "phtest2"(pk varchar not null primary key,col1 varchar,col2 varchar,col3 varchar
);-- 查看表列表
!tables-- 查看表结构
!describe PHTEST1;

在hbase shell中查询(phoenix严格区分大小写,所有小写在phoenix中都会被翻译为大写)。

规则就是:如果表名没用双引号括起来,小写全会被翻译为大写;如果表用双引号括起来了,那么小写的话就用小写,大写就用大写。

1.3 插入/查询数据

0: jdbc:phoenix:hadoop106,hadoop107:2181> upsert into PHTEST1 values('x0001','1','2','3'
. . . . . . . . . . . . . . . . . . . .)> );
1 row affected (0.299 seconds)
0: jdbc:phoenix:hadoop106,hadoop107:2181> upsert into PHTEST1 values ('x0001','1','22','3');
1 row affected (0.024 seconds)
0: jdbc:phoenix:hadoop106,hadoop107:2181> upsert into PHTEST1 values ('x0002','1','2','3');
1 row affected (0.02 seconds)
0: jdbc:phoenix:hadoop106,hadoop107:2181> select * from PHTEST1;
+-------+------+------+------+
|  PK   | COL1 | COL2 | COL3 |
+-------+------+------+------+
| x0001 | 1    | 22   | 3    |
| x0002 | 1    | 2    | 3    |
+-------+------+------+------+
2 rows selected (0.103 seconds)

在hbase shell中查询:

1.4 测试删除

插入多行,删除其中某一行

-- 插入多行,一次只能插入一行,不能插入多行
upsert into PHTEST1 values ('x0002','2','3','4');
upsert into PHTEST1 values ('x0003','3','4','5');
upsert into PHTEST1 values ('x0004','4','5','6');
-- 查询验证
select * from PHTEST1;
-- 删除一行
delete from PHTEST1 where col1='2';
-- 查询验证
select * from PHTEST1;

1.5 查询导入

-- 使用select查询结果集批量更新表
-- 创建一张临时表PHTEST2
create table PHTEST2(pk varchar not null primary key,col1 varchar, col2 varchar,col3 varchar
);
-- 临时表插入数据,比phtest1表多了'x0005'、'x0006'和'x0002'三行,其中'x0003'、'x0004'与phtest1的一致
upsert into PHTEST2 values ('x0001','newvalue','newvalue','newvalue');
upsert into PHTEST2 values ('x0002','newvalue','newvalue','newvalue');
upsert into PHTEST2 values ('x0003','3','4','5');
upsert into PHTEST2 values ('x0004','4','5','6');
upsert into PHTEST2 values ('x0005','newvalue','newvalue','newvalue');
upsert into PHTEST2 values ('x0006','newvalue','newvalue','newvalue');-- 执行批量更新, 将PHTEST2表的数据覆盖到PHTEST1表
upsert into PHTEST1 select * from PHTEST2;

1.6  删除表

drop table PHTEST2;

1.7 数据导入

使用官方提供的数据样例,phoenix数据导入只支持csv文件格式。

# 在客户端外
# 执行SQL文件
# 对标hive的-f test.sql ${hiveconf:batch_date}
# 创建sql文件 select * from PHTEST1
sqlline.py nn1:2181 /root/sql# 创建表
create table user(id varchar primary key,name varchar,age varchar);
# 创建csv文件 /root/user.csv
# 输入文件内容
# 1,zhangsan,20
# 2,lisi,30psql.py -t USER nn1:2181 /root/user.csv
# 注意:
#   1)phoenix数据导入只支持后缀为.csv的文件, csv文件名称不需要和表名称一致,文件名可以小写
#   2)指定的表必须是大写,小写就报错

1.8 在phoenix建表时指定列族

-- 用 列族名.字段名
create table "cftest" (pk varchar not null primary key,cf1.col1 varchar,cf2.col2 varchar);-- 查询时可以不用列族
select col1 from "cftest"

注:如果建表时这些列未指定列族,则会分配一个叫'0'的列族。

1.9 在phoenix建表时指定压缩格式

-- 在后面可指定压缩格式
create table "comptest" (pk varchar not null primary key,cf1.col1 varchar,cf2.col2 varchar) compression='snappy';

1.10 在phoenix建表时预分region

-- 用 split on ('x0001','x0002','x0003','x0004','x0005') 来进行预分region
-- 其中 on 里面的 是 splitkey
create table "split_region_test" (pk varchar not null primary key,cf1.col1 varchar,cf2.col2 varchar) compression='snappy' split on ('x0001','x0002','x0003','x0004','x0005');

1. 11 phoenix与hbase表关联

1)在hbase中创建带有命名空间的表,并添加数据

create 'hainiu:relatetable_1',{NAME => 'cf1',COMPRESSION => 'snappy'},{NAME => 'cf2',COMPRESSION => 'snappy'}# 添加数据
put 'hainiu:relatetable_1','x0001','cf1:name','user1'
put 'hainiu:relatetable_1','x0002','cf1:name','user2'
put 'hainiu:relatetable_1','x0001','cf1:age','20'
put 'hainiu:relatetable_1','x0002','cf1:age','21'
put 'hainiu:relatetable_1','x0001','cf2:address','beijing'
put 'hainiu:relatetable_1','x0002','cf2:address','shanghai'

2)在phoenix中创建schema(schema相当于命名空间)

-- 先在phoenix中创建schema,对应hbase的namespace
create schema if not exists "hainiu";

执行报错:

cannot create scheme because config phoenix.scheme.isNamespaceMappingEnabled for enabling name space mapping isn`t enabled.schemaName='hainiu'

在phoenix中创建schema报错解决方式:在hbase的hbase-site.xml中添加phoenix.schema.isNamespaceMappingEnabled=true和phoenix.schema.mapSystemTablesToNamespace=true

在hbase和Phoenix的配置文件hbase-site.xml中都要增加这个配置

增加以上配置

重启hbase集群

stop-hbase.sh

start-hbase.sh

重新进入Phoenix 客户端

-- 退出客户端
!q
-- 进入客户端
sqlline.py nn1:2181-- 先在phoenix中创建schema,对应hbase的namespace
create schema if not exists "hainiu";

3)创建带有命名空间的表

-- 在phoenix创建'hainiu:relatetable'的关联表
-- 其中: column_encoded_bytes=0 是把字段名转成字符串,而不是原来的byte数组
create table "hainiu"."relatetable_2"(id varchar not null primary key,"cf1"."name" varchar,"cf1"."age" varchar,"cf2"."address" varchar
) column_encoded_bytes=0;-- 在phoenix中插入一条数据测试
upsert into "hainiu"."relatetable_2" (id,"cf1"."name","cf1"."age","cf2"."address") values ('x0003','user3','22','guangzhou');select * from "hainiu"."relatetable_2";
select "name" from "hainiu"."relatetable_2";
select "cf1"."name" from "hainiu"."relatetable_2";-- 没有给进行BYTES.tostring
create table "hainiu"."relatetable_3"(id varchar not null primary key,"cf1"."name" varchar,"cf1"."age" varchar,"cf2"."address" varchar
);
upsert into "hainiu"."relatetable_3" (id,"cf1"."name","cf1"."age","cf2"."address") values ('x0003','user3','22','guangzhou');

建表语句中带有 column_encoded_bytes=0, 从hbase查询,字段名能看得懂,否则看不懂。

1. 12 phoenix建表时指定组合rowkey

-- 通过 CONSTRAINT pk primary key ( prefix,id )  设定联合主键,作为rowkey
-- 当prefix和id作为联合主键, 只在hbase的rowkey中存在, column里没有
-- 建表语句
create table "hainiu"."combinationkey_table1" (prefix varchar not null,id varchar not null,col1 varchar,col2 varcharCONSTRAINT pk primary key ( prefix,id ) 
) column_encoded_bytes=0, compression='snappy'  split on ('1','2','|');-- 插入数据
upsert into "hainiu"."combinationkey_table1" (prefix,id,col1,col2) values ('1','001','user1','20');
upsert into "hainiu"."combinationkey_table1" (prefix,id,col1,col2) values ('1','002','user2','21');-- 查看表结构
!describe "hainiu"."combinationkey_table"

1. 13 phoenix实现动态列

-- 创建表
create table "hainiu"."dynamic_table1"(pk varchar not null primary key,col1 varchar,col2 varchar
)column_encoded_bytes=0;-- 插入数据
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0001','user1','20');
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0002','user1','21');
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0003','user1','22');
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0004','user1','23');-- 动态插入列
-- 动态插入 col3 和 col4 列
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col3 varchar,col4 varchar) values ('x0005','user1','23','beijing','hainiu');
-- 动态插入 col4 和 col5 列
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col4 varchar,col5 varchar) values ('x0006','user2','32','huawei','30K');-- 动态插入 col3、col4、col5 列
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col3 varchar,col4 varchar,col5 varchar) values ('x0007','user3','33','shanghai','ali','22K');
-- 动态插入 col3、col4、col5、col6 列 
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col3 varchar,col4 varchar,col5 varchar,col6 varchar) values ('x0008','user4','35','shanghai','baidu','12K','false');-- phoenix中查询动态列
select * from "hainiu"."dynamic_table1"(col3 varchar,col4 varchar);
select * from "hainiu"."dynamic_table1"(col3 varchar,col4 varchar,col5 varchar) ;
select * from "hainiu"."dynamic_table1"(col3 varchar,col4 varchar,col5 varchar,col6 varchar) ;

2. 索引

2.1 开启索引

配置hbase的hbase-site.xml

<property><name>hbase.regionserver.wal.codec</name><value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
#分发到不同的机器#重启hbase集群
stop-hbase.sh
start-hbase.sh
# 删除Phoenix中的配置文件
hbase-site.xml 
# 将hbase的配置文件给Phoenix
数据准备
-- 创建测试表
create table "hainiu"."testindex"(pk varchar not null primary key,col1 varchar
)column_encoded_bytes=0;-- 插入数据
upsert into "hainiu"."testindex" values ('x1','1');
……
upsert into "hainiu"."testindex" values ('x20000','20000');
-- 编写脚本,生成SQL文件
[root@worker-1 hdfs_test]# vim s1.sh 
#! /bin/bashfor((i=1;i<=20000;i++))
doecho "upsert into \"hainiu\".\"testindex\" values ('x${i}','${i}');" >> testindex.sql
done-- 执行SQL文件导入表
sqlline.py nn1:2181 testindex.sql
索引开启前查询
-- 查看执行计划,发现全表扫描
explain select * from "hainiu"."testindex1" where COL1 = '200';
-- 查询
select * from "hainiu"."testindex1" where COL1 = '200';

通过执行计划可以发现,查询为FULL SCAN。全表扫描。

索引操作
-- 基于 COL1字段 创建索引, 当创建完后,索引里存的是已经排序好的COL1数据
-- local index 适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销
create local index myindex1 on "hainiu"."testindex" (COL1);-- 查看执行计划,发现不全表扫描
explain select * from "hainiu"."testindex" where COL1 = '200';
select * from "hainiu"."testindex" where COL1 = '200';-- 删除索引
drop index myindex on "hainiu"."testindex";

相关文章:

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用 1.1 概述&#xff1a; 上面我们学会了hbase的操作和原理&#xff0c;以及外部集成的mr的计算方式&#xff0c;但是我们在使用hbase的时候&#xff0c;有的时候我们要直接操作hbase做部分数据的查询和插入&#xff0c;这种原生的方式操作在工作过程中还…...

高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?

如果有遗漏,评论区告诉我进行补充 面试官: Redis和Memecache有什么区别? 我回答: 一、基础特性 数据类型支持 Redis: 支持多种数据类型&#xff0c;包括字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List&#xff09;、集合…...

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面&#xff0c;经常看到any类型的报错&#xff0c;真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…...

手机ip地址异常怎么解决

在现代社会中&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。然而&#xff0c;有时我们会遇到手机IP地址异常的问题&#xff0c;这不仅会影响我们的网络体验&#xff0c;还可能带来安全隐患。本文…...

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)

基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统&#xff0c;它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审…...

37.超级简易的计算器 C语言

超级简单&#xff0c;简单到甚至这个计算器输入都比较反人类 但是足够简单 有输入功能有Switch语句支持四种运算还能检查除数是不是0还能打印出完整的式子 #define _CRT_SECURE_NO_WARNINGS// 禁用安全警告 #include <stdio.h>int main() {double num1, num2;// 声明两…...

防火墙----iptables

防火墙是位于内部网和外部网之间的屏障&#xff0c;他按照系统管理员预先定义好的规则来控制数据包的进出 一、iptables简介 防火墙会从以上至下的顺序来读取配置的策略规则&#xff0c;在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为&#xff08;即放行或阻止&…...

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理

黄小宁 关键词&#xff1a;“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴&#xff0c;R轴可沿本身平移变为R′轴&#xff0c;R′轴可沿本身平移变为R″轴&#xff0c;...。直线公理和平面公理使几百年…...

网络安全之WINDOWS端口及病毒编写

目录 一、常见端口和服务 二、Windows病毒编写 声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判…...

Flink 开发工程应加载哪些依赖

在我们要开发Flink程序时,就会涉及到应该加载哪些Flink jar的问题。本章内容就是向你展示如何配置你的项目,添加必要的依赖。 每个应用程序都会依赖一些 Flink libraries,比如至少依赖 Flink APIs库,如果使用了connector,则还需要依赖connector相关的库,比如kafka、jdbc…...

wordpress建外贸独立站常用的多语言插件

WordPress是一个功能强大的内容管理系统&#xff0c;对于外贸独立站来说&#xff0c;多语言支持是非常重要的功能。以下是一些常用的WordPress多语言插件&#xff1a; 1. WPML (WordPress Multilingual) 这是最流行且功能最全面的多语言插件之一。它支持翻译整个网站&#xf…...

[SpB]如何开始使用 Spring Boot?

如何开始使用 Spring Boot&#xff1f; Spring Boot 简化了 Java 项目开发&#xff0c;你只需要专注于业务逻辑&#xff0c;底层的很多配置和功能由 Spring Boot 自动帮你处理。下面是你如何快速上手 Spring Boot 的步骤&#xff0c;以及如何通过 IDEA 了解 Spring Boot 的功能…...

蓝桥杯模拟

【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只…...

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)

1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&…...

2. langgraph中的react agent使用 (在react agent添加历史消息)

1. 导入必要的库 首先&#xff0c;我们需要导入所需的库。这里我们使用 langchain_openai 来与 智谱AI 模型进行交互&#xff0c;并使用 langchain_core.tools 来定义自定义工具。 from langchain_openai import ChatOpenAI from typing import Literal from langchain_core.…...

MySQL社区版的启动与连接

1.启动&#xff1a; 注意&#xff1a;MySQL是默认开机自启的 方式一&#xff1a; 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称&#xff0c;然后鼠标右键点击启动 方式二&#xff1a; 1.在开始选项中搜索“cmd”命令提示符&#xff0c;使用管理员身份运行 …...

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…...

物理hack

声明 声明 文章只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致力于网络安全领域&#xff0c;目前作为一名学习者&#xff0c;很荣…...

Linux——环境基础开发工具使用2(正在更新中...)

1.自动化构建-make/Makefile 1.1 认识make和Makefile make是一个命令&#xff1b; Makefile是一个文件。 1.2 理解 其中在第一个图片中&#xff0c;第一行的 mytest:test.c 叫做依赖关系&#xff1b;第二行的 gcc test.c -o mytest 叫做依赖方法。 依赖关系和依赖方法共同…...

STM32传感器模块编程实践(十二) micro SD卡模块简介及驱动源码

文章目录 一.概要二.Micro SD卡模块主要特性三.Micro SD卡模块接线说明四.Micro SD卡模块参考原理图五.通讯协议介绍六.FATFS文件系统介绍七.STM32F030C8T6单片机与SD卡模块实现数据读写实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.源代码工程下载九.小结 一.概要 M…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...