使用Cloudera Manager模板创建CDH群集

您可以通过从Cloudera Manager管理的现有CDH群集导出群集模板来创建新的CDH群集。然后,您可以修改模板并使用它在新的主机集上创建具有相同配置的新集群。使用群集模板:

  • 用于开发人员,测试和生产环境的重复群集。
  • 快速为特定工作负载创建集群。
  • 重现生产群集以进行测试和调试。
按照以下常规步骤创建模板和新集群:
  1. 从源群集导出群集配置。导出的配置是一个JSON文件,详细说明了群集的所有配置。JSON文件包含一个 实例化 包含在创建新集群之前必须提供的某些值的节。

    请参阅导出群集配置

  2. 通过在所有主机上安装Cloudera Manager代理和JDK,为新群集设置主机。对于安全群集,还要在Cloudera Manager中配置Kerberos密钥分发中心(KDC)。

    请参阅准备新群集

  3. 创建群集所需的任何本地存储库。

    请参阅步骤1:为Cloudera Manager配置存储库

  4. 完成 实例化 用于创建模板的集群配置JSON文档的一部分。

    请参阅创建模板

  5. 将群集模板导入新群集。

    请参阅将模板导入新群集

导出群集配置

要创建群集模板,首先要从源群集导出配置。群集必须由Cloudera Manager 5.7或更高版本运行和管理。

要导出配置:
  1. 您创建的任何主机模板都用于导出配置。如果您不想在新群集中使用这些模板,请将其删除。在Cloudera Manager中,转到“ 主机” >“ 主机模板”,然后单击要 删除的主机模板旁边的“删除”。
  2. 删除Cloudera Manager安装向导创建的所有主机模板。他们通常有一个名字模板 - 1)。
  3. 运行以下命令将JSON配置文件下载到方便的位置进行编辑:
    curl -u admin_usernameadmin_user_password
    “http:// Cloudera Manager URL / api / v12 / clusters / Cluster name / export”>
    path_to_file / file_name .json

    例如:

    curl -u adminuser:adminpass“http://myCluster-1.myDomain.com:7180/api/v12/clusters/Cluster1/export”> myCluster1-template.json

    注意:添加?exportAutoConfig = TRUE上述命令的参数,包括自动配置所做的配置。这些配置仅供参考,在将模板导入新群集时不会使用。例如:

    curl -u admin_usernameadmin_user_password
    “http:// Cloudera Manager URL / api / v12 / clusters / Cluster name / export”>
    path_to_file / file_name .json?exportAutoConfig = true

准备新群集

导入群集模板的新群集必须满足以下要求:

  • 已安装并配置Cloudera Manager数据库。
  • 已安装并运行Cloudera Manager 5.7或更高版本。
  • 安装了所有必需的CDH服务数据库。请参阅步骤4:安装和配置数据库
  • JDK安装在所有群集主机上。
  • Cloudera Manager Agent已在所有群集主机上安装和配置。
  • 如果源群集使用Kerberos,则新群集必须具有在Cloudera Manager中配置的KDC属性和权限。
  • 如果源群集使用程序包来安装CDH和托管服务,请在导入模板之前手动安装这些程序包。请参阅使用Cloudera Manager管理软件安装

创建模板

