使用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. android 开发 碎片Fragment布局例子(用按键切换碎片布局)

    实现思路: 1.写一个父类布局,里面写一个按键和一个帧布局(用于给Fragment布局后续替代) 2.写3个子布局,并且在写3个class继承Fragment布局 3.在MainActivity的cl ...

  2. PHP中json_encode()问题

    PHP 生成JSON的时候,必须将汉字不转义为 \u开头的UNICODE数据. 要想不转义,在后面加个参数即可 json_encode($data, JSON_UNESCAPED_UNICODE);  ...

  3. records.config中文详解

    转载:http://www.safecdn.cn/cdn/2018/12/records-config-zh/106.html records.config参数的一些备注 CONFIG proxy.c ...

  4. php单图片上传。

    1.input:file form 提交 /** * 用户头像上传 * @param [type] $file 图像信息 */ function domeadd($file){ if (is_arra ...

  5. Django之公版母版的设置

    1.模板导入 前提:多个页面有一个相同的页面板块(多个有样式标签的集合体) 如何运用:可以将多个样式标签的集合进行封装,对外提供板块的名字(接口),在有该板块的页面中直接导入即可 语法:{% incl ...

  6. SQL SERVER 查看mdf ldf文件路径

    SQL SERVER 查看mdf ldf文件路径 select filename from sysfiles

  7. 机器学习进阶-图像梯度计算-scharr算子与laplacian算子(拉普拉斯) 1.cv2.Scharr(使用scharr算子进行计算) 2.cv2.laplician(使用拉普拉斯算子进行计算)

    1. cv2.Scharr(src,ddepth, dx, dy), 使用Scharr算子进行计算 参数说明:src表示输入的图片,ddepth表示图片的深度,通常使用-1, 这里使用cv2.CV_6 ...

  8. 区分slice,splice和split方法

    1.slice(数组) 用法:array.slice(start,end) 解释:该方法是对数组进行部分截取,并返回一个数组副本:参数start是截取的开始数组索引,end参数等于你要取的最后一个字符 ...

  9. UI5-学习篇-3-Local SAP WEB IDE下载

    1.下载地址 https://tools.hana.ondemand.com/#sapui5 有两个版本,针对各自系统环境选择对应的个人版本下载后解压. 个人版:个人试用 生产版:在云平台SCP付费订 ...

  10. 130. Surrounded Regions 卧槽!我半梦半醒之间做出来的。

    打开这个题,做了一半躺下了. 结果,怎么都睡不着.一会一个想法,忍不住爬起来提交,要么错误,要么超时. 按照常规思路,依次对每个点检测是否是闭包,再替换,超时.计算量太大了. 还能怎么做呢?没思路,关 ...