华为云用户手册

  • 前提条件 数据源与HetuEngine集群节点网络互通。 集群已启用Kerberos认证(安全模式)创建HetuEngine管理员用户,集群未启用Kerberos认证(普通模式)创建HetuEngine业务用户,并为其赋予HDFS管理员权限,即创建用户时需同时加入“hadoop”和“hadoopmanager”用户组,创建用户可参考创建HetuEngine用户。 已创建HetuEngine计算实例,可参考创建HetuEngine计算实例。 已获取MySQL数据库所在的IP地址,端口号,用户名及密码。
  • 使用方法 在HBase客户端执行以下命令可检查数据一致性,如果不一致,将重新构建索引数据。一致性检查结果会保存到“{数据表所在的NameSpace}:GSI_INCONSISTENCY_TABLE”表中。 hbase org.apache.hadoop.hbase.hindex.global.tools.GlobalHIndexConsistencyTool -dt table1 -n idx3 -src BOTH -r 相关参数介绍如下: -dt,--data-table:要进行一致性检查的数据表名称。 -n,--index-name:要进行一致性检查的索引名称。 -src,--source:检查模式选择,默认为“BOTH”,支持以下模式: INDEX_TABLE_SOURCE:索引表作为源表。 DATA_TABLE_SOURCE:数据表作为源表。 BOTH:索引表和数据表均作为源表。 -r,--repair:索引数据修复选项,添加此参数,表示检查后进行修复。 -sc,--scan-caching(可选) :一致性检查/修复的MapReduce任务中scan caching大小。
  • 基于标签的数据块摆放策略样例 假如有一套集群,有六个DataNode:dn-1,dn-2,dn-3,dn-4,dn-5以及dn-6,对应的IP为10.1.120.[1-6]。有六个目录需要配置标签表达式,Block默认备份数为3。 下面给出3种DataNode标签信息在“host2labels”文件中的表示方式,其作用是一样的。 主机名正则表达式 /dn-[1456]/ = label-1,label-2 /dn-[26]/ = label-1,label-3 /dn-[3456]/ = label-1,label-4 /dn-5/ = label-5 IP地址范围表示方式 10.1.120.[1-6] = label-1 10.1.120.1 = label-2 10.1.120.2 = label-3 10.1.120.[3-6] = label-4 10.1.120.[4-6] = label-2 10.1.120.5 = label-5 10.1.120.6 = label-3 普通的主机名表达式 /dn-1/ = label-1, label-2 /dn-2/ = label-1, label-3 /dn-3/ = label-1, label-4 /dn-4/ = label-1, label-2, label-4 /dn-5/ = label-1, label-2, label-4, label-5 /dn-6/ = label-1, label-2, label-3, label-4 目录的标签表达式设置结果如下: /dir1 = label-1 /dir2 = label-1 && label-3 /dir3 = label-2 || label-4[replica=2] /dir4 = (label-2 || label-3) && label-4 /dir5 = !label-1 /sdir2.txt = label-1 && label-3[replica=3,fallback=NONE] /dir6 = label-4[replica=2],label-2 标签表达式设置方式请参考hdfs nodelabel -setLabelExpression命令。 文件的数据块存放结果如下: “/dir1”目录下文件的数据块可存放在dn-1,dn-2,dn-3,dn-4,dn-5和dn-6六个节点中的任意一个。 “/dir2”目录下文件的数据块可存放在dn-2和dn-6节点上。Block默认备份数为3,表达式只匹配了两个DataNode节点,第三个副本会在集群上剩余的节点中选择一个DataNode节点存放。 “/dir3”目录下文件的数据块可存放在dn-1,dn-3,dn-4,dn-5和dn-6中的任意三个节点上。 “/dir4”目录下文件的数据块可存放在dn-4,dn-5和dn-6。 “/dir5”目录下文件的数据块没有匹配到任何一个DataNode,会从整个集群中任意选择三个节点存放(和默认选块策略行为一致)。 “/sdir2.txt”文件的数据块,两个副本存放在dn-2和dn-6节点上,虽然还缺失一个备份节点,但由于使用了fallback=NONE参数,所以只存放两个备份。 “/dir6”目录下文件的数据块在具备label-4的节点中选择2个节点(dn-3 -- dn-6),然后在label-2中选择一个节点,如果用户指定“/dir6”下文件副本数大于3,则多出来的副本均在label-2。
  • 配置描述 Datanode节点标签配置 请参考修改集群服务配置参数,进入HDFS的“全部配置”页面,在搜索框中输入参数名称。 表1 参数说明 参数 描述 默认值 dfs.block.replicator.classname 配置HDFS的DataNode原则策略。 如果需要开启NodeLabeNodel功能,需要将该值设置为org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyWithNodeLabel。 org.apache.hadoop.hdfs.server.blockmanagement.AvailableSpaceBlockPlacementPolicy host2tags 配置DataNode主机与标签的对应关系。 主机名称支持配置IP扩展表达式(如192.168.1.[1-128]或者192.168.[2-3].[1-128],且IP必须为业务IP),或者为前后加上 / 的主机名的正则表达式(如/datanode-[123]/或者/datanode-\d{2}/)。标签配置名称不允许包含 = / \ 字符。【注意】配置IP时必须是业务IP。 - host2tags配置项内容详细说明: 假如有一套集群,有20个Datanode:dn-1到dn-20,对应的IP地址为10.1.120.1到10.1.120.20,host2tags配置文件内容可以使用如下的表示方式。 主机名正则表达式 “/dn-\d/ = label-1”表示dn-1到dn-9对应的标签为label-1,即dn-1 = label-1,dn-2 = label-1,...dn-9 = label-1。 “/dn-((1[0-9]$)|(20$))/ = label-2”表示dn-10到dn-20对应的标签为label-2,即dn-10 = label-2,dn-11 = label-2,...dn-20 = label-2。 IP地址范围表示方式 “10.1.120.[1-9] = label-1”表示10.1.120.1到10.1.120.9对应的标签为label-1,即10.1.120.1 = label-1,10.1.120.2 = label-1,...10.1.120.9 = label-1。 “10.1.120.[10-20] = label-2”表示10.1.120.10到10.1.120.20对应的标签为label-2,即10.1.120.10 = label-2,10.1.120.11 = label-2,...10.1.120.20 = label-2。 基于标签的数据块摆放策略支持扩容减容场景: 当集群中新增加DataNode节点时,如果该DataNode对应的IP匹配host2tags配置项中的IP地址范围,或者该DataNode的主机名匹配host2tags配置项中的主机名正则表达式,则该DataNode节点会被设置成对应的标签。 例如“host2tags”配置值为10.1.120.[1-9] = label-1,而当前集群只有10.1.120.1到10.1.120.3三个数据节点。进行扩容后,又添加了10.1.120.4这个数据节点,则该数据节点会被设置成label-1的标签;如果10.1.120.3这个数据节点被删除或者退出服务后,数据块不会再被分配到该节点上。 设置目录/文件的标签表达式 在HDFS参数配置页面配置“path2expression”,配置HDFS目录与标签的对应关系。当配置的HDFS目录不存在时,也可以配置成功,新建不存在的同名目录,已设置的标签对应关系将在30分钟之内被继承。设置了标签的目录被删除后,新增一个同名目录,原有的对应关系也将在30分钟之内被继承。 命令行设置方式请参考hdfs nodelabel -setLabelExpression命令。 Java API设置方式通过NodeLabelFileSystem实例化对象调用setLabelExpression(String src, String labelExpression)方法。src为HDFS上的目录或文件路径,“labelExpression”为标签表达式。 开启NodeLabel特性后,可以通过命令hdfs nodelabel -listNodeLabels查看每个Datanode的标签信息。
  • 块副本位置选择 Nodelabel支持对各个副本的摆放采用不同的策略,如表达式“label-1,label-2,label-3”,表示3个副本分别放到含有label-1、label-2、label-3的DataNode中,不同的副本策略用逗号分隔。 如果label-1,希望放2个副本,可以这样设置表达式:“label-1[replica=2],label-2,label-3”。这种情况下,如果默认副本数是3,则会选择2个带有label-1和一个label-2的节点;如果默认副本数是4,会选择2个带有label-1、一个label-2以及一个label-3的节点。可以注意到,副本数是从左到右依次满足各个副本策略的,但也有副本数超过表达式表述的情况,当默认副本数为5时,多出来的一个副本会放到最后一个节点中,也就是label-3的节点里。 当启用ACLs功能并且用户无权访问表达式中使用的标签时,将不会为副本选择属于该标签的DataNode。
  • 多余块副本删除选择 如果块副本数超过参数“dfs.replication”值(即用户指定的文件副本数),hdfs会删除多余块副本来保证集群资源利用率。 删除规则如下: 优先删除不满足任何表达式的副本。 示例:文件默认副本数为3 /test标签表达式为“LA[replica=1],LB[replica=1],LC[replica=1]”, /test文件副本分布的四个节点(D1~D4)以及对应标签(LA~LD): D1:LA D2:LB D3:LC D4:LD 则选择删除D4节点上的副本块。 如果所有副本都满足表达式,删除多于表达式指定的数量的副本。 示例:文件默认副本数为3 /test标签表达式为“LA[replica=1],LB[replica=1],LC[replica=1]”, /test文件副本分布的四个节点以及对应标签: D1:LA D2:LA D3:LB D4:LC 则选择删除D1或者D2上的副本块。 如果文件所有者或文件所有者的组不能访问某个标签,则优先删除映射到该标签的DataNode中的副本。
  • 配置场景 用户需要通过数据特征灵活配置HDFS文件数据块的存储节点。通过设置HDFS目录/文件对应一个标签表达式,同时设置每个DataNode对应一个或多个标签,从而给文件的数据块存储指定了特定范围的DataNode。 当使用基于标签的数据块摆放策略,为指定的文件选择DataNode节点进行存放时,会根据文件的标签表达式选择出DataNode节点范围,然后在这些DataNode节点范围内,选择出合适的存放节点。 开启单集群跨AZ高可用后,不支持配置HDFS NodeLabel功能。 场景1 DataNodes分区场景。 场景说明: 用户需要让不同的应用数据运行在不同的节点,分开管理,就可以通过标签表达式,来实现不同业务的分离,指定业务存放到对应的节点上。 通过配置NodeLabel特性使得: /HBase下的数据存储在DN1、DN2、DN3、DN4节点上。 /Spark下的数据存储在DN5、DN6、DN7、DN8节点上。 图1 DataNode分区场景 通过hdfs nodelabel -setLabelExpression -expression 'LabelA[fallback=NONE]' -path /Hbase命令,给Hbase目录设置表达式。从图1中可知,“/Hbase”文件的数据块副本会被放置在有LabelA标签的节点上,即DN1、DN2、DN3、DN4。同理,通过hdfs nodelabel -setLabelExpression -expression 'LabelB[fallback=NONE]' -path /Spark命令,给Spark目录设置表达式。在“/Spark”目录下文件对应的数据块副本只能放置到LabelB标签上的节点,如DN5、DN6、DN7、DN8。 设置数据节点的标签参考配置描述。 如果同一个集群上存在多个机架,每个标签下需要有多个机架的datanodes,以确保数据块摆放的可靠性。 场景2 多机架下指定副本位置场景 场景说明: 在异构集群中,客户需要分配一些特定的具有高可靠性的节点用以存放重要的商业数据,可以通过标签表达式指定副本位置,指定文件数据块的其中一个副本存放到高可靠性的节点上。 “/data”目录下的数据块,默认三副本情况下,其中至少有一个副本会被存放到RACK1或RACK2机架的节点上(RACK1和RACK2机架的节点为高可靠性节点),另外两个副本会被分别存放到RACK3和RACK4机架的节点上。 图2 场景样例 通过 hdfs nodelabel -setLabelExpression -expression 'LabelA||LabelB[fallback=NONE],LabelC,LabelD' -path /data命令给“/data”目录设置表达式。 当向“/data”目录下写数据时,至少有一个数据块副本存放在LabelA或者LabelB标签的节点中,剩余的两个数据块副本会被存放在有LabelC和LabelD标签的节点上。
  • 示例 ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING); ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING) TBLPROPERTIES('COLUMNPROPERTIES.b1.shared_column'='sharedFolder.b1'); ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING) TBLPROPERTIES('DEFAULT.VALUE.a1'='10');
  • 参数描述 表1 ADD COLUMNS参数描述 参数 描述 db_name 数据库名。如果未指定,则选择当前数据库。 table_name 表名。 col_name data_type 带数据类型且用逗号分隔的列的名称。列名称包含字母,数字和下划线(_)。 说明: 创建CarbonData表时,不要将列名命名为tupleId,PositionId和PositionReference,因为将在UPDATE,DELETE和二级索引命令内部使用这些名称。
  • 命令语法 ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type,...) TBLPROPERTIES(''COLUMNPROPERTIES.columnName.shared_column'='sharedFolder.sharedColumnName,...', 'DEFAULT.VALUE.COLUMN_NAME'='default_value');
  • 使用介绍 表2 物化视图使用介绍 阶段 说明 参考章节 物化视图SQL示例 介绍物化视图支持的操作,包括创建物化视图、列举物化视图、查询物化视图等 物化视图SQL示例 配置物化视图改写能力 开启物化视图能力,提高查询的响应效率 配置物化视图改写能力 配置物化视图推荐能力 自动学习并推荐对业务最有价值的物化视图SQL,使在线查询效率获得倍数提升,同时有效降低系统负载压力 配置物化视图推荐能力 配置物化视图缓存能力 可将多次执行并改写后的SQL保存到缓存中,再次执行这条SQL时会直接从缓存中获取改写后的SQL,而不是重新对SQL进行改写,提高查询效率 配置物化视图缓存能力 配置物化视图有效期与数据刷新 设置物化视图的有效期,当前系统只会使用有效期内的物化视图进行自动改写 设置数据定期更新,可定时手动刷新或自动刷新物化视图 配置物化视图的有效期与数据刷新能力 配置智能物化视图 提供自动化物化视图的创建,无需手动执行SQL创建物化视图(推荐使用) 配置智能物化视图能力 查看物化视图自动化任务记录 看任务执行情况,帮助评估集群运行健康状况 查看物化视图自动化任务
  • 背景介绍 HetuEngine具备物化视图能力。在实际运用中,将高频访问的SQL查询和有高耗时的算子(连接, 聚合等算子)的SQL通过建立物化视图进行预计算,然后在查询的SQL中将能匹配到物化视图的查询或者子查询转换为物化视图,避免了数据的重复计算,这种情况下往往能较大地提高查询的响应效率。 物化视图通常基于对数据表进行聚合和连接的查询结果创建。 物化视图支持“查询重写”,这是一种优化技术,即将基于原始表编写的查询语句转换为查询一个或多个物化视图语句的等效请求。如下物化视图的SQL示例: create materialized view mv.default.mv1 with(storage_table='hive.default.mv1') AS select id from hive.mvschema.t1; 该物化视图实际数据的存储表为“hive.default.mv1”,在查询重写时,查询SQL“select id from hive.mvschema.t1”会被重写成查询物化视图的表,即“select id from hive.default.mv1”。
  • 权限介绍 物化视图权限如表1。物化视图权限控制依赖Ranger,如果关闭Ranger鉴权会带来权限失效的风险。 表1 HetuEngine物化视图权限介绍 操作 catalog mv权限 物化视图存储表的权限 原始物理表的权限 创建物化视图 建表权限 NA 对应列的查询权限 删除物化视图 删除表权限 NA NA 刷新物化视图 表的更新权限 NA 对应列的查询权限 使用物化视图重写查询语句 NA NA 对应列的查询权限 使用物化视图重写查询语句的执行计划(EXPLAIN) NA 对应列的查询权限 对应列的查询权限 查询物化视图 对应列的查询权限 NA NA 物化视图和非物化视图的物理表联合查询 对应列的查询权限 NA 对应列的查询权限 查看物化视图 NA NA NA 查看物化视图的创建语句 表的Show权限 表的Show权限 NA
  • 操作步骤 以客户端安装用户登录安装Oozie客户端的节点。 执行以下命令,获取安装环境信息。其中“/opt/client”为客户端安装路径,该操作的客户端目录只是举例,请根据实际安装目录修改。 source /opt/client/bigdata_env 判断集群认证模式。 安全模式,执行kinit命令进行用户认证。 例如,使用oozieuser用户进行认证。 kinit oozieuser 普通模式,执行4。 执行以下命令,进入样例目录。 cd /opt/client/Oozie/oozie-client-*/examples/apps/spark2x/ 该目录下需关注文件如表1所示。 表1 文件说明 文件名称 描述 job.properties 工作流的参数变量定义文件。 workflow.xml 工作流的规则定制文件。 lib 工作流运行依赖的jar包目录。 执行以下命令,编辑“job.properties”文件。 vi job.properties 修改如下内容: 更改“userName”的参数值为提交任务的人机用户名,例如“userName=oozieuser”。 执行oozie job命令,运行工作流文件。 oozie job -oozie https://oozie角色的主机名:21003/oozie/ -config job.properties -run 命令参数解释如下: -oozie 实际执行任务的Oozie服务器URL -config 工作流属性文件 -run 运行工作流 执行完工作流文件,显示“job id”表示提交成功,例如“job: 0000021-140222101051722-oozie-omm-W”。登录Oozie管理页面,查看运行情况。 使用oozieuser用户,登录Oozie WebUI页面:https://oozie角色的ip地址:21003/oozie 。 Oozie的WebUI界面中,可在页面表格根据“job id”查看已提交的工作流信息。
  • 前提条件 Spark2x和Oozie组件安装完成且运行正常,客户端安装成功。 如果当前客户端为旧版本,需要重新下载和安装客户端。 已创建或获取访问Oozie服务的人机用户账号及密码。 该用户需要从属于hadoop、supergroup、hive组,同时添加Oozie的角色操作权限。如果使用Hive多实例,该用户还需要从属于具体的Hive实例组,如hive3。 用户同时还需要至少有manager_viewer权限的角色。
  • 数据类型映射 目前Hive数据源支持的数据类型为:BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、REAL、DOUBLE、DECIMAL、NUMERIC、DEC、VARCHAR、VARCHAR(X)、CHAR、CHAR(X)、STRING、DATE、TIMESTAMP、TIME WITH TIMEZONE、TIMESTAMP WITH TIME ZONE、TIME、ARRAY、MAP、UNIOMTYPE、STRUCT、ROW。
  • 性能优化 元数据缓存 Hive连接器支持元数据缓存,以便更快地提供对各种操作的元数据请求。可参考调整元数据缓存。 动态过滤 开启动态过滤有助于Hive连接器的Join算子的计算优化。可参考调整动态过滤。 带分区条件查询 建立分区表并且查询带分区过滤条件有助于过滤部分分区数据,从而提高性能。 Insert优化 通过设置“task.writer-count”的值为“1”和增大“hive.max-partitions-per-writers”的值有助于提升Insert性能。可参考调整INSERT写入优化。
  • 操作场景 本章节指导用户在HSConsole界面添加Hive类型数据源。 HetuEngine目前支持对接传统数据格式数据源类型包括:avro、text、rctext、orc、parquet、sequencefile。 HetuEngine对接Hive数据源,不支持指定多分隔符建表,但对于在Hive数据源中指定MultiDelimitSerDe类作为序列化类来创建text数据格式的多分隔符表,可以通过HetuEngine查询,其他场景不支持。 HetuEngine对接的Hive数据源支持Hudi表重定向功能。适用于 MRS 3.3.0及以后版本。该功能支持在Hive connector访问Hudi表时重定向到Hudi connector,从而使用Hudi connector高级功能。使用该功能需提前配置目标Hudi数据源,并确保Hudi数据源与当前Hive数据源的Metastore URL一致,并在Hive数据源中配置“开启Hudi重定向”参数即可。
  • 前提条件 数据源所在集群域名与HetuEngine集群域名不能相同。 数据源所在集群与HetuEngine集群节点网络互通。 在HetuEngine所在集群的所有节点的“/etc/hosts”文件中,添加待对接数据源所在集群的主机名称和对应的IP映射,及其“/etc/hosts”文件中的“10.10.10.10 hadoop.系统域名”(如“10.10.10.10 hadoop.hadoop.com”),否则HetuEngine无法根据主机名称连接到非本集群节点。 已创建HetuEngine计算实例。
  • 问题 使用hbck工具检查Region状态,如果日志中存在“ERROR: (regions region1 and region2) There is an overlap in the region chain.”或者“ERROR: (region region1) Multiple regions have the same startkey: xxx”信息,表示某些region存在overlap的问题,需要如何解决?
  • 注意事项 表必须已经存在。 用户应属于数据加载组以执行数据加载操作。默认情况下,数据加载组被命名为“ficommon”。 CarbonData表不支持Overwrite。 源表和目标表的数据类型应该相同,否则原表中的数据将被视为Bad Records。 INSERT INTO命令不支持部分成功(partial success),如果存在Bad Records,该命令会失败。 在从源表插入数据到目标表的过程中,无法在源表中加载或更新数据。 如果要在INSERT操作期间启用数据加载或更新,请将以下参数配置为“true”。 “carbon.insert.persist.enable”=“true” 默认上述参数配置为“false”。 启用该参数将降低INSERT操作的性能。
  • 回答 在splitWAL的过程中,参数“hbase.splitlog.manager.timeout”控制splitWAL的超时时间,如果该时间内splitWAL无法完成,则会再次提交相同的任务,在一定时间内多次提交了相同的任务,当其中某次任务执行完毕时会删除这个temp文件,所以在后来的任务执行时无法找到这个文件,故出现FileNotFoudException。需做如下调整: 当前“hbase.splitlog.manager.timeout”的默认时间为“600000ms”,集群规格为每个regionserver上有2000~3000个region,在集群正常情况下(HBase无异常,HDFS无大量的读写操作等),建议此参数依据集群的规格进行调整,如果实际规格(实际平均每个regonserver上region的个数)大于默认规格(默认平均每个regionserver上region的个数,即2000),则调整方案为(实际规格 / 默认规格)* 默认时间。 在服务端的“hbase-site.xml”文件中配置splitlog参数,如表1所示。 表1 splitlog参数说明 参数 描述 默认值 hbase.splitlog.manager.timeout 分布式日志分裂管理程序接收worker回应的超时时间 600000
  • 问题 当集群重启后会进行split WAL操作,在splitWAL期间,HMaster出现不能close log,日志中频繁打印出FileNotFoundException及no lease信息。 2017-06-10 09:50:27,586 | ERROR | split-log-closeStream-2 | Couldn't close log at hdfs://hacluster/hbase/data/default/largeT1/2b48346d087275fe751fc049334fda93/recovered.edits/0000000000000000000.temp | org.apache.hadoop.hbase.wal.WALSplitter$LogRecoveredEditsOutputSink$2.call(WALSplitter.java:1330) java.io.FileNotFoundException: No lease on /hbase/data/default/largeT1/2b48346d087275fe751fc049334fda93/recovered.edits/0000000000000000000.temp (inode 1092653): File does not exist. [Lease. Holder: DFSClient_NONMAPREDUCE_1202985678_1, pendingcreates: 1936] ?at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:3432) ?at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.analyzeFileState(FSNamesystem.java:3223) ?at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getNewBlockTargets(FSNamesystem.java:3057) ?at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3011) ?at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:842) ?at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:526) ?at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) ?at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616) ?at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:973) ?at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2260) ?at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2256) ?at java.security.AccessController.doPrivileged(Native Method) ?at javax.security.auth.Subject.doAs(Subject.java:422) ?at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1769) ?at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2254) ?at sun.reflect.GeneratedConstructorAccessor40.newInstance(Unknown Source) ?at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ?at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ?at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:106) ?at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:73) ?at org.apache.hadoop.hdfs.DataStreamer.locateFollowingBlock(DataStreamer.java:1842) ?at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1639) ?at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:665)
  • 前提条件 已创建包含Doris服务的集群,集群内各服务运行正常。 待连接Doris数据库的节点与MRS集群网络互通。 已安装MySQL客户端,相关操作可参考安装MySQL客户端章节。 创建具有Doris管理权限的用户。 集群已启用Kerberos认证(安全模式) 在 FusionInsight Manager中创建一个人机用户,例如“dorisuser”,创建一个拥有“Doris管理员权限”的角色绑定给该用户。 使用新建的用户dorisuser重新登录FusionInsight Manager,修改该用户初始密码。 集群未启用Kerberos认证(普通模式) 使用admin用户连接Doris后,创建具有管理员权限的角色并绑定给用户。 已参考备份Doris数据完成备份需要恢复的Doris表或分区数据。
  • 数据恢复原理介绍 Doris数据恢复操作需指定一个远端仓库中已存在的备份数据,再将备份数据恢复到本地集群中。当提交Restore请求后,系统内部会做如下操作: 在本地创建对应的元数据 会在本地集群中创建恢复对应的表分区等结构。创建完成后,该表可见,但是不可访问。 本地snapshot 将在本地集群中创建的表做一个快照,是一个空快照(刚创建的表没有数据),用于在Backend上产生对应的快照目录,接收从远端仓库下载的快照文件。 下载快照 远端仓库中的快照文件,会被下载到对应的生成的快照目录中,由各个Backend并发完成。 生效快照 快照下载完成后,要将各个快照映射为当前本地表的元数据。然后重新加载这些快照,使之生效,完成最终的恢复作业。
  • 使用HetuEngine UDF 使用客户端访问: 进入HetuEngine客户端,请参考使用HetuEngine客户端。 执行如下命令创建HetuEngine UDF: CREATE FUNCTION example.namespace01.add_two ( num integer ) RETURNS integer LANGUAGE JAVA DETERMINISTIC SYMBOL "com.xxx.bigdata.hetuengine.functions.AddTwo" URI "hdfs://hacluster/udf/hetuserver/udf-test-0.0.1-SNAPSHOT.jar"; 执行如下命令使用HetuEngine UDF: select example.namespace01.add_two(2); _col0 ------- 4 (1 row) 函数实现类中通过重载方法来区分同名的不同函数,在创建HetuEngine UDF时要指定不同的函数名称。
  • 注意事项 Flume可靠性保障措施有哪些? Source&Channel、Channel&Sink之间的事务机制。 Sink Processor支持配置failover、load_blance机制,例如负载均衡示例如下。 server.sinkgroups=g1 server.sinkgroups.g1.sinks=k1 k2 server.sinkgroups.g1.processor.type=load_balance server.sinkgroups.g1.processor.backoff=true server.sinkgroups.g1.processor.selector=random Flume多agent聚合级联时的注意事项? 级联时需要使用Avro或者Thrift协议进行级联。 聚合端存在多个节点时,连接配置尽量配置均衡,不要聚合到单节点上。
  • 常用Sink配置 HDFS Sink HDFS Sink将数据写入Hadoop分布式文件系统(HDFS)。常用配置如下表所示: 表10 HDFS Sink常用配置 参数 默认值 描述 channel - 与之相连的channel。 type hdfs hdfs sink的类型,必须设置为hdfs。 hdfs.path - HDFS上数据存储路径,必须以“hdfs://hacluster/”开头。 monTime 0(不开启) 线程监控阈值,更新时间超过阈值后,重新启动该Sink,单位:秒。 hdfs.inUseSuffix .tmp 正在写入的hdfs文件后缀。 hdfs.rollInterval 30 按时间滚动文件,单位:秒,同时需将“hdfs.fileCloseByEndEvent”设置为“false”。 hdfs.rollSize 1024 按大小滚动文件,单位:bytes,同时需将“hdfs.fileCloseByEndEvent”设置为“false”。 hdfs.rollCount 10 按Event个数滚动文件,同时需将“hdfs.fileCloseByEndEvent”设置为“false”。 说明: 参数“rollInterval”、“rollSize”和“rollCount”可同时配置,三个参数采取优先原则,哪个参数值先满足,优先按照哪个参数进行压缩。 hdfs.idleTimeout 0 自动关闭空闲文件超时时间,单位:秒。 hdfs.batchSize 1000 批次写入HDFS的Event个数。 hdfs.kerberosPrincipal - 认证HDFS的Kerberos principal,普通模式集群不配置,安全模式集群必须配置。 hdfs.kerberosKeytab - 认证HDFS的Kerberos keytab,普通模式集群不配置,安全模式集群中,用户必须对jaas.cof文件中的keyTab路径有访问权限。 hdfs.fileCloseByEndEvent true 收到源文件的最后一个Event时是否关闭hdfs文件。 hdfs.batchCallTimeout - 批次写入HDFS超时控制时间,单位:毫秒。 当不配置此参数时,对每个Event写入HDFS进行超时控制。当“hdfs.batchSize”大于0时,配置此参数可以提升写入HDFS性能。 说明: “hdfs.batchCallTimeout”设置多长时间需要考虑“hdfs.batchSize”的大小,“hdfs.batchSize”越大,“hdfs.batchCallTimeout”也要调整更长时间,设置过短时间容易导致写HDFS失败。 serializer.appendNewline true 将一个Event写入HDFS后是否追加换行符('\n'),如果追加该换行符,该换行符所占用的数据量指标不会被HDFS Sink统计。 hdfs.filePrefix over_%{basename} 数据写入hdfs后文件名的前缀。 hdfs.fileSuffix - 数据写入hdfs后文件名的后缀。 hdfs.inUsePrefix - 正在写入的hdfs文件前缀。 hdfs.fileType DataStream hdfs文件格式,包括“SequenceFile”、“DataStream”以及“CompressedStream”。 说明: “SequenceFile”和“DataStream”不压缩输出文件,不能设置参数“codeC”,“CompressedStream”压缩输出文件,必须设置“codeC”参数值配合使用。 hdfs.codeC - 文件压缩格式,包括gzip、bzip2、lzo、lzop、snappy。 hdfs.maxOpenFiles 5000 最大允许打开的hdfs文件数,当打开的文件数达到该值时,最早打开的文件将会被关闭。 hdfs.writeFormat Writable 文件写入格式,“Writable”或者“Text”。 hdfs.callTimeout 10000 写入HDFS超时控制时间,单位:毫秒。 hdfs.threadsPoolSize - 每个HDFS sink用于HDFS io操作的线程数。 hdfs.rollTimerPoolSize - 每个HDFS sink用于调度定时文件滚动的线程数。 hdfs.round false 时间戳是否四舍五入。如果设置为true,则会影响所有基于时间的转义序列(%t除外)。 hdfs.roundUnit second 时间戳四舍五入单位,可选为“second”、“minute”或“hour”,分别对应为秒、分钟和小时。 hdfs.useLocalTimeStamp true 是否启用本地时间戳,建议设置为“true”。 hdfs.closeTries 0 hdfs sink尝试关闭重命名文件的最大次数。默认为0表示sink会一直尝试重命名,直至重命名成功。 hdfs.retryInterval 180 尝试关闭hdfs文件的时间间隔,单位:秒。 说明: 每个关闭请求都会有多个RPC往返Namenode,因此设置的太低可能导致Namenode超负荷。如果设置0,如果第一次尝试失败的话,该Sink将不会尝试关闭文件,并且把文件打开,或者用“.tmp”作为扩展名。 hdfs.failcount 10 数据写入hdfs失败的次数。该参数作为sink写入hdfs失败次数的阈值,当超过该阈值后上报数据传输异常告警。 Avro Sink Avro Sink把events转化为Avro events并发送到配置的主机的监测端口。常用配置如下表所示: 表11 Avro Sink常用配置 参数 默认值 描述 channel - 与之相连的channel。 type - avro sink的类型,必须设置为avro。 hostname - 绑定的主机名/IP。 port - 监测端口,该端口需未被占用。 batch-size 1000 批次发送的Event个数。 client.type DEFAULT 客户端实例类型,根据所配置的模型实际使用到的通信协议设置。该值可选值包括: DEFAULT,返回AvroRPC类型的客户端实例。 OTHER,返回NULL。 THRIFT,返回Thrift RPC类型的客户端实例。 DEFAULT_LOADBALANCING, 返回LoadBalancing RPC 客户端实例。 DEFAULT_FAILOVER, 返回Failover RPC 客户端实例。 ssl false 是否使用SSL加密。设置为true时还必须指定“密钥(keystore)”和“密钥存储密码(keystore-password)”。 truststore-type JKS Java信任库类型,“JKS”或“PK CS 12”。 说明: JKS的密钥库和私钥采用不同的密码进行保护,而PKCS12的密钥库和私钥采用相同密码进行保护。 truststore - Java信任库文件。 truststore-password - Java信任库密码。 keystore-type JKS ssl启用后密钥存储类型。 keystore - ssl启用后密钥存储文件路径,开启ssl后,该参数必填。 keystore-password - ssl启用后密钥存储密码,开启ssl后,该参数必填。 connect-timeout 20000 第一次连接的超时时间,单位:毫秒。 request-timeout 20000 第一次请求后一次请求的最大超时时间,单位:毫秒。 reset-connection-interval 0 一次断开连接后,等待多少时间后进行重新连接,单位:秒。默认为0表示不断尝试。 compression-type none 批数据压缩类型,“none”或“deflate”,“none”表示不压缩,“deflate”表示压缩。该值必须与AvroSource的compression-type匹配。 compression-level 6 批数据压缩级别(1-9),数值越高,压缩率越高。 exclude-protocols SSLv3 排除的协议列表,用空格分开。默认排除SSLv3协议。 HBase Sink HBase Sink将数据写入到HBase中。常用配置如下表所示: 表12 HBase Sink常用配置 参数 默认值 描述 channel - 与之相连的channel。 type - hbase sink的类型,必须设置为hbase。 table - HBase表名称。 columnFamily - HBase列族。 monTime 0(不开启) 线程监控阈值,更新时间超过阈值后,重新启动该Sink,单位:秒。 batchSize 1000 批次写入HBase的Event个数。 kerberosPrincipal - 认证HBase的Kerberos principal,普通模式集群不配置,安全模式集群必须配置。 kerberosKeytab - 认证HBase的Kerberos keytab,普通模式集群不配置,安全模式集群中,flume运行用户必须对jaas.cof文件中的keyTab路径有访问权限。 coalesceIncrements true 是否在同一个处理批次中,合并对同一个hbase cell多个操作。设置为true有利于提高性能。 Kafka Sink Kafka Sink将数据写入到Kafka中。常用配置如下表所示: 表13 Kafka Sink常用配置 参数 默认值 描述 channel - 与之相连的channel。 type - kafka sink的类型,必须设置为org.apache.flume.sink.kafka.KafkaSink。 kafka.bootstrap.servers - Kafka 的bootstrap 地址端口列表。如果集群安装有kafka并且配置已经同步,服务端可以不配置此项,默认值为Kafka集群中所有的broker列表,客户端必须配置该项,多个用逗号分隔。端口和安全协议的匹配规则必须为:21007匹配安全模式(SASL_PLAINTEXT),9092匹配普通模式(PLAINTEXT)。 monTime 0(不开启) 线程监控阈值,更新时间超过阈值后,重新启动该Sink,单位:秒。 kafka.producer.acks 1 必须收到多少个replicas的确认信息才认为写入成功。0表示不需要接收确认信息,1表示只等待leader的确认信息。-1表示等待所有的relicas的确认信息。设置为-1,在某些leader失败的场景中可以避免数据丢失。 kafka.topic - 数据写入的topic,必须填写。 allowTopicOverride false 是否将Event Header中保存的topic替换kafka.topic中配置的topic。 flumeBatchSize 1000 批次写入Kafka的Event个数。 kafka.security.protocol SASL_PLAINTEXT Kafka安全协议,普通模式集群下须配置为“PLAINTEXT”。端口和安全协议的匹配规则必须为:21007匹配安全模式(SASL_PLAINTEXT),9092匹配普通模式(PLAINTEXT)。 ignoreLongMessage false 是否丢弃超大消息的开关。 messageMaxLength 1000012 Flume写入Kafka的消息的最大长度。 defaultPartitionId - 用于指定channel中的events被传输到哪一个Kafka partition ID ,此值会被partitionIdHeader覆盖。默认情况下,如果此参数不设置,会由Kafka Producer's partitioner 进行events分发(可以通过指定key或者kafka.partitioner.class自定义的partitioner)。 partitionIdHeader - 设置时,对应的Sink 将从Event 的Header中获取使用此属性的值命名的字段的值,并将消息发送到主题的指定分区。 如果该值无对应的有效分区,则会发生EventDeliveryException。 如果Header 值已经存在,则此设置将覆盖参数defaultPartitionId。 Other Kafka Producer Properties - 其他Kafka配置,可以接受任意Kafka支持的生产配置,配置需要加前缀 .kafka。 Thrift Sink Thrift Sink把events转化为Thrift events并发送到配置的主机的监测端口。常用配置如下表所示: 表14 Thrift Sink常用配置 参数 默认值 描述 channel - 与之相连的channel。 type thrift thrift sink的类型,必须设置为thrift。 hostname - 绑定的主机名/IP。 port - 监测端口,该端口需未被占用。 batch-size 1000 批次发送的Event个数。 connect-timeout 20000 第一次连接的超时时间,单位:毫秒。 request-timeout 20000 第一次请求后一次请求的最大超时时间,单位:毫秒。 kerberos false 是否启用Kerberos认证。 client-keytab - 客户端使用的keytab文件地址,flume运行用户必须对认证文件具有访问权限。 client-principal - 客户端使用的安全用户的Principal。 server-principal - 服务端使用的安全用户的Principal。 compression-type none Flume发送数据的压缩类型,“none”或“deflate”,“none”表示不压缩,“deflate”表示压缩。 maxConnections 5 Flume发送数据时的最大连接池大小。 ssl false 是否使用SSL加密。 truststore-type JKS Java信任库类型。 truststore - Java信任库文件。 truststore-password - Java信任库密码。 reset-connection-interval 0 一次断开连接后,等待多少时间后进行重新连接,单位:秒。默认为0表示不断尝试。
  • 常用Channel配置 Memory Channel Memory Channel使用内存作为缓存区,Events存放在内存队列中。常用配置如下表所示: 表6 Memory Channel常用配置 参数 默认值 描述 type - memory channel的类型,必须设置为memory。 capacity 10000 缓存在channel中的最大Event数。 transactionCapacity 1000 每次存取的最大Event数。 说明: 此参数值需要大于source和sink的batchSize。 事务缓存容量必须小于或等于Channel缓存容量。 channelfullcount 10 channel full次数,达到该次数后发送告警。 keep-alive 3 当事务缓存或Channel缓存满时,Put、Take线程等待时间。单位:秒。 byteCapacity JVM最大内存的80% channel中最多能容纳所有event body的总字节数,默认是 JVM最大可用内存(-Xmx )的80%,单位:bytes。 byteCapacityBufferPercentage 20 channel中字节容量百分比(%)。 File Channel File Channel使用本地磁盘作为缓存区,Events存放在设置的dataDirs配置项文件夹中。常用配置如下表所示: 表7 File Channel常用配置 参数 默认值 描述 type - file channel的类型,必须设置为file。 checkpointDir ${BIGDATA_DATA_HOME}/hadoop/data1~N/flume/checkpoint 说明: 此路径随自定义数据路径变更。 检查点存放路径。 dataDirs ${BIGDATA_DATA_HOME}/hadoop/data1~N/flume/data 说明: 此路径随自定义数据路径变更。 数据缓存路径,设置多个路径可提升性能,中间用逗号分开。 maxFileSize 2146435071 单个缓存文件的最大值,单位:bytes。 minimumRequiredSpace 524288000 缓冲区空闲空间最小值,单位:bytes。 capacity 1000000 缓存在channel中的最大Event数。 transactionCapacity 10000 每次存取的最大Event数。 说明: 此参数值需要大于source和sink的batchSize。 事务缓存容量必须小于或等于Channel缓存容量。 channelfullcount 10 channel full次数,达到该次数后发送告警。 useDualCheckpoints false 是否备份检查点。设置为“true”时,必须设置backupCheckpointDir的参数值。 backupCheckpointDir - 备份检查点路径。 checkpointInterval 30000 检查点间隔时间,单位:秒。 keep-alive 3 当事务缓存或Channel缓存满时,Put、Take线程等待时间。单位:秒。 use-log-replay-v1 false 是否启用旧的回复逻辑。 use-fast-replay false 是否使用队列回复。 checkpointOnClose true channel关闭时是否创建检查点。 Memory File Channel Memory File Channel同时使用内存和本地磁盘作为缓存区,消息可持久化,性能优于File Channel,接近Memory Channel的性能。此Channel目前处于试验阶段,可靠性不够高,不建议在生产环境使用。常用配置如下表所示: 表8 Memory File Channel常用配置 参数 默认值 描述 type org.apache.flume.channel.MemoryFileChannel memory file channel的类型,必须设置为“org.apache.flume.channel.MemoryFileChannel”。 capacity 50000 Channel缓存容量:缓存在Channel中的最大Event数。 transactionCapacity 5000 事务缓存容量:一次事务能处理的最大Event数。 说明: 此参数值需要大于source和sink的batchSize。 事务缓存容量必须小于或等于Channel缓存容量。 subqueueByteCapacity 20971520 每个subqueue最多保存多少byte的Event,单位:byte。 Memory File Channel采用queue和subqueue两级缓存,event保存在subqueue,subqueue保存在queue。 subqueue能保存多少event,由“subqueueCapacity”和“subqueueInterval”两个参数决定,“subqueueCapacity”限制subqueue内的Event总容量,“subqueueInterval”限制subqueue保存Event的时长,只有subqueue达到“subqueueCapacity”或“subqueueInterval”上限时,subqueue内的Event才会发往目的地。 说明: “subqueueByteCapacity”必须大于一个batchsize内的Event总容量。 subqueueInterval 2000 每个subqueue最多保存一段多长时间的Event,单位:毫秒。 keep-alive 3 当事务缓存或Channel缓存满时,Put、Take线程等待时间。 单位:秒。 dataDir - 缓存本地文件存储目录。 byteCapacity JVM最大内存的80% Channel缓存容量。 单位:bytes。 compression-type None 消息压缩格式:“none”或“deflate”。“none”表示不压缩,“deflate”表示压缩。 channelfullcount 10 channel full次数,达到该次数后发送告警。 Memory File Channel配置样例: server.channels.c1.type = org.apache.flume.channel.MemoryFileChannel server.channels.c1.dataDir = /opt/flume/mfdata server.channels.c1.subqueueByteCapacity = 20971520 server.channels.c1.subqueueInterval=2000 server.channels.c1.capacity = 500000 server.channels.c1.transactionCapacity = 40000 Kafka Channel Kafka Channel使用Kafka集群缓存数据,Kafka提供高可用、多副本,以防Flume或Kafka Broker崩溃,Channel中的数据会立即被Sink消费。 表9 Kafka channel 常用配置 Parameter Default Value Description type - kafka channel的类型,必须设置为 “org.apache.flume.channel.kafka.KafkaChannel”。 kafka.bootstrap.servers - Kafka的bootstrap地址端口列表。 如果集群已安装Kafka并且配置已经同步,则服务端可以不配置此项,默认值为Kafka集群中所有的broker列表。客户端必须配置该项,多个值用逗号分隔。端口和安全协议的匹配规则必须为:21007匹配安全模式(SASL_PLAINTEXT),9092匹配普通模式(PLAINTEXT)。 kafka.topic flume-channel channel用来缓存数据的topic。 kafka.consumer.group.id flume 从kafka中获取数据的组标识,此参数不能为空。 parseAsFlumeEvent true 是否解析为Flume event。 migrateZookeeperOffsets true 当Kafka没有存储offset时,是否从ZooKeeper中查找,并提交到Kafka。 kafka.consumer.auto.offset.reset latest 当没有offset记录时从什么位置消费,可选为“earliest”、“latest”或“none”。“earliest”表示将offset重置为初始点,“latest”表示将offset置为最新位置点,“none”表示如果没有offset则发生异常。 kafka.producer.security.protocol SASL_PLAINTEXT Kafka生产安全协议。端口和安全协议的匹配规则必须为:21007匹配安全模式(SASL_PLAINTEXT),9092匹配普通模式(PLAINTEXT)。 说明: 如果该参数没有显示,请单击弹窗左下角的"+"显示全部参数。 kafka.consumer.security.protocol SASL_PLAINTEXT 同上,但用于消费。端口和安全协议的匹配规则必须为:21007匹配安全模式(SASL_PLAINTEXT),9092匹配普通模式(PLAINTEXT)。 pollTimeout 500 consumer调用poll()函数能接受的最大超时时间,单位:毫秒。 ignoreLongMessage false 是否丢弃超大消息。 messageMaxLength 1000012 Flume写入Kafka的消息的最大长度。
  • 使用示例 创建一个名为table1的普通表: CREATE TABLE example_db.table1 ( k1 TINYINT, k2 DECIMAL(10, 2) DEFAULT "10.5", k3 CHAR(10) COMMENT "string column", k4 INT NOT NULL DEFAULT "1" COMMENT "int column" ) COMMENT "table comment" DISTRIBUTED BY HASH(k1) BUCKETS 32; 创建一个名为table2的分区表。 使用event_day列作为分区列,建立3个分区:p201706、p201707、p201708,取值为: p201706:范围为 [最小值, 2017-07-01) p201707:范围为 [2017-07-01, 2017-08-01) p201708:范围为 [2017-08-01, 2017-09-01) 每个分区使用siteid进行哈希分桶,桶数为10。 创建表命令如下: CREATE TABLE table2 ( event_day DATE, siteid INT DEFAULT '10', citycode SMALLINT, username VARCHAR(32) DEFAULT '', pv BIGINT SUM DEFAULT '0' ) AGGREGATE KEY(event_day, siteid, citycode, username) PARTITION BY RANGE(event_day) ( PARTITION p201706 VALUES LESS THAN ('2017-07-01'), PARTITION p201707 VALUES LESS THAN ('2017-08-01'), PARTITION p201708 VALUES LESS THAN ('2017-09-01') ) DISTRIBUTED BY HASH(siteid) BUCKETS 10 PROPERTIES("replication_num" = "1"); 以上创建表设置replication_num建的都是单副本表,Doris建议采用默认的3副本设置,以保证高可用。 可以对Table增加上卷表(Rollup)以提高查询性能。 表的列的Null属性默认为true,会对查询性能有一定的影响。 Doris表必须指定分桶列。 查看表内容: SHOW TABLES; +----------------------+ | Tables_in_example_db | +----------------------+ | table1 | | table2 | +----------------------+ 2 rows in set (0.01 sec) DESC table1; +----------+-------------+------+-------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-------+---------+-------+ | siteid | int(11) | Yes | true | 10 | | | citycode | smallint(6) | Yes | true | N/A | | | username | varchar(32) | Yes | true | | | | pv | bigint(20) | Yes | false | 0 | SUM | +----------+-------------+------+-------+---------+-------+ 4 rows in set (0.00 sec) DESC table2; +-----------+-------------+------+-------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-------+---------+-------+ | event_day | date | Yes | true | N/A | | | siteid | int(11) | Yes | true | 10 | | | citycode | smallint(6) | Yes | true | N/A | | | username | varchar(32) | Yes | true | | | | pv | bigint(20) | Yes | false | 0 | SUM | +-----------+-------------+------+-------+---------+-------+ 5 rows in set (0.00 sec)
共100000条