天天看点

云计算复习索引

每晚睡前复习一个题,云计算必高分过系列

为了提高学习效率,这里搬个​​​友链​​

这里写目录标题

  • ​​以下所有内容可能有误,请自行甄别​​
  • ​​一. HBase && Spark​​
  • ​​1. HBase​​
  • ​​① Shell​​
  • ​​② IDE 下 CRUD​​
  • ​​2. Spark(Shell下)​​
  • ​​①从外部数据源创建DataFrame​​
  • ​​②根据JSON数据转化为二维表​​
  • ​​③Spark SQL​​
  • ​​④DataFrame基本操作​​
  • ​​二. Docker/分布式部署/分布式集群​​
  • ​​1.CentOS + JDK + Tomcat制作镜像​​
  • ​​2.k8s中部署已有镜像​​
  • ​​三 . 云计算资源管理​​
  • ​​1.Mesos 分布式计算资源管理框架(本身不计算)​​
  • ​​2. Openstack​​

以下所有内容可能有误,请自行甄别

一. HBase && Spark

1. HBase

启动集群后:

云计算复习索引

① Shell

  1. 建表

    ​​

    ​create​

    ​​用来建表

    ​​

    ​create "apple","base_info"​

    ​ 其中,apple为表名,base_info为列族,列族至少有一个
  2. 云计算复习索引
  3. 查看所创建的表:
  4. 云计算复习索引
  5. 插入数据

    ​​

    ​put​

    ​​ 命令用来插入

    ​​

    ​put "apple","0001","base_info:weight","89"​

其中apple为表名,0001为行键,base_info为列族(必须是已经创建了的),weight为列名,89为具体的值

云计算复习索引

其余可​​参考​​:

云计算复习索引

在上图中,在创建表的时候,可以用命令:

​create "Student","Stuinfo","Grades"​

​列族是可以后续添加的,比如:

​alter "apple","extra_info"​

再插入数据:

​put "apple","0001","extra_info:grade","good"​

​然后继续插入信息可以查看到更新后的表信息:

云计算复习索引
  1. 浏览数据

    ​​

    ​get​

    ​​命令可以用来获取表中的数据

    ​​

    ​get "apple","0001"​

    ​​ 其中,apple为表名,0001为行键

    可以看见:

云计算复习索引

​scan "apple"​

​用来获取所有的信息

apple为表名

云计算复习索引

在结果中我们可以看到两部分

第一部分是:ROW为0001

第二部分是:COLUMN(包含列的名字​

​列族:列名​

​的形式)+CELL(时间戳和值)

指定获取某个值:

​get "apple","0001","base_info:weight"​

​ 其中,apple为表名,0001为行键,base_info为列族,weight为列名

云计算复习索引
  1. 分析

    HBase的插入和删除操作与关系型数据库(e.g. MySQL)的区别 感觉必考

插入的区别(个人总结,可能不对):
  1. 时间戳

    HBase一次只能插入一个表一个列族某单元格的数据,插入时自动加时间戳。而MySQL再插入的过程中,不会自动加时间戳,而且必须要严格按照表的结构来进行插入,也就说在MySQL中是没有办法通过列来进行插入的,但是HBase是可以的(HBase插入要提供表名、行键的名称、列族和列的名称,列名是临时定义的,列族里的列可以随意扩展,极大程度上扩大了数据的存储结构,这也决定了HBase适合大数据的存储、具有高效性的特点)

    2.命令方面

    在执行的插入命令方面,HBase通过命令put来进行插入,而MySQL通过insert命令来进行插入。

    底层方面:在MySQL(不仅仅是MySQL,是包括MySQL所有的关系型数据库)的底层方面,是通过关系代数的运算来实现的,而HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等。

