华为云用户手册

  • 自动化脚本 在添加自动化脚本时,可以参考表4配置相应参数。 表4 自动化脚本配置说明 配置项 说明 名称 自动化脚本的名称。 只能由数字、英文字符、空格、中划线和下划线组成,且不能以空格开头。 可输入的字符串长度为1~64个字符。 说明: 同一集群内,不允许配置相同的名称。不同集群之间,可以配置相同的名称。 脚本路径 脚本的路径。路径可以是OBS文件系统的路径或虚拟机本地的路径。 OBS文件系统的路径,必须以obs://开头,以.sh结尾。例如:obs://mrs-samples/xxx.sh 虚拟机本地的路径,脚本所在的路径必须以‘/’开头,以.sh结尾。例如,安装Zepelin的示例脚本路径如下:/opt/bootstrap/zepelin/zepelin_install.sh 执行节点 选择自动化脚本所执行的节点类型。 说明: 如果选择Master节点,您可以通过开关选择是否只在Active Master节点执行此脚本。 如果选择开启此功能,表示只在Active Master节点上执行。如果选择关闭,表示在所有Master节点执行。默认关闭。 参数 自动化脚本参数,支持通过传入以下预定义变量获得弹性伸缩相关信息: ${mrs_scale_node_num} :弹性伸缩节点数量,总是正数 ${mrs_scale_type} :弹性伸缩类型,扩容为“scale_out”,缩容为“scale_in” ${mrs_scale_node_hostnames} :弹性伸缩节点的主机名,多个主机名之间以“,”隔开 ${mrs_scale_node_ips} :弹性伸缩节点的IP,多个IP之间以“,”隔开 ${mrs_scale_rule_name}:触发弹性伸缩的规则名,如果是资源计划则为“resource_plan” 执行时机 选择自动化脚本执行的时间。支持“扩容前”、“扩容后”、“缩容前”、“缩容后”四种类型。 说明: 假设执行节点类型中包含Task节点: 执行时机为扩容前的脚本不会在将要扩容出的Task节点上执行。 执行时机为扩容后的脚本会在扩容出的Task节点上执行。 执行时机为缩容前的脚本会在即将被删除的Task节点上执行。 执行时机为缩容后的脚本不会在已经被删除的Task节点上执行。 失败操作 该脚本执行失败后,是否继续执行后续脚本和扩缩容操作。 说明: 建议您在调试阶段设置为“继续”,无论此脚本是否执行成功,则集群都能继续扩缩容操作。 若脚本执行失败,请到集群虚拟机机的“/var/log/Bootstrap”路径下查看失败日志。 由于缩容成功不可回滚,缩容后执行的脚本失败操作只能选择“继续”。 自动化脚本只在弹性伸缩时触发,手动调整集群节点时不会运行。
  • 资源池维度策略 在添加规则时,可以参考表2配置相应的指标。 MRS 3.1.5及其之后的版本支持配置资源池维度策略。 表2 规则配置项说明 集群类型 指标名称 数值类型 说明 分析集群/自定义集群 ResourcePoolMemoryAvailable 整型 资源池YARN组件可用内存大小。单位为MB。 取值范围为[0~2147483646]。 ResourcePoolMemoryAvailablePercentage 百分比 资源池YARN组件可用内存百分比。是YARN组件可用内存大小与YARN组件总内存大小的比值。 取值范围为[0~100]。 ResourcePoolCPUAvailable 整型 资源池YARN组件可用的虚拟CPU核心数。 取值范围为[0~2147483646]。 ResourcePoolCPUAvailablePercentage 百分比 资源池YARN组件可用虚拟CPU核心数百分比。是可用虚拟CPU核心数与总虚拟CPU核心数比值。 取值范围为[0~100]。 在添加资源计划时,可以参考表3配置相应的参数。 表3 资源计划配置项说明 配置项 说明 生效日期 资源计划的生效日期。默认是每日生效,也可以选择周一至周日任意一天或几天生效。 时间范围 资源计划的起始时间和结束时间,精确到分钟,取值范围[00:00, 23:59]。例如资源计划开始于早上8:00,结束于10:00,则配置为8:00-10:00。结束时间必须晚于开始时间至少30分钟。 节点数量范围 资源计划内的节点数量上下限,取值范围[0,500],在资源计划时间内,集群Task节点数量小于最小节点数时,弹性伸缩会将集群Task节点一次性扩容到最小节点数。在资源计划时间内,集群Task节点数量大于最大节点数时,弹性伸缩会将集群Task节点一次性缩容到最大节点数。最小节点数必须小于或等于最大节点数。 当启用资源计划时,弹性伸缩配置中的“默认节点数量范围”将在资源计划外的时间段内强制生效。例如“默认节点数量范围”配置为1-2,配置资源计划:08:00-10:00之间节点数量范围为4-5,则在一天中的非资源计划时间段(0:00-8:00以及10:00-23:59)内,Task节点会被强制限制在1个到2个中间,若节点数量大于2则触发自动缩容,若节点数量小于1则触发自动扩容。 当不启用资源计划时,节点数量范围的“默认范围”会在全部时间范围生效,如果节点数量不在“节点数量范围”的默认范围,主动增减Task节点数量到默认范围内。 资源计划间时间段不可交叉,时间段交叉意为某个时间点存在两个生效的资源计划,例如配置资源计划1在08:00-10:00生效,资源计划2在09:00-11:00生效,则两个资源计划存在时间段交叉,交叉时间段09:00-10:00。 资源计划不能跨天配置,例如如果要配置23:00至次日01:00的资源计划,请配置时间段为23:00-00:00和00:00-01:00的两个资源计划。
  • 节点组维度策略 在添加规则时,可以参考表1配置相应的指标。 表1 弹性伸缩指标列表 集群类型 指标名称 数值类型 说明 流式集群 StormSlotAvailable 整型 Storm组件的可用slot数。 取值范围为[0~2147483646]。 StormSlotAvailablePercentage 百分比 Storm组件可用slot百分比。是可用slot数与总slot数的比值。 取值范围为[0~100]。 StormSlotUsed 整型 Storm组件的已用slot数。 取值范围为[0~2147483646]。 StormSlotUsedPercentage 百分比 Storm组件已用slot百分比。是已用slot数与总slot数的比值。 取值范围为[0~100]。 StormSupervisorMemAverageUsage 整型 Storm组件Supervisor的内存平均使用量。 取值范围为[0~2147483646]。 StormSupervisorMemAverageUsagePercentage 百分比 Storm组件Supervisor进程使用的内存占系统总内存的平均百分比。 取值范围[0 ~ 100]。 StormSupervisorCPUAverageUsagePercentage 百分比 Storm组件Supervisor进程使用的CPU占系统总CPU的平均百分比。 取值范围[0 ~ 6000]。 分析集群 YARNAppPending 整型 YARN组件挂起的任务数。 取值范围为[0~2147483646]。 YARNAppPendingRatio 比率 YARN组件挂起的任务数比例。是YARN挂起的任务数与YARN运行中的任务数比值。 取值范围为[0~2147483646]。 YARNAppRunning 整型 YARN组件运行中的任务数。 取值范围为[0~2147483646]。 YARNContainerAllocated 整型 YARN组件中已分配的container个数。 取值范围为[0~2147483646]。 YARNContainerPending 整型 YARN组件挂起的container个数。 取值范围为[0~2147483646]。 YARNContainerPendingRatio 比率 YARN组件挂起的container比率。是挂起的container数与运行中的container数的比值。 取值范围为[0~2147483646]。 YARNCPUAllocated 整型 YARN组件已分配的虚拟CPU核心数。 取值范围为[0~2147483646]。 YARNCPUAvailable 整型 YARN组件可用的虚拟CPU核心数。 取值范围为[0~2147483646]。 YARNCPUAvailablePercentage 百分比 YARN组件可用虚拟CPU核心数百分比。是可用虚拟CPU核心数与总虚拟CPU核心数比值。 取值范围为[0~100]。 YARNCPUPending 整型 YARN组件挂起的虚拟CPU核心数。 取值范围为[0~2147483646]。 YARNMemoryAllocated 整型 YARN组件已分配内存大小。单位为MB。 取值范围为[0~2147483646]。 YARNMemoryAvailable 整型 YARN组件可用内存大小。单位为MB。 取值范围为[0~2147483646]。 YARNMemoryAvailablePercentage 百分比 YARN组件可用内存百分比。是YARN组件可用内存大小与YARN组件总内存大小的比值。 取值范围为[0~100]。 YARNMemoryPending 整型 YARN组件挂起的内存大小。 取值范围为[0~2147483646]。 表1中指标数值类型为百分比或比率时,有效数值可精确到百分位。其中百分比类型指标数值为去除百分号(%)后的小数值,如16.80即代表16.80%。 混合集群的支持分析集群和流式集群的所有指标。
  • 操作步骤 在集群详情页,单击“组件管理”。 图2 组件管理 单击服务列表中指定的服务名称。 单击“服务配置”。 将页面右侧“基础配置”切换为“全部配置”。 图3 全部配置 在左侧导航栏选择“自定义”,MRS将显示当前组件的自定义参数。 “参数文件”显示保存用户新添加的自定义参数的配置文件。每个配置文件中可能支持相同名称的开源参数,设置不同参数值后生效结果由组件加载配置文件的顺序决定。自定义参数支持服务级别与角色级别,请根据业务实际需要选择。不支持单个角色实例添加自定义参数。 根据配置文件与参数作用,在对应参数项所在行“参数”列输入组件支持的参数名,在“值”列输入此参数的参数值。 支持单击和增加或删除一条自定义参数。第一次单击添加自定义参数后才支持删除操作。 修改某个参数的值后需要取消修改,可以单击恢复。 单击“保存配置”,根据界面提示保存配置。
  • 修改角色实例参数 在集群详情页,单击“组件管理”。 图2 组件管理 单击服务列表中指定的服务名称。 单击“实例”页签。 单击角色实例列表中指定的角色实例名称。 单击“实例配置”页签。 将页面右侧“基础配置”切换为“全部配置”,界面上将显示该角色实例的全部配置参数导航树。 在导航树选择指定的参数,修改参数值。支持在“搜索”输入参数名直接搜索并显示结果。 修改某个参数的值后需要取消修改,可以单击恢复。 单击“保存配置”,根据界面提示保存配置。
  • 基于Guardian服务的OBS权限配置说明 基于Guardian服务的存算分离场景下,对于开启了Ranger鉴权的MRS集群,Ranger管理员可以通过Ranger为集群用户配置OBS目录或文件的读、写权限。 同时,基于Guardian权限模型存算分离,依赖Hive级联授权功能,实现用户基于Ranger对业务表授权,自动细粒度关联OBS对应存储目录的权限,无需二次授权,即用户只需在Ranger页面上对业务表进行一次授权,系统就会自动细粒度关联数据存储源的权限,不需要感知表的存储路径,无需进行二次授权。 Ranger页面OBS授权对象只能针对Manager中自定义的用户组,内置用户组不支持,用户组仅由数字0~9、字母a~Z、下划线或#组成,且最大长度为52个字符,否则将导致策略添加失败。 启用Kerberos认证的集群需要基于Ranger赋权,未启用Kerberos认证的集群默认拥有OBS权限,无需额外配置。 如果当前集群未启用Kerberos认证,访问OBS的用户,需要属于supergroup组。
  • 基于Guardian服务的存算分离配置流程 创建MRS集群。 MRS集群内需包含Guardian、Ranger、Hadoop等基础组件。 目前仅MRS 3.3.0-LTS及之后的版本支持基于Guardian组件对接OBS。 创建OBS委托。 用户需要创建1个具有OBS访问权限的委托,用于Guardian组件对接OBS时使用。 开启Guardian组件对接OBS开关并配置组件。 修改Guardian服务相关配置参数,配置 IAM 委托认证信息。 配置组件数据回收站目录的清理策略。 在存算分离场景下,对接OBS的组件默认开启了数据防误删功能,用户删除数据时,被删除对象会移动至用户对应的回收站目录内,用户需要在OBS文件系统中为对应的目录配置生命周期策略,以避免存储空间被占满的风险。 组件对接OBS。 在具备OBS资源的访问权限后,MRS集群内组件可直接访问对应路径。用户可以通过组件客户端以绝对路径方式直接访问OBS文件系统下的资源。
  • 操作步骤 登录 FusionInsight Manager,单击“租户资源”。 在左侧租户列表,选择待删除的租户,单击。 根据业务需求,需要保留租户已有的数据时请同时勾选“保留该租户资源的数据。”,否则将自动删除租户对应的存储空间。 如果确认删除,在弹出的“删除租户”窗口中输入“DELETE ”,单击“确定”,删除租户。 保存配置需要等待一段时间,租户成功删除。租户对应的角色、存储空间将删除。 租户删除后,Yarn中对应的租户任务队列不会被删除。同时Yarn角色管理中,此租户任务队列不再显示。
  • 操作步骤 登录FusionInsight Manager,单击“租户资源”。 在左侧租户列表,选择待删除的租户,单击。 根据业务需求,需要保留租户已有的数据时请同时勾选“保留该租户的数据。”,否则将自动删除租户对应的存储空间。 如果使用不属于supergroup组的用户执行删除租户操作,并且不保留租户数据,需要使用属于supergroup组的用户登录HDFS客户端,手动清理租户对应的存储空间,以免数据残留。 如果确认删除,在弹出的“删除租户”窗口中输入“DELETE ”,单击“确定”,删除租户。 保存配置需要等待一段时间,租户成功删除。租户对应的角色、存储空间将删除。 租户删除后,Yarn中对应的租户任务队列不会被删除。同时Yarn角色管理中,此租户任务队列不再显示。
  • Flink访问OBS 在MRS客户端的Flink配置文件“客户端安装路径/Flink/flink/conf/flink-conf.yaml”中,增加如下内容。 fs.obs.access.key: ak fs.obs.secret.key: sk fs.obs.endpoint: OBS Endpoint 在文件中设置AK/SK会明文暴露在配置文件中,请谨慎使用。 添加配置后无需手动添加AK/SK、endpoint就可以直接访问OBS上的数据。
  • 复制表 若某复制表只存在于集群的部分实例节点上,则无法对该复制表所在的实例节点进行退服。需要在集群中不存在此复制表的所有实例节点上手工创建此复制表。 比如,当前集群2个分片,分片1下面有两个节点A和B,分片2下面有两个节点C和D。创建复制表test的时候没有携带ON CLUSTER关键字,只在节点A和B上创建了该表。 当前如果要退服分片1下面的A和B节点时,则不允许退服,需要在分片2的C和D节点上同时创建复制表test后才能正常退服。 使用如下命令收集各节点数据表: select database,name,engine,create_table_query from system.tables where database != 'system'; 根据结果: 查看engine列,包含Replicated字段的表即为复制表。 对于未退服节点上不存在的复制表,根据create_table_query列的建表语句结果进行创建。
  • Detached数据 若待退服节点上的表进行过detach操作,在detached目录下还存在数据,则无法进行退服。需要先进行attach操作将detached目录下数据处理后再执行退服操作。 执行如下命令查看退服节点的system.detached_parts系统表: select * from system.detached_parts; 如果存在detached part数据,在确认这些partition都没有用的情况下,执行如下命令将part数据删除: ALTER TABLE {table_name} DROP DETACHED PARTITION {partition_expr} SETTINGS allow_drop_detached = 1; 执行完成后,再次查看是否system.detached_parts系统表中的数据已不存在,执行如下命令: select * from system.detached_parts; 如果查询结果为空,则表示当前已不存在detached part。
  • 视图 退服不支持视图自动迁移,且视图不存储数据。可以使用如下命令收集各节点数据表,查看engine列,engine是View引擎即为视图: select database,name,engine from system.tables where database != 'system'; 再执行如下命令将视图逐个删除: drop view {database_name}.{table_name};
  • 第三方引擎的表 退服目前不支持第三方引擎的表自动迁移。 使用如下命令收集各节点数据表,查看engine列,除包含MergeTree、View、MaterializedView、Distributed、Log字段外的其他数据表即为第三方引擎的表,如Memory、HDFS、MySQL等: select database,name,engine from system.tables where database != 'system'; 对于以上第三方引擎表,建议在非退服节点上重建该表,并在退服节点删除该表。
  • 本地非复制表 若某本地非复制表只存在于待退服实例节点上,则无法进行退服。需要在非退服任意一个节点上创建同名的本地非复制表。 比如,当前集群2个分片,分片1下面有两个节点A和B,分片2下面有两个节点C和D。创建非复制表test的时候没有携带ON CLUSTER关键字,只在节点A上创建了该表。 当前如果要退服分片1下面的A和B节点时,则不允许退服,需要在分片2的C或者D一个节点上创建表test后才能正常退服。 使用如下命令收集各节点数据表: select database,name,engine,create_table_query from system.tables where database != 'system'; 根据结果: 查看engine列,不含Replicated字段的表是本地非复制表。 对于未退服节点上不存在的本地非复制表,根据create_table_query列的建表语句进行创建,建表语句样例如下: CREATE TABLE {database}.{table} (‘column name’ type…) ENGINE = MergeTree;
  • 分布式表 退服不支持分布式表自动迁移,建议退服前在非退服节点上重建分布式表。 使用如下命令收集各节点数据表,查看engine列,engine是Distributed引擎即为分布式表: select database,name,engine from system.tables where database != 'system'; 退服前,在非退服节点不重建分布式表本身不影响退服操作,只是可能影响后续业务操作。
  • 集群规模 集群只有1个shard分片,无法进行退服。 同一个shard分片下的多个节点副本必须一起退服或入服。 查询集群分片信息操作: 以客户端安装用户,登录安装客户端的节点,执行命令: cd {客户端安装目录} source bigdata_env 安全模式: kinit ClickHouse组件业务用户 clickhouse client --host ClickHouse的实例IP --port 9440--secure 普通模式: clickhouse client --host ClickHouse的实例IP --user 用户名 --password --port 9000 输入用户密码 执行如下命令查询集群分片信息: select cluster,shard_num,replica_num,host_name from system.clusters;
  • 集群存储空间 集群退服操作前,集群非退服节点磁盘空间需要满足存储所有退服节点的数据,并且各非退服节点的存储空间在退服后还能有大约10%的空间冗余,保证退服后剩余实例正常运行。具体操作步骤如下: 执行此命令收集各节点磁盘空间存储情况: select * from system.disks; free_space列表示磁盘空闲空间,total_space列表示磁盘总空间,total_space-free_space大小即为磁盘已使用空间,获取的值均以字节为单位。 在退服节点执行上述命令,计算total_space-free_space磁盘已使用空间,得到退服节点数据量大小。 在非退服节点执行上述命令,计算(free_space可用空间大小-退服节点数据量)/total_space总存储空间大小,如果结果大于10%,即可正常退服。
  • 数据库 若某数据库只存在于待退服实例节点上,则无法进行退服。需要在集群所有ClickHouseServer实例节点上创建该数据库。具体操作步骤如下: 执行此命令收集各节点数据库列表:select * from system.databases; name列为数据库名,engine列为数据库引擎,默认为Atomic。若为默认引擎,建表时可不指定引擎。 对于只存在于待退服实例节点的数据库,执行此命令创建数据库: create database xxx engine=xxx on cluster xxx;
  • 代码样例 Token认证机制支持API,用户可在二次开发样例的Producer()和Consumer()中对其进行配置。 Producer()配置的样例代码如下: public static Properties initProperties() { Properties props = new Properties(); KafkaProperties kafkaProc = KafkaProperties.getInstance(); // Broker地址列表 props.put(BOOTSTRAP_SERVER, kafkaProc.getValues(BOOTSTRAP_SERVER, "localhost:21007")); // 客户端ID props.put(CLIENT_ID, kafkaProc.getValues(CLIENT_ID, "DemoProducer")); // Key序列化类 props.put(KEY_SERIALIZER, kafkaProc.getValues(KEY_SERIALIZER, "org.apache.kafka.common.serialization.StringSerializer")); // Value序列化类 props.put(VALUE_SERIALIZER, kafkaProc.getValues(VALUE_SERIALIZER, "org.apache.kafka.common.serialization.StringSerializer")); // 协议类型:当前支持配置为SASL_PLAINTEXT或者PLAINTEXT props.put(SECURITY_PROTOCOL, kafkaProc.getValues(SECURITY_PROTOCOL, "SASL_PLAINTEXT")); // 服务名 props.put(SASL_KERBEROS_SERVICE_NAME, "kafka"); // 域名 props.put(KERBEROS_DOMAIN_NAME, kafkaProc.getValues(KERBEROS_DOMAIN_NAME, "hadoop.hadoop.com")); // 分区类名 props.put(PARTITIONER_NAME, kafkaProc.getValues(PARTITIONER_NAME, "com.huawei.bigdata.kafka.example.SimplePartitioner")); // 生成Token配置 StringBuilder token = new StringBuilder(); String LINE_SEPARATOR = System.getProperty("line.separator"); token.append("org.apache.kafka.common.security.scram.ScramLoginModule required").append(LINE_SEPARATOR); /** * 用户自己生成的Token的TOKENID */ token.append("username=\"PPVz2cxuQC-okwJVZnFKFg\"").append(LINE_SEPARATOR); /** * 用户自己生成的Token的HMAC */ token.append("password=\"pL5nHsIUODg5u0dRM+o62cOIf/j6yATSt6uaPBYfIb29dj/jbpiAnRGSWDJ6tL4KXo89dot0axcRIDsMagyN4g==\"").append(LINE_SEPARATOR); token.append("tokenauth=true;"); // 用户使用的SASL机制,配置为SC RAM -SHA-512 props.put("sasl.mechanism", "SCRAM-SHA-512"); props.put("sasl.jaas.config", token.toString()); return props; } Consumer()配置的样例代码如下: public static Properties initProperties() { Properties props = new Properties(); KafkaProperties kafkaProc = KafkaProperties.getInstance(); // Broker连接地址 props.put(BOOTSTRAP_SERVER, kafkaProc.getValues(BOOTSTRAP_SERVER, "localhost:21007")); // Group id props.put(GROUP_ID, kafkaProc.getValues(GROUP_ID, "DemoConsumer")); // 是否自动提交offset props.put(ENABLE_AUTO_COMMIT, kafkaProc.getValues(ENABLE_AUTO_COMMIT, "true")); // 自动提交offset的时间间隔 props.put(AUTO_COMMIT_INTERVAL_MS, kafkaProc.getValues(AUTO_COMMIT_INTERVAL_MS,"1000")); // 会话超时时间 props.put(SESSION_TIMEOUT_MS, kafkaProc.getValues(SESSION_TIMEOUT_MS, "30000")); // 消息Key值使用的反序列化类 props.put(KEY_DESERIALIZER, kafkaProc.getValues(KEY_DESERIALIZER, "org.apache.kafka.common.serialization.StringDeserializer")); // 消息内容使用的反序列化类 props.put(VALUE_DESERIALIZER, kafkaProc.getValues(VALUE_DESERIALIZER, "org.apache.kafka.common.serialization.StringDeserializer")); // 安全协议类型 props.put(SECURITY_PROTOCOL, kafkaProc.getValues(SECURITY_PROTOCOL, "SASL_PLAINTEXT")); // 服务名 props.put(SASL_KERBEROS_SERVICE_NAME, "kafka"); // 域名 props.put(KERBEROS_DOMAIN_NAME, kafkaProc.getValues(KERBEROS_DOMAIN_NAME, "hadoop.hadoop.com")); // 生成Token配置 StringBuilder token = new StringBuilder(); String LINE_SEPARATOR = System.getProperty("line.separator"); token.append("org.apache.kafka.common.security.scram.ScramLoginModule required").append(LINE_SEPARATOR); /** * 用户自己生成的Token的TOKENID */ token.append("username=\"PPVz2cxuQC-okwJVZnFKFg\"").append(LINE_SEPARATOR); /** * 用户自己生成的Token的HMAC */ token.append("password=\"pL5nHsIUODg5u0dRM+o62cOIf/j6yATSt6uaPBYfIb29dj/jbpiAnRGSWDJ6tL4KXo89dot0axcRIDsMagyN4g==\"").append(LINE_SEPARATOR); token.append("tokenauth=true;"); // 用户使用的SASL机制,配置为SCRAM-SHA-512 props.put("sasl.mechanism", "SCRAM-SHA-512"); props.put("sasl.jaas.config", token.toString()); return props; }
  • 安全认证代码 目前样例代码统一调用LoginUtil类进行安全认证。 在HDFS样例工程代码中,不同的样例工程,使用的认证代码不同,包括基本安全认证和带ZooKeeper认证。 基本安全认证: com.huawei.bigdata.hdfs.examples包的HdfsExample类样例程序不需要访问HBase或ZooKeeper,所以使用基本的安全认证代码即可。示例代码如下: ... private static final String PATH_TO_HDFS_SITE_XML = HdfsExample.class.getClassLoader().getResource("hdfs-site.xml").getPath(); private static final String PATH_TO_CORE_SITE_XML = HdfsExample.class.getClassLoader().getResource("core-site.xml").getPath(); private static final String PRNCIPAL_NAME = "hdfsDeveloper"; private static final String PATH_TO_KEYTAB = HdfsExample.class.getClassLoader().getResource("user.keytab").getPath(); private static final String PATH_TO_KRB5_CONF = HdfsExample.class.getClassLoader().getResource("krb5.conf").getPath(); private static Configuration conf = null; //private static String PATH_TO_SMALL_SITE_XML = HdfsExample.class.getClassLoader().getResource("smallfs-site.xml").getPath(); ... private static void confLoad() throws IOException { System.setProperty("java.security.krb5.conf", PATH_TO_KRB5_CONF); conf = new Configuration(); // conf file conf.addResource(new Path(PATH_TO_HDFS_SITE_XML)); conf.addResource(new Path(PATH_TO_CORE_SITE_XML)); // conf.addResource(new Path(PATH_TO_SMALL_SITE_XML)); } ... private static void authentication() throws IOException { // security mode if ("kerberos".equalsIgnoreCase(conf.get("hadoop.security.authentication"))) { System.setProperty("java.security.krb5.conf", PATH_TO_KRB5_CONF); LoginUtil.login(PRNCIPAL_NAME, PATH_TO_KEYTAB, PATH_TO_KRB5_CONF, conf); } } 带ZooKeeper认证: com.huawei.bigdata.hdfs.examples包的“ColocationExample”类样例程序不仅需要基础安全认证,还需要添加ZooKeeper服务端Principal才能完成安全认证。示例代码如下: ... private static final String ZOOKEEPER_SERVER_PRINCIPAL_KEY = "zookeeper.server.principal"; private static final String PRINCIPAL = "username.client.kerberos.principal"; private static final String KEYTAB = "username.client.keytab.file"; private static final String PRNCIPAL_NAME = "hdfsDeveloper"; private static final String LOG IN_CONTEXT_NAME = "Client"; private static final String PATH_TO_KEYTAB = System.getProperty("user.dir") + File.separator + "conf" + File.separator + "user.keytab"; private static final String PATH_TO_KRB5_CONF = ColocationExample.class.getClassLoader().getResource("krb5.conf") .getPath(); private static String zookeeperDefaultServerPrincipal = null; private static Configuration conf = new Configuration(); private static DFSColocationAdmin dfsAdmin; private static DFSColocationClient dfs; private static void init() throws IOException { LoginUtil.login(PRNCIPAL_NAME, PATH_TO_KEYTAB, PATH_TO_KRB5_CONF, conf); LoginUtil.setJaasConf(LOGIN_CONTEXT_NAME, PRNCIPAL_NAME, PATH_TO_KEYTAB); zookeeperDefaultServerPrincipal = "zookeeper/hadoop." + KerberosUtil.getKrb5DomainRealm().toLowerCase(); LoginUtil.setZookeeperServerPrincipal(ZOOKEEPER_SERVER_PRINCIPAL_KEY, zookeeperDefaultServerPrincipal); } ...
  • 场景说明 访问安全集群环境中的服务,需要先通过Kerberos安全认证。所以HDFS应用程序中需要写入安全认证代码,确保HDFS程序能够正常运行。 安全认证有两种方式: 命令行认证: 提交HDFS应用程序运行前,在HDFS客户端执行如下命令进行认证。 kinit 组件业务用户 该方式仅适用于Linux操作系统,且安装了HDFS的客户端。 代码认证: 通过获取客户端的principal和keytab文件进行认证。 注意修改代码中的PRINCIPAL_NAME变量为实际使用的值。 private static final String PRNCIPAL_NAME = "hdfsDeveloper";
  • 前提条件 配置用户的集群信息和登录账号信息: 配置文件:“样例工程文件夹\conf\UserInfo.properties”。 参数说明: userName:登录Manager系统的用户名。 password:userName对应的用户密码。密码明文存储存在安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 webUrl:Manager首页地址。 填写“UserInfo.properties”文件中的参数,注意填写的准确性,可以仿照以下参数示例进行填写,其中,“IP_Address”填写FusionInsight Manager对应的浮动IP地址。 如果需要使用其他用户进行操作,请先登录FusionInsight Manager创建用户。 userName= admin password= adminPassWord webUrl= https://IP_Address:28443/web/
  • 代码样例 以下代码片段是调用firstAccess接口完成登录认证的示例,在rest.UserManager类的main方法中。 BasicAuthAccess authAccess = new BasicAuthAccess(); HttpClient httpClient = authAccess.loginAndAccess(webUrl, userName, password, userTLSVersion); LOG.info("Start to access REST API."); HttpManager httpManager = new HttpManager(); String operationName = ""; String operationUrl = ""; String jsonFilePath = "";
  • 场景说明 在安全集群环境下,各个组件之间的相互通信不能够简单的互通,而需要在通信之前进行相互认证,以确保通信的安全性。 用户在提交MapReduce应用程序时,需要与Yarn、HDFS等之间进行通信。那么提交MapReduce的应用程序中需要写入安全认证代码,确保MapReduce程序能够正常运行。 安全认证有两种方式: 命令行认证: 提交MapReduce应用程序运行前,在MapReduce客户端执行如下命令获得认证。 kinit 组件业务用户 代码认证: 通过获取客户端的principal和keytab文件在应用程序中进行认证。
  • Hive操作权限 在进行应用程序开发之前,使用的用户的基本权限要求是属于Hive组,额外操作权限需从系统管理员处获取,具体权限要求请参见表2。用户运行样例程序,需要在default数据库中有CREATE权限。 表2 操作权限要求 操作类型/作用对象 操作 权限要求 DATABASE CREATE DATABASE dbname [LOCATION "hdfs_path"] 如果指定了HDFS路径hdfs_path,需要是路径hdfs_path的所有者和具有RWX权限。 DROP DATABASE dbname 拥有数据库dbname的所有权。 ALTER DATABASE dbname SET OWNER user_or_role 具有admin权限。 TABLE CREATE TABLE table_a 拥有数据库的CREATE权限。 CREATE TABLE table_a AS SELECT table_b 拥有数据库的CREATE权限,对表table_b拥有SELECT权限。 CREATE TABLE table_a LIKE table_b 拥有数据库的CREATE权限。 CREATE [EXTERNAL] TABLE table_a LOCATION "hdfs_path" 拥有数据库的CREATE权限,是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。 DROP TABLE table_a 是表table_a的所有者。 ALTER TABLE table_a SET LOCATION "hdfs_path" 是表table_a的所有者,是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。 ALTER TABLE table_a SET FILEFORMAT 是表table_a的所有者。 TRUNCATE TABLE table_a 是表table_a的所有者。 ANALYZE TABLE table_a COMPUTE STATIS TICS 对表table_a拥有SELECT和INSERT权限。 SHOW TBLPROPERTIES table_a 对表table_a拥有SELECT权限。 SHOW CREATE TABLE table_a 对表table_a拥有SELECT且带有WITH GRANT OPTION的权限。 Alter ALTER TABLE table_a ADD COLUMN 是表table_a的所有者。 ALTER TABLE table_a REPLACE COLUMN 是表table_a的所有者。 ALTER TABLE table_a RENAME 是表table_a的所有者。 ALTER TABLE table_a SET SERDE 是表table_a的所有者。 ALTER TABLE table_a CLUSTER BY 是表table_a的所有者。 PARTITION ALTER TABLE table_a ADD PARTITION partition_spec LOCATION "hdfs_path" 对表table_a拥有INSERT权限,是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。 ALTER TABLE table_a DROP PARTITION partition_spec 对表table_a拥有DELETE权限。 ALTER TABLE table_a PARTITION partition_spec SET LOCATION "hdfs_path" 是表table_a的所有者,是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。 ALTER TABLE table_a PARTITION partition_spec SET FILEFORMAT 是表table_a的所有者。 LOAD LOAD INPATH 'hdfs_path' INTO TABLE table_a 对表table_a拥有INSERT权限,是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。 INSERT INSERT TABLE table_a SELECT FROM table_b 对表table_a拥有INSERT权限,对表table_b拥有SELECT权限。拥有Yarn的default队列的Submit权限。 SELECT SELECT * FROM table_a 对表table_a拥有SELECT权限。 SELECT FROM table_a JOIN table_b 对表table_a、表table_b拥有SELECT权限,拥有Yarn的default队列的Submit权限。 SELECT FROM (SELECT FROM table_a UNION ALL SELECT FROM table_b) 对表table_a、表table_b拥有SELECT权限。拥有Yarn的default队列的Submit权限。 EXPLAIN EXPLAIN [EXTENDED|DEPENDENCY] query 对相关表目录具有RX权限。 VIEW CREATE VIEW view_name AS SELECT ... 对相关表拥有SELECT且带有WITH GRANT OPTION的权限。 ALTER VIEW view_name RENAME TO new_view_name 是视图view_name的所有者。 DROP VIEW view_name 是视图view_name的所有者。 FUNCTION CREATE [TEMPORARY] FUNCTION function_name AS 'class_name' 具有admin权限。 DROP [TEMPORARY] function_name 具有admin权限。 MACRO CREATE TEMPORARY MACRO macro_name ... 具有admin权限。 DROP TEMPORARY MACRO macro_name 具有admin权限。 以上所有的操作只要拥有Hive的admin权限以及对应的HDFS目录权限就能做相应的操作。 如果当前组件使用了Ranger进行权限控制,需基于Ranger配置相关策略进行权限管理。
  • 通过HSBroker实现用户名密码认证 本章节适用于MRS 3.3.0及以后版本。 通过HSBroker连接方式实现,使用用户名和密码连接到HetuEngine,组装对应的SQL发送到HetuEngine执行。 import jaydebeapi driver = "io.XXX.jdbc.XXXDriver" # need to change the value based on the cluster information url = "jdbc:XXX://192.168.43.223:29860,192.168.43.244:29860/hive/default?serviceDiscoveryMode=hsbroker" user = "YourUserName" # 认证用的密码硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以密码保存在环境变量中来实现身份验证为例,运行本示例前,请先在本地环境中设置环境变量HETUENGINE_PASSWORD password = os.getenv('HETUENGINE_PASSWORD') tenant = "YourTenant" jdbc_location = "Your file path of the jdbc jar" sql = "show tables" if __name__ == '__main__': conn = jaydebeapi.connect(driver, url, {"user": user, "password": password, "tenant": tenant}, [jdbc_location]) curs = conn.cursor() curs.execute(sql) result = curs.fetchall() print(result) curs.close() conn.close() 上述代码中各参数说明如下表所示: 表1 参数及参数说明 参数名称 参数说明 url jdbc:XXX://HSBroker1_IP:HSBroker1_Port,HSBroker2_IP:HSBroker2_Port,HSBroker3_IP:HSBroker3_Port/catalog/schema?serviceDiscoveryMode=hsbroker 说明: XXX:驱动名,请以实际样例代码中的内容为准。 catalog、schema分别是JDBC客户端要连接的catalog和schema名称。 HSBroker_IP:HSBroker_Port是HSBroker的URL,多个URL以逗号隔开。例如:“192.168.81.37:2181,192.168.195.232:2181,192.168.169.84:2181” user 访问HetuEngine的用户名,即在集群中创建的“人机”用户的用户名。 password 在集群中创建的“人机”用户的用户密码。 tenant 指定访问HetuEngine计算实例的租户资源队列。 jdbc_location 配置Python3样例工程中获取的hetu-jdbc-XXX.jar包的完整路径。 Windows系统路径示例:"D:\\hetu-examples-python3\\hetu-jdbc-XXX.jar" Linux系统路径示例:"/opt/hetu-examples-python3/hetu-jdbc-XXX.jar" 父主题: Python3样例代码
  • 通过HSBroker方式访问Hive数据源 本章节适用于MRS 3.3.0及以后版本。 通过HSBroker方式连接到HetuEngine,组装对应的SQL发送到HetuEngine执行,完成对Hive数据源的增删改查操作。 import jaydebeapi driver = "io.XXX.jdbc.XXXDriver" # need to change the value based on the cluster information url = "jdbc:XXX://192.168.37.61:29861,192.168.37.62:29861/hive/default?serviceDiscoveryMode=hsbroker" user = "YourUserName" tenant = "YourTenant" jdbc_location = "Your file path of the jdbc jar" sql = "show catalogs" if __name__ == '__main__': conn = jaydebeapi.connect(driver, url, {"user": user, "SSL": "false", "tenant": tenant}, [jdbc_location]) curs = conn.cursor() curs.execute(sql) result = curs.fetchall() print(result) curs.close() conn.close() 上述代码中各参数说明如下表所示: 表1 参数及参数说明 参数名称 参数说明 url jdbc:XXX://HSBroker1_IP:HSBroker1_Port,HSBroker2_IP:HSBroker2_Port,HSBroker3_IP:HSBroker3_Port/catalog/schema?serviceDiscoveryMode=hsbroker 说明: XXX:驱动名,请以实际样例代码中的内容为准。 catalog、schema分别是JDBC客户端要连接的catalog和schema名称。 HSBroker_IP:HSBroker_Port是HSBroker的URL,多个URL以逗号隔开。例如:“192.168.81.37:2181,192.168.195.232:2181,192.168.169.84:2181” user 访问HetuServer的用户名,即在集群中创建的“人机”用户的用户名。 tenant 指定访问HetuEngine计算实例的租户资源队列。 jdbc_location 配置Python3样例工程中获取的hetu-jdbc-XXX.jar包的完整路径。 Windows系统路径示例:"D:\\hetu-examples-python3\\hetu-jdbc-XXX.jar" Linux系统路径示例:"/opt/hetu-examples-python3/hetu-jdbc-XXX.jar" 父主题: Python3样例代码
  • 告警参数 参数名称 参数含义 OID MIB节点号。 APM AC AP的MAC地址。 RadioID 射频索引。 APName AP的名称。 PER 无线侧误包率。 RetransmissionRate 射频当前的重传率。 APID AP ID。 NoiseFloor 检测到当前环境中的底噪值。 Reason 告警产生的原因。 ConflictRate:重传率高。 在该情况下,仅需关注RetransmissionRate参数。取值为0的其他参数无需关注。 Noise:底噪高。 在该情况下,仅需关注NoiseFloor参数。取值为0的其他参数无需关注。 BadChannel:信道恶化。 在该情况下,仅需关注BadChannel参数。取值为0的其他参数无需关注。 InterferenceRate:干扰率高。 在该情况下,仅需关注InterferenceRate参数。取值为0的其他参数无需关注。 BadChannel 恶化信道。 InterferenceRate 干扰率。
  • 告警解释 WLAN/4/RADIO_ENV_DETERIORATE:OID [oid] Radio signal environment deteriorates. (APMAC=[OPAQUE], RadioID=[INTEGER], APName=[OCTET], PER=[INTEGER]%, RetransmissionRate=[INTEGER]%, APID=[INTEGER], NoiseFloor=[INTEGER]dBm, Reason=[OCTET], BadChannel=[INTEGER], InterferenceRate=[INTEGER]). 射频信号环境恶化。
共100000条