华为云用户手册

  • 操作步骤 编译JDBC样例程序: 在IDEA界面左下方单击“Terminal”进入终端,执行命令mvn clean package进行编译。 当输出“BUILD SUCCESS”,表示编译成功,如下图所示。编译成功后将会在样例工程的target下生成含有“-with-dependencies”字段的jar包。 运行JDBC样例程序: 使用Windows命令行形式运行JDBC样例工程: 在Windows上创建一个目录作为运行目录,如“D:\jdbc_example”,将1中生成的“target”目录下包名中含有“-with-dependencies”字段的Jar包放到该路径下,并在该目录下创建子目录“src/main/resources",将配置并导入JDBC/HCatalog样例工程获取的“hive-jdbc-example\src\main\resources”目录下的所有文件拷贝到“resources”下。 执行以下命令运行Jar包: cd /d d:\jdbc_example java -jar hive-jdbc-example-1.0-SNAPSHOT-jar-with-dependencies.jar 以上Jar包名称仅供参考,具体名称以实际生成为主。 在命令行终端查看样例代码中的HQL所查询出的结果,运行成功结果会有如下信息: Create table success!_c00Delete table success! 使用IntelliJ IDEA形式运行JDBC样例工程: 在IntelliJ IDEA的jdbc-examples工程的“JDBCExample”类上单击右键,在弹出菜单中选择“Run JDBCExample.main()”,如下图所示: 在IntelliJ IDEA输出窗口查看样例代码中的HQL所查询出的结果,会有如下信息: Create table success!_c00Delete table success!
  • 配置安全登录 安全认证主要采用代码认证方式,支持Oracle JAVA平台和IBM JAVA平台。 以下代码在“hive-examples/hive-jdbc-example”样例工程的“com.huawei.bigdata.hive.example”包中,该包包括JDBCExample和JDBCExamplePreLogin类,实现的功能相同,只是认证方式有区别。JDBCExample使用JDBC连接中拼接keytab的方式进行认证;JDBCExamplePreLogin的JDBC连接中不包含认证信息,使用Hadoop通用接口UserGroupInformation认证。 根据实际情况,在JDBCExample或JDBCExamplePreLogin类中修改“USER_NAME”为实际用户名,例如“developuser”,样例代码如下: // 设置新建用户的USER_NAME,其中"xxx"为已创建的用于认证的用户名,例如创建的用户为developuser,则USER_NAME为developuserUSER_NAME = "xxx";if ("KERBEROS".equalsIgnoreCase(auth)) { // 设置客户端的keytab和zookeeper认证principal USER_KEYTAB_FILE = "src/main/resources/user.keytab"; ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL = "zookeeper/" + getUserRealm(); System.setProperty(ZOOKEEPER_SERVER_PRINCIPAL_KEY, ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL);}
  • Hive SQL Hive SQL支持Hive-3.1.0版本中的所有特性,详情请参见https://cwiki.apache.org/confluence/display/hive/languagemanual。 系统提供的扩展Hive语句如表1所示。 表1 扩展Hive语句 扩展语法 语法说明 语法示例 示例说明 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name (col_name data_type [COMMENT col_comment], ...) [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...) ] ...... [TBLPROPERTIES ("groupId"=" group1 ","locatorId"="locator1")] ...; 创建一个hive表,并指定表数据文件分布的locator信息。详细说明请参见使用HDFS Colocation存储Hive表。 CREATE TABLE tab1 (id INT, name STRING) row format delimited fields terminated by '\t' stored as RCFILE TBLPROPERTIES("groupId"=" group1 ","locatorId"="locator1"); 创建表tab1,并指定tab1的表数据分布在locator1节点上。 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name (col_name data_type [COMMENT col_comment], ...) [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...) ] ... [TBLPROPERTIES ('column.encode.columns'='col_name1,col_name2'| 'column.encode.indices'='col_id1,col_id2', 'column.encode.classname'='encode_classname')]...; 创建一个hive表,并指定表的加密列和加密算法。详细说明请参见使用Hive列加密功能。 create table encode_test(id INT, name STRING, phone STRING, address STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('column.encode.indices'='2,3', 'column.encode.classname'='org.apache.hadoop.hive.serde2.SMS4Rewriter') STORED AS TEXTFILE; 创建表encode_test,并指定插入数据时对第2、3列加密,加密算法类为org.apache.hadoop.hive.serde2.SMS4Rewriter。 REMOVE TABLE hbase_tablename [WHERE where_condition]; 删除hive on hbase表中符合条件的数据。详细说明请参见删除Hive on HBase表中的单行记录。 remove table hbase_table1 where id = 1; 删除表中符合条件“id =1”的数据。 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name (col_name data_type [COMMENT col_comment], ...) [ROW FORMAT row_format] STORED AS inputformat 'org.apache.hadoop.hive.contrib.fileformat.SpecifiedDelimiterInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 创建hive表,并设定表可以指定自定义行分隔符。详细说明请参见自定义行分隔符。 create table blu(time string, num string, msg string) row format delimited fields terminated by ',' stored as inputformat 'org.apache.hadoop.hive.contrib.fileformat.SpecifiedDelimiterInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 创建表blu,指定inputformat为SpecifiedDelimiterInputFormat,以便查询时可以指定表的查询行分隔符。 父主题: 对外接口
  • 回答 问题原因: 在IBM JDK下建立的Hive connection时间超过登录用户的认证超时时间(默认一天),导致认证失败。 IBM JDK的机制跟Oracle JDK的机制不同,IBM JDK在认证登录后的使用过程中做了时间检查却没有检测外部的时间更新,导致即使显式调用Hive relogin也无法得到刷新。 解决措施: 通常情况下,在发现Hive connection不可用的时候,可以关闭该connection,重新创建一个connection继续执行。
  • 开发思路 数据准备。 创建三张表,雇员信息表“employees_info”、雇员联络信息表“employees_contact”、雇员信息扩展表“employees_info_extended”。 雇员信息表“employees_info”的字段为雇员编号、姓名、支付薪水币种、薪水金额、缴税税种、工作地、入职时间,其中支付薪水币种“R”代表人民币,“D”代表美元。 雇员联络信息表“employees_contact”的字段为雇员编号、电话号码、e-mail。 雇员信息扩展表“employees_info_extended”的字段为雇员编号、姓名、电话号码、e-mail、支付薪水币种、薪水金额、缴税税种、工作地,分区字段为入职时间。 创建表代码实现请见创建表。 加载雇员信息数据到雇员信息表“employees_info”中。 加载数据代码实现请见数据加载。 雇员信息数据如表1所示: 表1 雇员信息数据 编号 姓名 支付薪水币种 薪水金额 缴税税种 工作地 入职时间 1 Wang R 8000.01 personal income tax&0.05 Country1:City1 2014 3 Tom D 12000.02 personal income tax&0.09 Country2:City2 2014 4 Jack D 24000.03 personal income tax&0.09 Country3:City3 2014 6 Linda D 36000.04 personal income tax&0.09 Country4:City4 2014 8 Zhang R 9000.05 personal income tax&0.05 Country5:City5 2014 加载雇员联络信息数据到雇员联络信息表“employees_contact”中。 雇员联络信息数据如表2所示: 表2 雇员联络信息数据 编号 电话号码 e-mail 1 135 XXXX XXXX xxxx@xx.com 3 159 XXXX XXXX xxxxx@xx.com.cn 4 186 XXXX XXXX xxxx@xx.org 6 189 XXXX XXXX xxxx@xxx.cn 8 134 XXXX XXXX xxxx@xxxx.cn 加载雇员扩展信息数据到雇员联络信息表“employees_info_extended”中。 雇员扩展信息数据如表3所示: 表3 雇员扩展信息数据 编号 姓名 电话号码 e-mail 支付薪水币种 薪水金额 缴税税种 工作地 入职时间 1 Wang 135 XXXX XXXX xxxx@xx.com R 8000.01 personal income tax&0.05 Country1:City1 2014 3 Tom 159 XXXX XXXX xxxxx@xx.com.cn D 12000.02 personal income tax&0.09 Country2:City2 2014 4 Jack 186 XXXX XXXX xxxx@xx.org D 24000.03 personal income tax&0.09 Country3:City3 2014 6 Linda 189 XXXX XXXX xxxx@xxx.cn D 36000.04 personal income tax&0.09 Country4:City4 2014 8 Zhang 134 XXXX XXXX xxxx@xxxx.cn R 9000.05 personal income tax&0.05 Country5:City5 2014 数据分析。 数据分析代码实现,请见数据查询。 查看薪水支付币种为美元的雇员联系方式。 查询入职时间为2014年的雇员编号、姓名等字段,并将查询结果加载进表employees_info_extended中的入职时间为2014的分区中。 统计表employees_info中有多少条记录。 查询使用以“cn”结尾的邮箱的员工信息。 提交数据分析任务,统计表employees_info中有多少条记录。实现请参见使用JDBC接口提交数据分析任务。
  • 功能介绍 本小节介绍了如何使用HQL创建内部表、外部表的基本操作。创建表主要有以下三种方式: 自定义表结构,以关键字EXTERNAL区分创建内部表和外部表。 内部表,如果对数据的处理都由Hive完成,则应该使用内部表。在删除内部表时,元数据和数据一起被删除。 外部表,如果数据要被多种工具(如Pig等)共同处理,则应该使用外部表,可避免对该数据的误操作。删除外部表时,只删除掉元数据。 根据已有表创建新表,使用CREATE LIKE句式,完全复制原有的表结构,包括表的存储格式。 根据查询结果创建新表,使用CREATE AS SELECT句式。 这种方式比较灵活,可以在复制原表表结构的同时指定要复制哪些字段,不包括表的存储格式。 在启用了安全服务的集群中执行如下操作,需要在数据库中CREATE权限,使用CREATE AS SELECT句式创建表,需要对SELECT查询的表具有SELECT权限。详情请参见概述。 目前表名长度最长为128,字段名长度最长为128,字段注解长度最长为4000,WITH SERDEPROPERTIES 中key长度最长为256,value长度最长为4000。以上的长度均表示字节长度。
  • 样例代码 -- 查看薪水支付币种为美元的雇员联系方式. SELECT a.name, b.tel_phone, b.email FROM employees_info a JOIN employees_contact b ON(a.id = b.id) WHERE usd_flag='D'; -- 查询入职时间为2014年的雇员编号、姓名等字段,并将查询结果加载进表employees_info_extended中的入职时间为2014的分区中. INSERT OVERWRITE TABLE employees_info_extended PARTITION (entrytime = '2014') SELECT a.id, a.name, a.usd_flag, a.salary, a.deductions, a.address, b.tel_phone, b.email FROM employees_info a JOIN employees_contact b ON (a.id = b.id) WHERE a.entrytime = '2014'; -- 使用Hive中已有的函数COUNT(),统计表employees_info中有多少条记录. SELECT COUNT(*) FROM employees_info; -- 查询使用以“cn”结尾的邮箱的员工信息. SELECT a.name, b.tel_phone FROM employees_info a JOIN employees_contact b ON (a.id = b.id) WHERE b.email like '%cn';
  • 扩展使用 配置Hive中间过程的数据加密 指定表的格式为RCFile(推荐使用)或SequenceFile,加密算法为ARC4Codec。SequenceFile是Hadoop特有的文件格式,RCFile是Hive优化的文件格式。RCFile优化了列存储,在对大表进行查询时,综合性能表现比SequenceFile更优。 set hive.exec.compress.output=true; set hive.exec.compress.intermediate=true; set hive.intermediate.compression.codec=org.apache.hadoop.io.encryption.arc4.ARC4Codec; 自定义函数,具体内容请参见创建Hive用户自定义函数。
  • 开发流程 开发流程中各阶段的说明如图1和表1所示。 图1 Hive应用程序开发流程 表1 Hive应用开发的流程说明 阶段 说明 参考文档 准备开发环境 在进行应用开发前,需首先准备开发环境,推荐使用Java语言进行开发,使用IntelliJ IDEA工具,同时完成JDK、Maven等初始配置。 准备开发环境 准备连接集群配置文件 应用程序开发或运行过程中,需通过集群相关配置文件信息连接MRS集群,配置文件通常包括集群组件信息文件以及用于安全认证的用户文件,可从已创建好的MRS集群中获取相关内容。 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts域名信息。 准备连接集群配置文件 配置并导入样例工程 HIve提供了不同场景下的多种样例程序,用户可获取样例工程并导入本地开发环境中进行程序学习。 配置并导入样例工程 配置安全认证 如果您使用的是JDBC访问开启了Kerberos认证的MRS集群,需要进行安全认证。 配置JDBC访问Hive安全认证 根据业务场景开发程序 根据实际业务场景开发程序,调用组件接口实现对应功能。 开发程序 编译并运行程序 指导用户将开发好的程序编译提交运行并查看结果。 调测程序 父主题: 概述
  • Hive简介 Hive是一个开源的,建立在Hadoop上的数据仓库框架,提供类似SQL的HQL语言操作结构化数据,其基本原理是将HQL语言自动转换成Mapreduce任务或Spark任务,从而完成对Hadoop集群中存储的海量数据进行查询和分析。 Hive主要特点如下: 通过HQL语言非常容易的完成数据提取、转换和加载(ETL)。 通过HQL完成海量结构化数据分析。 灵活的数据存储格式,支持JSON、CSV、TEXTFILE、RCFILE、ORCFILE、SEQUENCEFILE等存储格式,并支持自定义扩展。 多种客户端连接方式,支持JDBC接口。 Hive的主要应用于海量数据的离线分析(如日志分析,集群状态分析)、大规模的数据挖掘(用户行为分析,兴趣分区,区域展示)等场景下。 为保证Hive服务的高可用性、用户数据的安全及访问服务的可控制,在开源社区的Hive-3.1.0版本基础上,Hive新增如下特性: 基于Kerberos技术的安全认证机制。 数据文件加密机制。 完善的权限管理。 开源社区的Hive特性,请参见https://cwiki.apache.org/confluence/display/hive/designdocs。
  • 常用概念 keytab文件 存放用户信息的密钥文件。应用程序采用此密钥文件在MRS产品中进行API方式认证。 客户端 客户端直接面向用户,可通过Java API、Thrift API访问服务端进行Hive的相关操作。 HQL语言 Hive Query Language,类SQL语句。 HCatalog HCatalog是建立在Hive元数据之上的一个表信息管理层,吸收了Hive的DDL命令。为Mapreduce提供读写接口,提供Hive命令行接口来进行数据定义和元数据查询。基于MRS的HCatalog功能,Hive、Mapreduce开发人员能够共享元数据信息,避免中间转换和调整,能够提升数据处理的效率。 WebHCat WebHCat运行用户通过Rest API来执行Hive DDL,提交Mapreduce任务,查询Mapreduce任务执行结果等操作。 父主题: 概述
  • 基于API的Glob路径模式以获取LocatedFileStatus和从FileStatus打开文件 在DistributedFileSystem中添加了以下API,以获取具有块位置的FileStatus,并从FileStatus对象打开文件。这些API将减少从客户端到Namenode的RPC调用的数量。 表6 FileSystem API接口说明 Interface接口 Description说明 public LocatedFileStatus[] globLocatedStatus(Path, PathFilter, boolean) throws IOException 返回一个LocatedFileStatus对象数组,其对应文件路径符合路径过滤规则。 public FSDataInputStream open(FileStatus stat) throws IOException 如果stat对象是LocatedFileStatusHdfs的实例,该实例已具有位置信息,则直接创建InputStream而不联系Namenode。
  • HDFS样例工程介绍 MRS样例工程获取地址为https://github.com/huaweicloud/huaweicloud-mrs-example,切换分支为与MRS集群相匹配的版本分支,然后下载压缩包到本地后解压,即可获取各组件对应的样例代码工程。 当前MRS提供以下HDFS相关样例工程: 表1 HDFS相关样例工程 样例工程位置 描述 hdfs-example-security HDFS文件操作的Java示例程序。 本工程主要给出了创建HDFS文件夹、写文件、追加文件内容、读文件和删除文件/文件夹等相关接口操作示例。相关业务场景介绍请参见样例代码说明。 hdfs-c-example HDFS C语言开发代码样例。 本示例提供了基于C语言的HDFS文件系统连接、文件操作如创建文件、读写文件、追加文件、删除文件等。相关业务场景介绍请参见C API。 父主题: 概述
  • 代码样例 完整样例代码可参考com.huawei.bigdata.hdfs.examples.ColocationExample。 在运行Colocation工程时,需要将HDFS用户绑定supergroup用户组。 在运行Colocation工程时,HDFS的配置项fs.defaultFS不能配置为viewfs://ClusterX。 初始化 使用Colocation前需要进行kerberos安全认证。 private static void init() throws IOException { conf.set(KEYTAB, PATH_TO_KEYTAB); conf.set(PRINCIPAL, PRNCIPAL_NAME); LoginUtil.setJaasConf(LOGIN_CONTEXT_NAME, PRNCIPAL_NAME, PATH_TO_KEYTAB); LoginUtil.setZookeeperServerPrincipal(ZOOKEEPER_SERVER_PRINCIPAL_KEY, ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL); LoginUtil.login(PRNCIPAL_NAME, PATH_TO_KEYTAB, PATH_TO_KRB5_CONF, conf);} 获取实例 样例:Colocation的操作使用DFSColocationAdmin和DFSColocationClient实例,在进行创建group等操作前需获取实例。 dfsAdmin = new DFSColocationAdmin(conf); dfs = new DFSColocationClient(); dfs.initialize(URI.create(conf.get("fs.defaultFS")), conf); 创建group 样例:创建一个gid01组,组中包含3个locator。 /** * 创建group * * @throws java.io.IOException */private static void createGroup() throws IOException { dfsAdmin.createColocationGroup(COLOCATION_GROUP_GROUP01, Arrays.asList(new String[] { "lid01", "lid02", "lid03" }));} 写文件,写文件前必须创建对应的group 样例:写入testfile.txt文件。 /** * 创建并写入文件 * * @throws java.io.IOException */private static void put() throws IOException { FSDataOutputStream out = dfs.create(new Path(TESTFILE_TXT), true, COLOCATION_GROUP_GROUP01, "lid01"); // 待写入HDFS的数据 byte[] readBuf = "Hello World".getBytes("UTF-8"); out.write(readBuf, 0, readBuf.length); out.close();} 删除文件 样例:删除testfile.txt文件。 /** * 删除文件 * * @throws java.io.IOException */@SuppressWarnings("deprecation")private static void delete() throws IOException { dfs.delete(new Path(TESTFILE_TXT));} 删除group 样例:删除gid01。 /** * 删除group * * @throws java.io.IOException */private static void deleteGroup() throws IOException { dfsAdmin.deleteColocationGroup(COLOCATION_GROUP_GROUP01);}
  • 功能简介 同分布(Colocation)功能是将存在关联关系的数据或可能要进行关联操作的数据存储在相同的存储节点上。HDFS文件同分布的特性,将那些需进行关联操作的文件存放在相同数据节点上,在进行关联操作计算时避免了到别的数据节点上获取数据,大大降低网络带宽的占用。 在使用Colocation功能之前,建议用户对Colocation的内部机制有一定了解,包括: Colocation分配节点原理 扩容与Colocation分配 Colocation与数据节点容量 Colocation分配节点原理 Colocation为locator分配数据节点的时候,locator的分配算法会根据已分配的情况,进行均衡的分配数据节点。 locator分配算法的原理是,查询目前存在的所有locators,读取所有locators所分配的数据节点,并记录其使用次数。根据使用次数,对数据节点进行排序,使用次数少的排在前面,优先选择排在前面的节点。每次选择一个节点后,计数加1,并重新排序,选择后续的节点。 扩容与Colocation分配 集群扩容之后,为了平衡地使用所有的数据节点,使新的数据节点的分配频率与旧的数据节点趋于一致,有如下两种策略可以选择,如表1所示。 表1 分配策略 编号 策略 说明 1 删除旧的locators,为集群中所有数据节点重新创建locators。 在未扩容之前分配的locators,平衡的使用了所有数据节点。当扩容后,新加入的数据节点并未分配到已经创建的locators中,所以使用Colocation来存储数据的时候,只会往旧的数据节点存储数据。 由于locators与特定数据节点相关,所以当集群进行扩容的时候,就需要对Colocation的locators分配进行重新规划。 2 创建一批新的locators,并重新规划数据存放方式。 旧的locators使用的是旧的数据节点,而新创建的locators偏重使用新的数据节点,所以需要根据实际业务对数据的使用需求,重新规划locators的使用。 一般的,建议用户在进行集群扩容之后采用策略一来重新分配locators,可以避免数据偏重使用新的数据节点。 Colocation与数据节点容量 由于使用Colocation进行存储数据的时候,会固定存储在指定的locator所对应的数据节点上面,所以如果不对locator进行规划,会造成数据节点容量不均衡。下面总结了保证数据节点容量均衡的两个主要的使用原则,如表2所示。 表2 使用原则 编号 使用原则 说明 1 所有的数据节点在locators中出现的频率一样。 如何保证频率一样:假如数据节点有N个,则创建locators的数量应为N的整数倍(N个、2N个……)。 2 对于所有locators的使用需要进行合理的数据存放规划,让数据均匀的分布在这些locators中。 无 HDFS的二次开发过程中,可以获取DFSColocationAdmin和DFSColocationClient实例,进行从location创建group、删除group、写文件和删除文件的操作。 使用Colocation功能,用户指定了DataNode,会造成某些节点上数据量很大。数据倾斜严重,导致HDFS写任务失败。 由于数据倾斜,导致MapReduce只会在某几个节点访问,造成这些节点上负载很大,而其他节点闲置。 针对单个应用程序任务,只能使用一次DFSColocationAdmin和DFSColocationClient实例。如果每次对文件系统操作都获取此实例,会创建过多HDFS链接,消耗HDFS资源。 Colocation提供了文件同分布的功能,执行集群Balancer或Mover操作时,会移动数据块,使Colocation功能失效。因此,使用Colocation功能时,建议将HDFS配置项dfs.datanode.block-pinning.enabled设置为true,此时执行集群Balancer或Mover操作时,使用Colocation写入的文件将不会被移动,从而保证了文件同分布。
  • 操作步骤 查看运行结果获取应用运行情况 HdfsExample Windows样例程序运行结果如下所示。 ...1308 [main] INFO org.apache.hadoop.security.UserGroupInformation - Login successful for user hdfsDevelop using keytab file 1308 [main] INFO com.huawei.hadoop.security.LoginUtil - Login success!!!!!!!!!!!!!!2040 [main] WARN org.apache.hadoop.hdfs.shortcircuit.DomainSocketFactory - The short-circuit local reads feature cannot be used because UNIX Domain sockets are not available on Windows.3006 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to create path /user/hdfs-examples3131 [main] WARN org.apache.hadoop.util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable3598 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to write.4408 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to append.5015 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - result is : hi, I am bigdata. It is successful if you can see me.I append this content.5015 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to read.5077 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to delete the file /user/hdfs-examples\test.txt5186 [main] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to delete path /user/hdfs-examples5311 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to create path /user/hdfs-examples/hdfs_example_05311 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to create path /user/hdfs-examples/hdfs_example_15669 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to write.5669 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to write.7258 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to append.7741 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to append.7896 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - result is : hi, I am bigdata. It is successful if you can see me.I append this content.7896 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to read.7959 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to delete the file /user/hdfs-examples/hdfs_example_1\test.txt8068 [hdfs_example_1] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to delete path /user/hdfs-examples/hdfs_example_18364 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - result is : hi, I am bigdata. It is successful if you can see me.I append this content.8364 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to read.8426 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to delete the file /user/hdfs-examples/hdfs_example_0\test.txt8535 [hdfs_example_0] INFO com.huawei.bigdata.hdfs.examples.HdfsExample - success to delete path /user/hdfs-examples/hdfs_example_0... 在Windows环境运行样例代码时可能会出现下面的异常,但是不影响业务: java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries. ColocationExample Windows样例程序运行结果如下所示。 ...945 [main] INFO org.apache.hadoop.security.UserGroupInformation - Login successful for user hdfsDeveloper using keytab file user.keytab945 [main] INFO com.huawei.hadoop.security.LoginUtil - Login success!!!!!!!!!!!!!!945 [main] INFO com.huawei.hadoop.security.LoginUtil - JaasConfiguration loginContextName=Client principal=hdfsDeveloper useTicketCache=false keytabFile=XXX\sample_project\src\hdfs-example-security\conf\user.keytab946 [main] INFO com.huawei.hadoop.security.KerberosUtil - Get default realm successfully, the realm is : HADOOP.COM...Create Group has finished.Put file is running...Put file has finished.Delete file is running...Delete file has finished.Delete Group is running...Delete Group has finished.4946 [main-EventThread] INFO org.apache.zookeeper.ClientCnxn - EventThread shut down for connection: 0x440751cb41a4d4154946 [main] INFO org.apache.zookeeper.ZooKeeper - Connection: 0x440751cb41a4d415 closed... 查看HDFS日志获取应用运行情况 您可以查看HDFS的NameNode日志了解应用运行情况,并根据日志信息调整应用程序。
  • 代码样例 如下是删除文件的代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples中的HdfsExample类。 /** * 删除目录 * * @throws java.io.IOException */private void rmdir() throws IOException { Path destPath = new Path(DEST_PATH); if (!deletePath(destPath)) { LOG.error("failed to delete destPath " + DEST_PATH); return; } LOG.info("success to delete path " + DEST_PATH);}/** * delete file path * * @param filePath * @return * @throws java.io.IOException */private boolean deletePath(final Path filePath) throws IOException { if (!fSystem.exists(filePath)) { return false; } // fSystem.delete(filePath, true); return fSystem.delete(filePath, true);}
  • 操作步骤 在开发环境中(例如IntelliJ IDEA中),分别选中以下两个工程运行程序: 选中HdfsExample.java,右键工程,选择“Run 'HdfsExample.main()'”运行应用工程。 选中ColocationExample.java,右键工程,选择“Run 'ColocationExample.main()'”运行应用工程。 在HDFS任务运行过程中禁止重启HDFS服务,否则可能会导致任务失败。 在运行Colocation工程时,HDFS的配置项fs.defaultFS不能配置为viewfs://ClusterX。
  • 代码样例 如下是读文件的代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples中的HdfsExample类。 /** * 读文件 * * @throws java.io.IOException */private void read() throws IOException { String strPath = DEST_PATH + File.separator + FILE_NAME; Path path = new Path(strPath); FSDataInputStream in = null; BufferedReader reader = null; StringBuffer strBuffer = new StringBuffer(); try { in = fSystem.open(path); reader = new BufferedReader(new InputStreamReader(in)); String sTempOneLine; // write file while ((sTempOneLine = reader.readLine()) != null) { strBuffer.append(sTempOneLine); } LOG.info("result is : " + strBuffer.toString()); LOG.info("success to read."); } finally { // make sure the streams are closed finally. IOUtils.closeStream(reader); IOUtils.closeStream(in); }}
  • 配置文件介绍 登录HDFS时会使用到如表1所示的配置文件。这些文件均已导入到“hdfs-example-security”工程的“conf”目录。 表1 配置文件 文件名称 作用 core-site.xml 配置HDFS详细参数。 hdfs-site.xml 配置HDFS详细参数。 user.keytab 对于Kerberos安全认证提供HDFS用户信息。 krb5.conf Kerberos server配置信息。 不同集群的“user.keytab”、“krb5.conf”不能共用。 “conf”目录下的“log4j.properties”文件客户根据自己的需要进行配置。
  • 代码样例 如下是写文件的代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples中的HdfsExample类。 /** * 创建文件,写文件 * * @throws java.io.IOException * @throws com.huawei.bigdata.hdfs.examples.ParameterException */private void write() throws IOException { final String content = "hi, I am bigdata. It is successful if you can see me."; FSDataOutputStream out = null; try { out = fSystem.create(new Path(DEST_PATH + File.separator + FILE_NAME)); out.write(content.getBytes()); out.hsync(); LOG.info("success to write."); } finally { // make sure the stream is closed finally. IOUtils.closeStream(out); }}
  • 代码样例 如下是代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples的HdfsExample类。 在Linux客户端运行应用和在Windows环境下运行应用的初始化代码相同,代码样例如下所示。 // 完成初始化和认证 confLoad(); authentication(); // 创建一个用例 HdfsExample hdfs_examples = new HdfsExample("/user/hdfs-examples", "test.txt"); /** * * 如果程序运行在Linux上,则需要core-site.xml、hdfs-site.xml的路径修改 * 为在Linux下客户端文件的绝对路径 * * */ private static void confLoad() throws IOException { 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); } } /** *创建用例 */ public HdfsExample(String path, String fileName) throws IOException { this.DEST_PATH = path; this.FILE_NAME = fileName; instanceBuild(); } private void instanceBuild() throws IOException { fSystem = FileSystem.get(conf); }
  • 代码样例 如下是删除文件的代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples中的HdfsExample类。 /** * 删除文件 * * @throws java.io.IOException */private void delete() throws IOException { Path beDeletedPath = new Path(DEST_PATH + File.separator + FILE_NAME); if (fSystem.delete(beDeletedPath, true)) { LOG.info("success to delete the file " + DEST_PATH + File.separator + FILE_NAME); } else { LOG.warn("failed to delete the file " + DEST_PATH + File.separator + FILE_NAME); }}
  • 代码样例 如下是代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples中的HdfsExample类。 /** * 追加文件内容 * * @throws java.io.IOException */private void append() throws IOException { final String content = "I append this content."; FSDataOutputStream out = null; try { out = fSystem.append(new Path(DEST_PATH + File.separator + FILE_NAME)); out.write(content.getBytes()); out.hsync(); LOG.info("success to append."); } finally { // make sure the stream is closed finally. IOUtils.closeStream(out); }}
  • 代码样例 如下是写文件的代码片段,详细代码请参考com.huawei.bigdata.hdfs.examples中的HdfsExample类。 /** * 创建目录 * * @throws java.io.IOException */ private void mkdir() throws IOException { Path destPath = new Path(DEST_PATH); if (!createPath(destPath)) { LOG.error("failed to create destPath " + DEST_PATH); return; } LOG.info("success to create path " + DEST_PATH);}/** * create file path * * @param filePath * @return * @throws java.io.IOException */private boolean createPath(final Path filePath) throws IOException { if (!fSystem.exists(filePath)) { fSystem.mkdirs(filePath); } return true;}
  • 开发思路 根据前述场景说明进行功能分解,以“/user/hdfs-examples/test.txt”文件的读写删除等操作为例,说明HDFS文件的基本操作流程,可分为以下八部分: 通过安全认证。 创建FileSystem对象:fSystem。 调用fSystem的mkdir接口创建目录。 调用fSystem的create接口创建FSDataOutputStream对象:out,使用out的write方法写入数据。 调用fSystem的append接口创建FSDataOutputStream对象:out,使用out的write方法追加写入数据。 调用fSystem的open接口创建FSDataInputStream对象:in,使用in的read方法读取文件。 调用fSystem中的delete接口删除文件。 调用fSystem中的delete接口删除文件夹。
  • 开发流程 开发流程中各阶段的说明如图1和表1所示。 图1 HDFS应用程序开发流程 表1 HDFS应用开发的流程说明 阶段 说明 参考文档 了解基本概念 在开始开发应用前,需要了解HDFS的基本概念。 常用概念 准备开发和运行环境 使用IntelliJ IDEA工具,请根据指导完成开发环境配置。 HDFS的运行环境即HDFS客户端,请根据指导完成客户端的安装和配置。 准备开发和运行环境 准备工程 HDFS提供了不同场景下的样例程序,可以导入样例工程进行程序学习。 配置并导入样例工程 准备安全认证 如果使用的是安全集群,需要进行安全认证。 准备安全认证 根据场景开发工程 提供样例工程,帮助用户快速了解HDFS各部件的编程接口。 开发程序 编译并运行程序 指导用户将开发好的程序编译并提交运行。 调测程序 查看程序运行结果 程序运行结果会写在用户指定的路径下。用户还可以通过UI查看应用运行情况。 调测程序 父主题: 概述
  • 打印metric信息 表2 基本指标项 Metric名称 描述 日志级别 total_request_count 周期时间内查询总次数 INFO active_success_count 周期时间内主集群查询成功次数 INFO active_error_count 周期时间内主集群查询失败次数 INFO active_timeout_count 周期时间内主集群查询超时次数 INFO standby_success_count 周期时间内备集群查询成功次数 INFO standby_error_count 周期时间内备集群查询失败次数 INFO Active Thread pool 周期打印请求主集群的执行线程池信息 DEBUG Standby Thread pool 周期打印请求备集群的执行线程池信息 DEBUG Clear Thread pool 周期打印释放资源的执行线程池信息 DEBUG 表3 针对GET、BatchGET、SCAN请求,分别打印Histogram指标项 Metric名称 描述 日志级别 averageLatency(ms) 平均时延 INFO minLatency(ms) 最小时延 INFO maxLatency(ms) 最大时延 INFO 95thPercentileLatency(ms) 95%请求的最大时延 INFO 99thPercentileLatency(ms) 99%请求的最大时延 INFO 99.9PercentileLatency(ms) 99.9%请求的最大时延 INFO 99.99PercentileLatency(ms) 99.99%请求的最大时延 INFO
  • Client HDFS Client主要包括五种方式:JAVA API、C API、Shell、HTTP REST API、WEB UI五种方式,可参考常用API介绍、Shell命令介绍。 JAVA API 提供HDFS文件系统的应用接口,本开发指南主要介绍如何使用Java API进行HDFS文件系统的应用开发。 C API 提供HDFS文件系统的应用接口,使用C语言开发的用户可参考C接口的描述进行应用开发。 Shell 提供shell命令完成HDFS文件系统的基本操作。 HTTP REST API 提供除Shell、Java API和C API以外的其他接口,可通过此接口监控HDFS状态等信息。 WEB UI 提供Web可视化组件管理界面。
  • HBase双读操作 表1 hbase-dual.xml配置项 配置项名称 配置项详解 默认值 级别 hbase.dualclient.active.cluster.configuration.path 主集群HBase客户端配置目录 无 必选配置 hbase.dualclient.standby.cluster.configuration.path 备集群HBase客户端配置目录 无 必选配置 dual.client.schedule.update.table.delay.second 更新开启容灾表列表的周期时间 5 可选配置 hbase.dualclient.glitchtimeout.ms 可以容忍主集群的最大毛刺时间 50 可选配置 hbase.dualclient.slow.query.timeout.ms 慢查询告警日志 180000 可选配置 hbase.dualclient.active.cluster.id 主集群id ACTIVE 可选配置 hbase.dualclient.standby.cluster.id 备集群id STANDBY 可选配置 hbase.dualclient.active.executor.thread.max 请求主集群的线程池max大小 100 可选配置 hbase.dualclient.active.executor.thread.core 请求主集群的线程池core大小 100 可选配置 hbase.dualclient.active.executor.queue 请求主集群的线程池queue大小 256 可选配置 hbase.dualclient.standby.executor.thread.max 请求备集群的线程池max大小 100 可选配置 hbase.dualclient.standby.executor.thread.core 请求备集群的线程池core大小 100 可选配置 hbase.dualclient.standby.executor.queue 请求备集群的线程池queue大小 256 可选配置 hbase.dualclient.clear.executor.thread.max 清理资源线程池max大小 30 可选配置 hbase.dualclient.clear.executor.thread.core 清理资源线程池core大小 30 可选配置 hbase.dualclient.clear.executor.queue 清理资源线程池queue大小 Integer. MAX_VALUE 可选配置 dual.client.metrics.enable 客户端metric信息是否打印 true 可选配置 dual.client.schedule.metrics.second 客户端metric信息打印周期 300 可选配置 dual.client.asynchronous.enable 是否异步请求主备集群 false 可选配置
共100000条