删除的区别(来自网络 && 个人总结):
  1. 删除的方式不同

    HBase不会定位到需要删除或更新的记录进行操作。由于HBase底层依赖HDFS,对于HBase删除操作来说,HBase无法在查询到之前的数据并进行修改,只能顺序读写,追加记录。为了更新或删除数据,HBase会插入一条一模一样的新的数据,但是key type会标记成Delete状态,以标记该记录被删除了。在读取的时候如果取到了是Delete,而且时间是最新的,那么这条记录肯定是被删掉了,从而达到删除的目的。

    对于关系型数据库来说,进行删除会直接将二维表中的某一行删除掉

  2. 删除的粒度不同

    在HBase中进行删除的时候,如果使用命令delete ,可以从表中删除一个单元格或一个行集,语法与 put 类似,必须指明表名和列族名称,而列名和时间戳是可选的。删除的粒度可以是单元格或者是一个行集,要想删除一整个数据,要使用deleteall(原因是:delete 命令不能跨列族操作,如需删除表中所有列族在某一行上的数据,即删除上表中一个逻辑行,则需要使用 deleteall 命令,不需要指定列族和列的名称,只需要指定表明和行键即可);但是在关系型数据库中,不能够删除一个单元格,在关系型数据库中删除的最小粒度是行,即二维表中的一整条数据。

    3.使用的命令不同

    在关系型数据库中(以MySQL为例),可以使用delete或者是truncate 进行删除,前者可以根据一定的条件进行删除,而后者是删除整个表。在HBase中,删除的命令是delete 和 deleteall,前者用于删除单元格或者是行集(在某一个列组内删除),后者是删除整个逻辑行(跨越列族的限制)

② IDE 下 CRUD

给定JSON or XML数据

比如:

云计算复习索引

或者是:

云计算复习索引

或者是xml格式:

云计算复习索引

转换为二维表就是:

云计算复习索引
  1. 连接数据库
public static void getConnect() throws IOException
{
    conf.set("hbase.zookeeper.quorum", "master315");
    conf.set("hbase.zookeeper.property.clientPort", "2181");
    //conf.set("zookeeper.znode.parent", "/hbase");
    try{ connection=ConnectionFactory.createConnection(conf);  }
    catch(IOException e){     }
}      

其中master315为主机名

2. 创建表

//创建一张表,通过HBaseAdmin HTableDescriptor来创建  
public static void createTable(String tablename) throws Exception {
    TableName tableName = TableName.valueOf(tablename);
    Admin admin = connection.getAdmin();
    if (admin.tableExists(tableName)) {
        admin.disableTable(tableName);
        admin.deleteTable(tableName);
        System.out.println(tablename + " table Exists, delete ......");
    }
    @SuppressWarnings("deprecation")
    HTableDescriptor desc = new HTableDescriptor(tableName);
    @SuppressWarnings("deprecation")
    HColumnDescriptor colDesc = new HColumnDescriptor("base_info");
    colDesc.setBloomFilterType(BloomType.ROWCOL);
    desc.addFamily(colDesc);
    desc.addFamily(new HColumnDescriptor("extra_info"));
    admin.createTable(desc);
    admin.close();
    System.out.println("create table success!");
}      
  1. 插入数据
public static void addData(String tablename) throws Exception {
          HTable table = (HTable) connection.getTable(TableName.valueOf(tablename));
          Put p1 = new Put(Bytes.toBytes("0001"));
          p1.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("weight"), Bytes.toBytes(String.valueOf(89)));
          p1.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("caption"), Bytes.toBytes("GuoGuang"));
          p1.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("production"), Bytes.toBytes("LongKou"));
          p1.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("grade"), Bytes.toBytes("good"));
          table.put(p1);

          Put p2 = new Put(Bytes.toBytes("0002"));
          p2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("weight"), Bytes.toBytes(String.valueOf(50)));
          p2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("caption"), Bytes.toBytes("HongFuShi"));
          table.put(p2);
          
          table.close();
          System.out.print("insert successed");
          }      

shell可查:

云计算复习索引
  1. 浏览全部信息

    因为已知插入了两行,所以代码直接for i到2:

    此代码普适性不够高,但是适合浏览以某一个字符串开头比如"000"开头的row key或者是某一个单独的行