要创建模板,请修改 实例化您下载的JSON文件的一部分。包含字符串的行<changeme>需要一个你必须提供的值。这是一个样本实例化 部分:
 "instantiator" : {
    "clusterName" : "<changeme>",
    "hosts" : [ {
      "hostName" : "<changeme>",
      "hostTemplateRefName" : "<changeme>",
      "roleRefNames" : [ "HDFS-1-NAMENODE-0be88b55f5dedbf7bc74d61a86c0253e" ]
    }, {
      "hostName" : "<changeme>",
      "hostTemplateRefName" : "<changeme>"
    }, {
      "hostNameRange" : "<HOST[0001-0002]>",
      "hostTemplateRefName" : "<changeme>"
    } ],
    "variables" : [ {
      "name" : "HDFS-1-NAMENODE-BASE-dfs_name_dir_list",
      "value" : "/dfs/nn"
    }, {
      "name" : "HDFS-1-SECONDARYNAMENODE-BASE-fs_checkpoint_dir_list",
      "value" : "/dfs/snn"
    }, {
      "name" : "HIVE-1-hive_metastore_database_host",
      "value" : "myCluster-1.myDomain.com"
    }, {
      "name" : "HIVE-1-hive_metastore_database_name",
      "value" : "hive1"
    }, {
      "name" : "HIVE-1-hive_metastore_database_password",
      "value" : "<changeme>"
    }, {
      "name" : "HIVE-1-hive_metastore_database_port",
      "value" : "3306"
    }, {
      "name" : "HIVE-1-hive_metastore_database_type",
      "value" : "mysql"
    }, {
      "name" : "HIVE-1-hive_metastore_database_user",
      "value" : "hive1"
    }, {
      "name" : "HUE-1-database_host",
      "value" : "myCluster-1.myDomain.com"
    }, {
      "name" : "HUE-1-database_name",
      "value" : "hueserver0be88b55f5dedbf7bc74d61a86c0253e"
    }, {
      "name" : "HUE-1-database_password",
      "value" : "<changeme>"
    }, {
      "name" : "HUE-1-database_port",
      "value" : "3306"
    }, {
      "name" : "HUE-1-database_type",
      "value" : "mysql"
    }, {
      "name" : "HUE-1-database_user",
      "value" : "hueserver0be88b5"
    }, {
      "name" : "IMPALA-1-IMPALAD-BASE-scratch_dirs",
      "value" : "/impala/impalad"
    }, {
      "name" : "KUDU-1-KUDU_MASTER-BASE-fs_data_dirs",
      "value" : "/var/lib/kudu/master"
    }, {
      "name" : "KUDU-1-KUDU_MASTER-BASE-fs_wal_dir",
      "value" : "/var/lib/kudu/master"
    }, {
      "name" : "KUDU-1-KUDU_TSERVER-BASE-fs_data_dirs",
      "value" : "/var/lib/kudu/tserver"
    }, {
      "name" : "KUDU-1-KUDU_TSERVER-BASE-fs_wal_dir",
      "value" : "/var/lib/kudu/tserver"
    }, {
      "name" : "MAPREDUCE-1-JOBTRACKER-BASE-jobtracker_mapred_local_dir_list",
      "value" : "/mapred/jt"
    }, {
      "name" : "MAPREDUCE-1-TASKTRACKER-BASE-tasktracker_mapred_local_dir_list",
      "value" : "/mapred/local"
    }, {
      "name" : "OOZIE-1-OOZIE_SERVER-BASE-oozie_database_host",
      "value" : "myCluster-1.myDomain.com:3306"
    }, {
      "name" : "OOZIE-1-OOZIE_SERVER-BASE-oozie_database_name",
      "value" : "oozieserver0be88b55f5dedbf7bc74d61a86c0253e"
    }, {
      "name" : "OOZIE-1-OOZIE_SERVER-BASE-oozie_database_password",
      "value" : "<changeme>"
    }, {
      "name" : "OOZIE-1-OOZIE_SERVER-BASE-oozie_database_type",
      "value" : "mysql"
    }, {
      "name" : "OOZIE-1-OOZIE_SERVER-BASE-oozie_database_user",
      "value" : "oozieserver0be88"
    }, {
      "name" : "YARN-1-NODEMANAGER-BASE-yarn_nodemanager_local_dirs",
      "value" : "/yarn/nm"
    }, {
      "name" : "YARN-1-NODEMANAGER-BASE-yarn_nodemanager_log_dirs",
      "value" : "/yarn/container-logs"
    } ]
  }
