两种工作模式,可以理解成客户端启动镜像为拉和推的关系,citrix现在都在推荐用pvs模式。而且,pvs模式还支持无盘,特别适合于大批量同一型号客户端镜像部署,一个批次的客户端只需要做一个镜像即可,个人配置文件和缓存可利用客户端自己内存,也可通过网络利用服务器的存储空间。从实施上讲,mcs需要ddc而pvs无盘模式不需要ddc,只需要pvsserver即可。
虚拟机磁盘镜像(VMDK)文件就放置在这里,而且如果这个存储系统出现了什么问题的话,虚拟机将可能无法启动。因此,如果你的数据中心运行在XenServer环境下并且是你在管理这个数据中心,那么你就需要了解企业是如何进行数据存储的。在XenServer环境中,来自资源库的物理存储设备是可供使用的,在其上面可以创建一个数据库,并允许XenServer主机连接到存储系统。如果在识别存储的过程中出现问题,往往是由于物理存储的ID与XenServer数据库中的ID不匹配所造成的。但在我们说明如何解决这样一个问题之前,让我们来谈谈XenServer和存储之间的关系。在XenServer环境下,存储被组织成存储仓库,包括虚拟磁盘映像,物理块设备和虚拟块设备。并且虚拟机可以以不同的方式使用存储:可作为一个虚拟磁盘文件(被创建在虚拟硬盘或VHD格式),一个逻辑卷管理器(LVM),或通过思杰的StorageLink直连到SAN 。更深入探讨一下XenServer存储,一个存储库就是物理磁盘设备的抽象,它可以是本地设备或是SAN(存储区域网络)上的设备。在XenServer存储库中,虚拟磁盘映像被作为存储抽象对象来创建并可以提供给虚拟机(VM)。为了做到这一点,存储库要与基于块的设备相连接,这些设备被安装在本地机,SAN或其他地方,同时存储库要运用XenServer的物理块设备接口对象。依靠虚拟磁盘映像,存储可以提供给VM。这种存储作为虚拟块设备接口对象来提供,在VM中作为虚拟磁盘被看到。如上所述,有三种方式可以实现VM访问存储系统。最传统的方式是使用VHD文件。这些都是在2005年由微软定义的在存储库中存储的标准格式文件。自从2009年发布的XenServer55,思杰还提供了通过LVHD,或基于LVM的虚拟硬盘的访问。这种方法的好处是底层的LVM层可以使得它适用于一些先进的存储管理解决方案,如快速复制和快照。第三种方法是直接将虚拟机映射到存储阵列中的LUN。只有在你的存储阵列有插件支持的情况下这种方法才可行。在存储过程中常常发生的问题是存储识别中的不匹配。如果发生这种情况,所有存储的访问都会出现错误。在XenServer平台上,磁盘设备可以由系统的不同组件用不同的方式进行编址。在XenCenter中,存储由SCSI-ID来标识并与你在XenServer控制台中看到的UUID相匹配。如果你的存储不能从XenCenter进行访问,那么请检查UUIDS是否与用于XenCenter的UUIDs匹配,它们在XenServer控制台的/dev/disk/UUID目录下可以看到。如果存储是基于LVM的,你可以使用XenServer的控制台上的pvs命令找到的磁盘设备的存储ID。虚拟机和逻辑卷是一对一进行连接。要获得这些信息,你可以使用LVS命令,这个命令会再次显示XenCenter中应用的ID与相匹配ID的对应情况。如果有一个配置错误会影响存储的使用,那么使用主机的xe命令可能是有用的。这个命令允许你直接查询主机并能够看到它是哪个存储设备。基本的命令使用是xe sr-list。这个命令显示当前正在使用的UUID以及类型和其他所有参数,这些信息帮助你识别存储类型。你可以使用xe命令找出连接存储的更多细节。使用xe sr-list命令, 使用附加的参数,能够查询存储库以获得更多的信息。例如,如果你使用xe sr-list params=name-label 、uuid VDIs,PBDs,你可以找到被分配到存储设备中的不同uuid。我们的目标是找到在存储库中我们所看到实际设备的uuid并将他们与在XenCenter中所看到的uuid相匹配。如果有一个不匹配,你将不得不重新把存储设备导入到XenCenter管理环境中来重建数据库。xe sr-list命令提供高级查询选项来确定存储设备的ID。现在,现实中一个错误识别的例子怎样发生:一个我曾工作的IT企业在XenServer主机迁移到一个新的数据中心之后与所有的存储设备断开了连接。进行配置分析之后发现,造成问题的原因是由于存储的实际ID与XenServer所使用的数据库中的ID不匹配。曾经这成为突出的问题,但其解决方案并不难:使用xe sr-rescan来重新扫描物理设备的ID和重建数据库。从XenCenter监控可以检测存储性能。
Hive的数据管理:
(1)元数据存储
Hive 将元数据存储在 RDBMS 中,有三种模式可以连接到数据库:
Single User Mode:此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test。
Multi User Mode:通过网络连接到一个数据库中,这是最常用的模式。
Remote Server Mode:用于非 Java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer,客户端则利用 Thrift 协议通过 MetaStoreServer来访问元数据库。
(2)数据存储
首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由地组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,它就可以解析数据了。
其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含4种数据模型:Table、External Table、Partition、Bucket。
Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录来存储数据。例如,一个表 pvs,它在 HDFS 中的路径为:/wh/pvs,其中,wh 是在 hive-sitexml 中由 ${hivemetastorewarehousedir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。
Partition 对应于数据库中Partition 列的密集索引,但是 Hive 中 Partition 的组织方式与数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 数据都存储在对应的目录中。例如:pvs 表中包含 ds 和 city 两个 Partition,则对应于 ds = 20090801, city = US 的 HDFS 子目录为:/wh/pvs/ds=20090801/city=US;对应于 ds = 20090801, city = CA 的 HDFS 子目录为:/wh/pvs/ds=20090801/city=CA。
Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了便于并行,每一个 Buckets对应一个文件。将 user 列分散至 32 个Bucket上,首先对 user 列的值计算 hash,比如,对应 hash 值为 0 的 HDFS 目录为:/wh/pvs/ds=20090801/city=US/part-00000;对应hash 值为 20 的 HDFS 目录为:/wh/pvs/ds=20090801/city=US/part-00020。
External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。它和 Table 在元数据的组织结构上是相同的,而在实际数据的存储上则有较大的差异。
在Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成)中,实际数据会被移动到数据仓库目录中。之后对数据的访问将会直接在数据仓库的目录中完成。删除表时,表中的数据和元数据将会被同时删除。
External Table 只有一个过程,因为加载数据和创建表是同时完成的。实际数据是存储在 Location 后面指定的 HDFS 路径中的,它并不会移动到数据仓库目录中。
(3)数据交换
数据交换主要分为以下几个部分
需要导入jxljar (在网上可以下载,然后放到lib文件夹中)
开放分类: java
通过java *** 作excel表格的工具类库
支持Excel 95-2000的所有版本
生成Excel 2000标准格式
支持字体、数字、日期 *** 作
能够修饰单元格属性
支持图像和图表
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
搭建环境
将下载后的文件解包,得到jxljar,放入classpath,安装就完成了。
基本 *** 作
一、创建文件
拟生成一个名为“测试数据xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:
代码(CreateXLSjava):
//生成Excel的类
import javaio;
import jxl;
import jxlwrite;
public class CreateXLS
{
public static void main(String args[])
{
try
{
//打开文件
WritableWorkbook book=
WorkbookcreateWorkbook(new File(“测试xls”));
//生成名为“第一页”的工作表,参数0表示这是第一页
WritableSheet sheet=bookcreateSheet(“第一页”,0);
//在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
//以及单元格内容为test
Label label=new Label(0,0,”test”);
//将定义好的单元格添加到工作表中
sheetaddCell(label);
/生成一个保存数字的单元格
必须使用Number的完整包路径,否则有语法歧义
单元格位置是第二列,第一行,值为789123/
jxlwriteNumber number = new jxlwriteNumber(1,0,789123);
sheetaddCell(number);
//写入数据并关闭文件
bookwrite();
bookclose();
}catch(Exception e)
{
Systemoutprintln(e);
}
}
}
编译执行后,会在当前位置产生一个Excel文件。
二、读取文件
以刚才我们创建的Excel文件为例,做一个简单的读取 *** 作,程序代码如下:
//读取Excel的类
import javaio;
import jxl;
public class ReadXLS
{
public static void main(String args[])
{
try
{
Workbook book=
WorkbookgetWorkbook(new File(“测试xls”));
//获得第一个工作表对象
Sheet sheet=bookgetSheet(0);
//得到第一列第一行的单元格
Cell cell1=sheetgetCell(0,0);
String result=cell1getContents();
Systemoutprintln(result);
bookclose();
}catch(Exception e)
{
Systemoutprintln(e);
}
}
}
程序执行结果:test
四、修改文件
利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他 *** 作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表:
//修改Excel的类,添加一个工作表
import javaio;
import jxl;
import jxlwrite;
public class UpdateXLS
{
public static void main(String args[])
{
try
{
//Excel获得文件
Workbook wb=WorkbookgetWorkbook(new File(“测试xls”));
//打开一个文件的副本,并且指定数据写回到原文件
WritableWorkbook book=
WorkbookcreateWorkbook(new File(“测试xls”),wb);
//添加一个工作表
WritableSheet sheet=bookcreateSheet(“第二页”,1);
sheetaddCell(new Label(0,0,”第二页的测试数据”));
bookwrite();
bookclose();
}catch(Exception e)
{
Systemoutprintln(e);
}
}
}
三、高级 *** 作
数据格式化
在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。
1、 字串格式化
字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:
WritableFont font1=
new WritableFont(WritableFontTIMES,16,WritableFontBOLD); 或//设置字体格式为excel支持的格式 WritableFont font3=new WritableFont(WritableFontcreateFont("楷体_GB2312"),12,WritableFontNO_BOLD );① WritableCellFormat format1=new WritableCellFormat(font1); ② Label label=new Label(0,0,”data 4 test”,format1) ③ 其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。 ③处使用了Label类的构造子,指定了字串被赋予那种格式。 在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:
//把水平对齐方式指定为居中
format1setAlignment(jxlformatAlignmentCENTRE);
//把垂直对齐方式指定为居中
format1setVerticalAlignment(jxlformatVerticalAlignmentCENTRE);
//设置自动换行
format1setWrap(true);
单元格 *** 作
Excel中很重要的一部分是对单元格的 *** 作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些 *** 作相对比较简单,下面只介绍一下相关的API。
1、 合并单元格
WritableSheetmergeCells(int m,int n,int p,int q);
作用是从(m,n)到(p,q)的单元格全部合并,比如:
WritableSheet sheet=bookcreateSheet(“第一页”,0);
//合并第一列第一行到第六列第一行的所有单元格
sheetmergeCells(0,0,5,0);
合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。
2、 行高和列宽
WritableSheetsetRowView(int i,int height);
作用是指定第i+1行的高度,比如:
//将第一行的高度设为200
sheetsetRowView(0,200);
WritableSheetsetColumnView(int i,int width);
作用是指定第i+1列的宽度,比如:
//将第一列的宽度设为30
sheetsetColumnView(0,30);
四、 *** 作
public static void write()throws Exception{
WritableWorkbook wwb=WorkbookcreateWorkbook(new File("c:/1xls"));
WritableSheet ws=wwbcreateSheet("Test Sheet 1",0);
File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281png");
WritableImage image=new WritableImage(1, 4, 6, 18,file);
wsaddImage(image);
wwbwrite();
wwbclose();
}
很简单和插入单元格的方式一样,不过就是参数多了些,WritableImage这个类继承了Draw,上面只是他构造方法的一种,最后一个参数不用了说了,前面四个参数的类型都是double,依次是 x, y, width, height,注意,这里的宽和高可不是的宽和高,而是所要占的单位格的个数,因为继承的Draw所以他的类型必须是double,具体里面怎么实现的我还没细看:)因为着急赶活,先完成功能,其他的以后有时间慢慢研究。以后会继续写出在使用中的心得给大家。
读:
读的时候是这样的一个思路,先用一个输入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet从工作薄中得到工作表,用Cell得到工作表中得某个单元格
InputStream->Workbook->Sheet->Cell,就得到了excel文件中的单元格
代码:
String path="c:\\excelxls";//Excel文件URL
InputStream is = new FileInputStream(path);//写入到FileInputStream
jxlWorkbook wb = WorkbookgetWorkbook(is); //得到工作薄
jxlSheet st = wbgetSheet(0);//得到工作薄中的第一个工作表
Cell cell=stgetCell(0,0);//得到工作表的第一个单元格,即A1
String content=cellgetContents();//getContents()将Cell中的字符转为字符串
wbclose();//关闭工作薄
isclose();//关闭输入流
我们可以通过Sheet的getCell(x,y)方法得到任意一个单元格,x,y和excel中的坐标对应
例如A1对应(0,0),A2对应(0,1),D3对应(3,2)Excel中坐标从A,1开始,jxl中全部是从0开始
还可以通过Sheet的getRows(),getColumns()方法得到行数列数,并用于循环控制,输出一个sheet中的所有内容
写:
往Excel中写入内容主要是用jxlwrite包中的类
思路是这样的:
OutputStream<-WritableWorkbook<-WritableSheet<-Label
这里面Label代表的是写入Sheet的Cell位置及内容
代码:
OutputStream os=new FileOutputStream("c:\\testxls");//输出的Excel文件URL
WritableWorkbook wwb = WorkbookcreateWorkbook(os);//创建可写工作薄
WritableSheet ws = wwbcreateSheet("sheet1", 0);//创建可写工作表
Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容
wsaddCell(labelCF);//将Label写入sheet中
Label的构造函数Label(int x, int y,String aString)xy意同读的时候的xy,aString是写入的内容
WritableFont wf = new WritableFont(WritableFontTIMES, 12, WritableFontBOLD, false);//设置写入字体
WritableCellFormat wcfF = new WritableCellFormat(wf);//设置CellFormat
Label labelCF=new Label(0, 0, "hello");//创建写入位置,内容和格式
Label的另一构造函数Label(int c, int r, String cont, CellFormat st)可以对写入内容进行格式化,设置字体及其它的属性
现在可以写了
wwbwrite();
写完后关闭
wwbclose();
输出流也关闭吧
osclose;
OK,只要把读和写结合起来,就可以在N个Excel中读取数据写入你希望的Excel新表中,还是比较方便的
下面是程序一例:
程序代码:sql = "select from tablename";
rs = stmtexecuteQuery(sql);
//新建Excel文件
String filePath=requestgetRealPath("aaaxls");
File myFilePath=new File(filePath);
if(!myFilePathexists())
myFilePathcreateNewFile();
FileWriter resultFile=new FileWriter(myFilePath);
PrintWriter myFile=new PrintWriter(resultFile);
resultFileclose();
//用JXL向新建的文件中添加内容
OutputStream outf = new FileOutputStream(filePath);
jxlwriteWritableWorkbook wwb = WorkbookcreateWorkbook(outf);
jxlwriteWritableSheet ws = wwbcreateSheet("sheettest", 0);
int i=0;
int j=0;
for (int k = 0; k < rsgetMetaData()getColumnCount(); k++) {
wsaddCell(new Label(k,0,rsgetMetaData()getColumnName(k+1)));
}
while(rsnext()){
outprintln(rsgetMetaData()getColumnCount());
for (int k = 0; k < rsgetMetaData()getColumnCount(); k++) {
wsaddCell(new Label(k,j+i+1,rsgetString(k+1)));
}
i++;
}
wwbwrite();
wwbclose();
}catch(Exception e){eprintStackTrace();}
finally{
rsclose();
connclose();
}
responsesendRedirect("aaaxls");
以上就是关于大神 问下 citrix 的MCS 和PVS有什么区别全部的内容,包括:大神 问下 citrix 的MCS 和PVS有什么区别、Citrix XenServer存储:如何工作会呈现那些错误、在hive中怎样删除一张有数据的管理表,包括删除数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)