public static void getData(String tablename) throws IOException {
        HTable table = (HTable) connection.getTable(TableName.valueOf(tablename));
        for (int i = 1; i <= 2; i++) {
            Get get = new Get(Bytes.toBytes("000" + String.valueOf(i)));
            Result result = table.get(get);
            if (result != null && !result.isEmpty()) {
                for (Cell cell : result.listCells()) {
                    String family = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                    String key = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                    String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println(family + "  " + key + ": " + value);
                }
            }
            System.out.println("");
        }
    }      
云计算复习索引

如果说在事先不知道有多少行的情况下,建议采用下面的方法:

public static void getAllRows(String tableName) throws IOException {
    HTable table = (HTable) connection.getTable(TableName.valueOf(tableName));
    Scan scan = new Scan();
    ResultScanner resultScanner = table.getScanner(scan);
    for(Result result : resultScanner){
      Cell[] cells = result.rawCells();
      for(Cell cell : cells) {
        System.out.println("Row Key: " + Bytes.toString(CellUtil.cloneRow(cell)));
        System.out.println("Column Family: " + Bytes.toString(CellUtil.cloneFamily(cell)));
        System.out.println("Column: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
        System.out.println("Value :" + Bytes.toString(CellUtil.cloneValue(cell)) + "\n\n");
      }
    }
  }      

结果如下图:

云计算复习索引

2. Spark(Shell下)

首先我们可以通过:

​/usr/local/hadoop/sbin/start-all.sh​

​打开hadoop

​/usr/local/spark/sbin/start-all.sh​

​​

​/usr/local/spark/sbin/start-slaves.sh​

​打开spark

然后通过命令:​

​spark-shell​

​进入终端进行操作

云计算复习索引

结构化数据文件创建DataFrame

一般情况下,把结构化数据文件存储在HDFS。Spark SQL最常见的结构化数据文件格式是Parquet文件或JSON文件。Spark SQL可以通过load()方法将HDFS上的格式化文件转换为DataFrame,load默认导入的文件格式是Parquet。

①从外部数据源创建DataFrame

加入我们有一个这样的json文件:

云计算复习索引

我们将它放到虚拟机的某一个确定的hdfs路径下,比如​

​hdfs://master315:9000/person.js​

​ 取名为person.json

如果文件放到本地,会出现问题:

云计算复习索引

是因为没有通过​

​file://​

​指定位置,比如:​

​file:///home/person.json​

所以要刻意注意下文件放的位置​

​var df=spark.read.format("json").load("/person.json")​

云计算复习索引

②根据JSON数据转化为二维表

将json二维结构化出来应该是这个样子的:

name height sex
username01 170
username02 M

经过第三部之后,再来看这里,就会发现通过df.show()直接展示结果:

云计算复习索引

③Spark SQL

​df.createTempView("Tabel1")​

​ 这里的Tabel1是表名

云计算复习索引

​df.show()​

云计算复习索引

比如说查看所有信息:

​spark.sql("select * from Tabel1").show()​

云计算复习索引

展示性别为’M’的人信息:

云计算复习索引

④DataFrame基本操作

输出所有人名:

​df.select(df("name")).show()​

云计算复习索引

当然还有其它操作:

云计算复习索引

其中name和age都是表中的字段名可以理解为和height、sex一样

云计算复习索引

upd:20220608 21:22

二. Docker/分布式部署/分布式集群

1.CentOS + JDK + Tomcat制作镜像

在制作镜像时,有若干种方法,比如通过通过Dockerfile或者是docker commit等,这里我们采用前者即通过Dockerfile来制作镜像

在这一部分,需要:①知道拉取基础镜像,②清楚维护者信息,③构建镜像时执行的命令有哪些,④运行容器后执行的命令有哪些

①准备docker镜像(空白)拉取:

​​

​docker pull centos​

​​ ②维护者信息通过命令​

​MAINTAINER​

​ ③构建镜像时执行的命令

​ADD COPY ENV RUN​

​ ④运行容器后执行的命令

​CMD ENTPOINT​

FROM centos:latest   # 拉取
MAINTAINER    MYSTUID_IS_3315   # 维护者信息以学号标示
RUN mkdir _path   # 构建镜像时创建目录  _path(比如/usr/local/Contest)  mkdir为常用命令,其余常用命令应有所了解
RUN mkdir _path   # 构建镜像时创建目录  _path(比如/usr/local/Contest)  mkdir为常用命令,其余常用命令应有所了解      

将本地文件 JDK复制到 _path 下

这里复制有两个命令:

ADD && COPY

ADD有时无法通过COPY来代替,但是ADD是可以替代COPY的

最好使用ADD命令,优点如下:

可以对本地文件进行提取和解压缩

可以根据URL(如果注明为​​

​http://​

​必须使用ADD)从远程来进行拉取下载,但是注意此时不会进行提取和解压缩

​​

​ADD _sourcePath _targetPath​

​​ _sourcePath为源路径,可以是URL

_targetPath为目标路径

如果说_sourcePath是一个URL(网络文件),则不会自动解压,需要添加命令进行命令解压

​RUN tar -zxvf _localPath -C _targetPath​

​ _localPath为本地目录

_targetPath为目标路径,即要放到哪里

COPY只能是在本地进行

这时就要分两步进行:

①拷贝 ②解压缩

​​

​COPY _sourcePath _targetPath​

​​ _sourcePath为源路径

_targetPath为目标路径

​RUN tar -zxvf _localPath -C _targetPath​

​ _localPath为本地目录

_targetPath为目标路径,即要放到哪里

这里要注意,如果告知为本地当前文件即和Dockerfile在同一个目录下,则不需要添加路径,也就是_localPath为一个文件名;如果说和Dockerfile不在同一个目录下,则需要加上一个绝对路径标示源文件所在地

再加上Tomcat,和JDK思路相同(根据要求决定用COPY还是ADD)

样例项目文件放到指定路径下,(可以是自己打的jar包这里以 a.jar为例)

​​

​ADD a.jar _targetPath​

​​ 这里_targetPath为指定目录以/opt为例则是:

​​

​ADD a.jar /opt​

​RUN chmod +x /opt/a.jar​

​​ 添加可运行的权限

运行:

​​

​CMD java -jar /opt/a.jar​

​ # java -jar为基础的Java运行jar包的命令

到此,Dockerfile编辑完毕

通过命令来执行镜像的生成:

​docker build -t _imageName .​

​​ 其中_imageName为镜像的名字,==一定一定不要忘记最后的小点儿 ==

云计算复习索引

如果说添加的不是一个jar包,或者是说样例项目文件不是一个jar而是一个脚本(.sh),可以参考之前博客:​​传送门​​

云计算复习索引

单独记一下CMD命令的格式

CMD 系统命令

CMD [“/bin/sh”,“-c”,“targetFile.sh”]

其中/bin/sh为脚本的解释器,-c为参数,taragetFile.sh为脚本文件

2.k8s中部署已有镜像

通过上面的操作:

云计算复习索引

我们已经得到了镜像名为 _imageName的镜像

部署的命令:

​​

​kubectl create deployment 部署的名字 --image=镜像名​

​​ 也就是

​kubectl create deployment 部署的名字 --image=_imageName​

暴露接口:

这里既可以用deploy,也可以用deployment,都是对的

​​

​kubectl expose deploy 部署的名字 --port=80 --type=NodePort​

​ port为指定暴露的端口

查询外部访问接口:

​​

​kubectl get service​

upd:2022-06-13 20:46

三 . 云计算资源管理

1.Mesos 分布式计算资源管理框架(本身不计算)

主机名 ip addr Mesos Yarn Spark
Slave NodeManager Master
Master ResourceManager Worker

不一定是这么对应的,只是说明了包含关系

Mesos包含Master和Slave

Yarn包含NodeManager 和 ResourceManager

Spark包含Master 和 Worker

k8s是Master Node

2. Openstack

openstack的服务架构:

云计算复习索引
云计算复习索引
云计算复习索引

这里要注意对象存储和块存储的定义区别适用场景

有哪些服务,服务又是属于哪个项目

一键部署的时候,怎么设置参数

配置文件 answer.txt参数修改

继续阅读