要修改模板:
  1. 更新 hosts 部分。

    如果您在源群集中定义了主机模板,它们将显示在 hostTemplatesJSON模板的一部分。对于不使用主机模板的主机,导出过程会根据角色分配创建主机模板,以便于创建新群集。在任何一种情况下,您必须匹配中的项目hostTemplates 部分与 hosts 中的部分 instantiator  部分。
    这是一个样本 hostTemplates 来自与JSON文件相同的部分 instantiator  部分,上面:
 "hostTemplates" : [ {
    "refName" : "HostTemplate-0-from-myCluster-1.myDomain.com",
    "cardinality" : 1,
    "roleConfigGroupsRefNames" : [ "FLUME-1-AGENT-BASE", "HBASE-1-GATEWAY-BASE", "HBASE-1-HBASETHRIFTSERVER-BASE", "HBASE-1-MASTER-BASE", "HDFS-1-BALANCER-BASE", "HDFS-1-GATEWAY-BASE", "HDFS-1-NAMENODE-BASE", "HDFS-1-NFSGATEWAY-BASE", "HDFS-1-SECONDARYNAMENODE-BASE", "HIVE-1-GATEWAY-BASE", "HIVE-1-HIVEMETASTORE-BASE", "HIVE-1-HIVESERVER2-BASE", "HUE-1-HUE_LOAD_BALANCER-BASE", "HUE-1-HUE_SERVER-BASE", "IMPALA-1-CATALOGSERVER-BASE", "IMPALA-1-STATESTORE-BASE", "KAFKA-1-KAFKA_BROKER-BASE", "KS_INDEXER-1-HBASE_INDEXER-BASE", "KUDU-1-KUDU_MASTER-BASE", "MAPREDUCE-1-GATEWAY-BASE", "MAPREDUCE-1-JOBTRACKER-BASE", "OOZIE-1-OOZIE_SERVER-BASE", "SOLR-1-SOLR_SERVER-BASE", "SPARK_ON_YARN-1-GATEWAY-BASE", "SPARK_ON_YARN-1-SPARK_YARN_HISTORY_SERVER-BASE", "SQOOP-1-SQOOP_SERVER-BASE", "SQOOP_CLIENT-1-GATEWAY-BASE", "YARN-1-GATEWAY-BASE", "YARN-1-JOBHISTORY-BASE", "YARN-1-RESOURCEMANAGER-BASE", "ZOOKEEPER-1-SERVER-BASE" ]
  }, {
    "refName" : "HostTemplate-1-from-myCluster-4.myDomain.com",
    "cardinality" : 1,
    "roleConfigGroupsRefNames" : [ "FLUME-1-AGENT-BASE", "HBASE-1-REGIONSERVER-BASE", "HDFS-1-DATANODE-BASE", "HIVE-1-GATEWAY-BASE", "IMPALA-1-IMPALAD-BASE", "KUDU-1-KUDU_TSERVER-BASE", "MAPREDUCE-1-TASKTRACKER-BASE", "SPARK_ON_YARN-1-GATEWAY-BASE", "SQOOP_CLIENT-1-GATEWAY-BASE", "YARN-1-NODEMANAGER-BASE" ]
  }, {
    "refName" : "HostTemplate-2-from-myCluster-[2-3].myDomain.com",
    "cardinality" : 2,
    "roleConfigGroupsRefNames" : [ "FLUME-1-AGENT-BASE", "HBASE-1-REGIONSERVER-BASE", "HDFS-1-DATANODE-BASE", "HIVE-1-GATEWAY-BASE", "IMPALA-1-IMPALAD-BASE", "KAFKA-1-KAFKA_BROKER-BASE", "KUDU-1-KUDU_TSERVER-BASE", "MAPREDUCE-1-TASKTRACKER-BASE", "SPARK_ON_YARN-1-GATEWAY-BASE", "SQOOP_CLIENT-1-GATEWAY-BASE", "YARN-1-NODEMANAGER-BASE" ]
  } ]
的价值  cardinality 表示为源群集中的主机模板分配了多少主机。

的价值 roleConfigGroupsRefNames 指示将哪些角色组分配给主机。

对于每个主机模板执行以下操作 hostTemplates 部分:
  1. 找到中的条目 hosts 部分  instantiator 您希望安装角色的位置。
  2. 复制的值 refName 为了价值 hostTemplateRefName。
  3. 在新集群中输入主机名作为值 主机名。某些主机部分可能会改为使用hostNameRange对于具有多个具有相同角色集的主机的群集。使用以下方法之一指示一系列主机:
    • 括号; 例如, myhost[1-4].foo.com
    • 逗号分隔的主机名字符串; 例如,host-1.domain,host-2.domain,host-3.domain
这是一个例子 hostTemplates 和 hosts 部分 instantiator 正确完成:
"hostTemplates" : [ {
    "refName" : "HostTemplate-0-from-myCluster-1.myDomain.com",
    "cardinality" : 1,
    "roleConfigGroupsRefNames" : [ "FLUME-1-AGENT-BASE", "HBASE-1-GATEWAY-BASE", "HBASE-1-HBASETHRIFTSERVER-BASE", "HBASE-1-MASTER-BASE", "HDFS-1-BALANCER-BASE", "HDFS-1-GATEWAY-BASE", "HDFS-1-NAMENODE-BASE", "HDFS-1-NFSGATEWAY-BASE", "HDFS-1-SECONDARYNAMENODE-BASE", "HIVE-1-GATEWAY-BASE", "HIVE-1-HIVEMETASTORE-BASE", "HIVE-1-HIVESERVER2-BASE", "HUE-1-HUE_LOAD_BALANCER-BASE", "HUE-1-HUE_SERVER-BASE", "IMPALA-1-CATALOGSERVER-BASE", "IMPALA-1-STATESTORE-BASE", "KAFKA-1-KAFKA_BROKER-BASE", "KS_INDEXER-1-HBASE_INDEXER-BASE", "KUDU-1-KUDU_MASTER-BASE", "MAPREDUCE-1-GATEWAY-BASE", "MAPREDUCE-1-JOBTRACKER-BASE", "OOZIE-1-OOZIE_SERVER-BASE", "SOLR-1-SOLR_SERVER-BASE", "SPARK_ON_YARN-1-GATEWAY-BASE", "SPARK_ON_YARN-1-SPARK_YARN_HISTORY_SERVER-BASE", "SQOOP-1-SQOOP_SERVER-BASE", "SQOOP_CLIENT-1-GATEWAY-BASE", "YARN-1-GATEWAY-BASE", "YARN-1-JOBHISTORY-BASE", "YARN-1-RESOURCEMANAGER-BASE", "ZOOKEEPER-1-SERVER-BASE" ]
  }, {
    "refName" : "HostTemplate-1-from-myCluster-4.myDomain.com",
    "cardinality" : 1,
    "roleConfigGroupsRefNames" : [ "FLUME-1-AGENT-BASE", "HBASE-1-REGIONSERVER-BASE", "HDFS-1-DATANODE-BASE", "HIVE-1-GATEWAY-BASE", "IMPALA-1-IMPALAD-BASE", "KUDU-1-KUDU_TSERVER-BASE", "MAPREDUCE-1-TASKTRACKER-BASE", "SPARK_ON_YARN-1-GATEWAY-BASE", "SQOOP_CLIENT-1-GATEWAY-BASE", "YARN-1-NODEMANAGER-BASE" ]
  }, {
    "refName" : "HostTemplate-2-from-myCluster-[2-3].myDomain.com",
    "cardinality" : 2,
    "roleConfigGroupsRefNames" : [ "FLUME-1-AGENT-BASE", "HBASE-1-REGIONSERVER-BASE", "HDFS-1-DATANODE-BASE", "HIVE-1-GATEWAY-BASE", "IMPALA-1-IMPALAD-BASE", "KAFKA-1-KAFKA_BROKER-BASE", "KUDU-1-KUDU_TSERVER-BASE", "MAPREDUCE-1-TASKTRACKER-BASE", "SPARK_ON_YARN-1-GATEWAY-BASE", "SQOOP_CLIENT-1-GATEWAY-BASE", "YARN-1-NODEMANAGER-BASE" ]
  } ],
  "instantiator" : {
    "clusterName" : "myCluster_new",
    "hosts" : [ {
      "hostName" : "myNewCluster-1.myDomain.com",
      "hostTemplateRefName" : "HostTemplate-0-from-myCluster-1.myDomain.com",
      "roleRefNames" : [ "HDFS-1-NAMENODE-c975a0b51fd36e914896cd5e0adb1b5b" ]
    }, {
      "hostName" : "myNewCluster-5.myDomain.com",
      "hostTemplateRefName" : "HostTemplate-1-from-myCluster-4.myDomain.com"
    }, {
      "hostNameRange" : "myNewCluster-[3-4].myDomain.com",
      "hostTemplateRefName" : "HostTemplate-2-from-myCluster-[2-3].myDomain.com"
    } ],
2.对于具有。的主机部分 roleRefNamesline,确定角色类型并为角色分配适当的主机。如果有多个角色实例,则必须选择正确的主机。要确定角色类型,请在模板文件中搜索值roleRefNames。

例如:对于名为的角色引用 HDFS-1的NameNode,0be88b55f5dedbf7bc74d61a86c0253e,如果搜索该字符串,则会找到类似于以下内容的部分:
"roles": [
{
"refName": "HDFS-1-NAMENODE-0be88b55f5dedbf7bc74d61a86c0253e",
"roleType": "NAMENODE"
}
]
在这种情况下,角色类型是 的NameNode。
3. 修改variables 部分。此部分包含源群集中的各种属性。您可以在新群集中将这些值中的任何值更改为不同,也可以将值保留为从源复制的值。对于显示为的任何值<changeme>,您必须提供正确的值。注意:其中许多变量包含有关Hive Metastore和其他CDH组件使用的数据库的信息。更改这些变量的值以匹配为新群集配置的数据库。
4. 在行上输入新群集的内部名称 “clusterName”:“<changeme>”。例如:
"clusterName" : "QE_test_cluster"
  1. (可选)更改群集的显示名称。编辑以。开头的行“显示名称”(靠近JSON文件的顶部); 例如:

    “displayName”:“myNewCluster”,

将模板导入新群集

要导入群集模板:
  1. 以root身份登录Cloudera Manager服务器。
  2. 运行以下命令以导入模板。如果在源群集中配置了远程存储库URL,请附加命令 ?addRepositories=true。
curl -X POST -H "Content-Type: application/json" -d
      @path_to_template/template_filename.json
http://admin_user:admin_password@cloudera_manager_url:cloudera_manager_port/api/v12/cm/importClusterTemplate
You should see a response similar to the following:

{
"id" : 17,
"name" : "ClusterTemplateImport",
"startTime" : "2016-03-09T23:44:38.491Z",
"active" : true,
"children" : {
"items" : [ ]
}
Examples:

curl -X POST -H "Content-Type: application/json" -d @myTemplate.json http://admin:admin@myNewCluster-1.mydomain.com:7182/api/v12/cm/importClusterTemplate
curl -X POST -H "Content-Type: application/json" -d @myTemplate.json http://admin:admin@myNewCluster-1.mydomain.com:7182/api/v12/cm/importClusterTemplate?addRepositories=true
If there is no response, or you receive an error message, the JSON file may be malformed, or the template may have invalid hostnames or invalid references. Inspect the JSON file, correct any errors, and then re-run the command.
  1. 在Web浏览器中打开新群集的Cloudera Manager,然后单击Cloudera Manager徽标转到主页。
  2. 单击“ 所有最近的命令”选项卡。

    如果导入正在进行,您应该看到标记为“ 导入群集模板”的链接。单击链接以查看导入的进度。

    如果任何命令失败,请更正问题并单击“ 重试”。您可能需要在Cloudera Manager中编辑一些属性。

导入模板后,Cloudera Manager将应用自动配置规则,为各种角色设置内存和CPU分配等属性。如果新群集具有不同的硬件或操作要求,则可能需要修改这些值。

示例Python代码

您可以使用以Python或其他语言编写的客户端以编程方式执行导出和导入集群模板的步骤。(你也可以使用卷曲 上面提供的命令。)

Python导出示例:

resource = ApiResource(“myCluster-1.myDomain.com”,7180,“admin”,“admin”,version = 12)
cluster = resource.get_cluster(“Cluster1”);
template = cluster.export(False)
pprint(template)
Python导入示例:
resource = ApiResource(“localhost”,8180,“admin”,“admin”,version = 12)
 ,打开('〜/ cluster-template.json')作为data_file:
   data = json.load(data_file)
template = ApiClusterTemplate(资源).from_json_dict(data,resource)
cms = ClouderaManager(资源)
cms.import_cluster_template(模板)

1.5.6、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用Cloudera Manager模板创建CDH群集)的更多相关文章

  1. 2.2、CDH 搭建Hadoop在安装(安装Java Development Kit)

    第2步:安装Java Development Kit 要安装Oracle JDK,您可以使用Cloudera Manager安装Cloudera提供的版本,也可以直接安装Oracle的其他版本. 继续 ...

  2. 1.4、CDH 搭建Hadoop在安装之前(推荐的群集主机和角色分配)

    推荐的群集主机和角色分配 要点:本主题描述了Cloudera Manager管理的CDH群集的建议角色分配.您为部署选择的实际分配可能会有所不同,具体取决于工作负载的类型和数量,群集中部署的服务,硬件 ...

  3. 2.5、CDH 搭建Hadoop在安装(设置Cloudera Manager数据库)

    步骤5:设置Cloudera Manager数据库 Cloudera Manager Server包含一个可以为自己创建和配置数据库的脚本.该脚本可以: 创建Cloudera Manager Serv ...

  4. 2.6、CDH 搭建Hadoop在安装(安装CDH和其他软件)

    第6步:安装CDH和其他软件 设置Cloudera Manager数据库后,启动Cloudera Manager Server,然后登录Cloudera Manager Admin Console: ...

  5. 2、CDH 搭建Hadoop在安装(安装Cloudera Manager,CDH和托管服务)

    安装Cloudera Manager,CDH和托管服务 建议使用此过程为生产环境安装Cloudera Manager和CDH.对于非生产“易于安装”,请参阅安装概念证明群集. 在开始安装之前,请确保已 ...

  6. 1.5.3、CDH 搭建Hadoop在安装之前(定制安装解决方案---创建群集主机的虚拟映像)

    创建群集主机的虚拟映像 您可以使用预先部署的Cloudera软件创建虚拟机映像,例如PXE启动映像,Amazon AMI和Azure VM映像,这些映像可用于快速启动虚拟机.这些图像使用parcel来 ...

  7. 1、CDH 搭建Hadoop在安装之前(存储空间规划)

    Cloudera Manager的存储空间规划 最低要求角色: 完全管理员 Cloudera Manager跟踪许多后台进程中的服务,作业和应用程序的度量标准.所有这些指标都需要存储.根据组织的大小, ...

  8. 大数据 -- Cloudera Manager(简称CM)+CDH构建大数据平台

    一.Cloudera Manager介绍 Cloudera Manager(简称CM)是Cloudera公司开发的一款大数据集群安装部署利器,这款利器具有集群自动化安装.中心化管理.集群监控.报警等功 ...

  9. 使用Windows Azure的VM安装和配置CDH搭建Hadoop集群

    本文主要内容是使用Windows Azure的VIRTUAL MACHINES和NETWORKS服务安装CDH (Cloudera Distribution Including Apache Hado ...

随机推荐

  1. HTML中的GroupBox

    <fieldset> <legend>用户登录</legend> <div class="box_a"> <label for ...

  2. 【每日一学】pandas_透视表函数&交叉表函数

    每日一悟 [分开工作内外8小时] 前一个月,我经常把工作内的问题带到路上.地铁上.睡觉前,甚至是周末. 然而很快发现,我工作外的成就几乎没有,而工作内的进展也并不理想. 仔细想想,工作外是需要学新东西 ...

  3. uva-10714-贪心

    题意:有一条杆,长度为L,上面很几只蚂蚁,蚂蚁的朝向未知,爬速1cm/s,在爬行过程中,蚂蚁相撞了就往反方向爬,问,杆上没有蚂蚁至少要多久,至多要多久 解题思路: 蚂蚁1和蚂蚁2相撞,我们只要交换一下 ...

  4. java中的排序(自定义数据排序)--使用Collections的sort方法

    排序:将一组数据按相应的规则 排列 顺序 1.规则:       基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...

  5. ant 标签详解

    Ant 开发 Ant的构建文件当开始一个新的项目时,首先应该编写Ant构建文件.构建文件定义了构建过程,并被团队开发中每个人使用.Ant构建文件默认命名为build.xml,也可以取其他的名字.只不过 ...

  6. 监控msyql 连接数 及 各用户连接数

    #!/bin/bash while true do date +%Y%m%d-%H:%M:%S mysql -uroot -p'xxx' -e "select count(1) from i ...

  7. VMware vSphere 创建虚拟机步骤及三种磁盘规格

    https://blog.csdn.net/hanzheng260561728/article/details/80471899 http://www.mycitrix.cn/esxi-disk-mo ...

  8. nslookup和dig命令

    nslookup与dig两个工具功能类似,都可以查询制定域名所对应的ip地址,所不同的是dig工具可以从该域名的官方dns服务器上查询到精确的权威解答,而nslookup只会得到DNS解析服务器保存在 ...

  9. MFC 如何在一个类中使用在其他类中定义的变量或函数

    [声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...

  10. JS 原型链 prototypt 和隐式原型 _proto_

    prototype(原型) :  对象的一个属性,此属性使您有能力向对象添加属性和方法,当访问对象不存在属性是会自动到 prototype 中找 _proto_(隐式原型): 此对象构造函数(类)的原 ...