版权所有©2015华为技术有限公司Hive二次开发第1页版权所有©2015华为技术有限公司目标学完本课程后,您将能够:了解JDBC客户端开发流程了解Python客户端开发流程了解Hcatalog开发接口第2页版权所有©2015华为技术有限公司目录1.Hive二次开发JDBC客户端开发Python客户端开发HCatalog开发接口2.开发规范规则建议第3页版权所有©2015华为技术有限公司JDBC开发-环境搭建下载客户端包配置开发环境创建Java工程开发应用编译运行//导入HiveServer的JDBC连接工具包importcom.huawei.bigdata.hive.client.Executor;importcom.huawei.bigdata.hive.client.jdbc.SimpleResults;//HQL执行Executor.execute(showdatabases,SimpleResults.class)#安全版本需配置用户kerberos机机账号及keytab文件路径,用于安全登陆.username.client.kerberos.principal=daisy/hive@HADOOP.COMusername.client.keytab.file=D:\\out\\key\\daisy.keytab1,执行安装包Hive文件夹下hive_install.bat;2,执行成功后,在Eclipse工具中,单击“FileImportGeneralExistingProjectsintoWorkspaceNextBrowse”。显示“浏览文件夹”对话框,选择“hive-examples”,导入工程,单击“Finish”即可。在FusionInsightOM页面点击ServicesDownloadClient第4页版权所有©2015华为技术有限公司确认待连接的集群是否为安全版本并配置安全版本下,设置krb5文件路径和zookeeper用户名,及zookeeper客户端是否建立在sasl上。本例中krb5文件为Eclipse工程HiveExample的“conf/krb5.conf”。JDBC开发-代码示例,//所连接的集群是否为安全版本booleanisSecureVer=true;//设置krb5文件路径if(isSecureVerson){System.setProperty(SECURITY_KRB5_CONF,conf/krb5.conf);System.setProperty(ZK_SERVER_PRINCIPAL,zookeeper/hadoop.hadoop.com);System.setProperty(ZK_SASL_CLIENT,true);}第5页版权所有©2015华为技术有限公司配置ZooKeerper信息设置ZooKeeper的IP列表和端口之间以”,”分隔。本例中ZooKeeper部署在三个节点上,使用的端口默认为”24002”。JDBC开发-代码示例,//其中,zkQuorum的xxx.xxx.xxx.xxx为集群中Zookeeper所在节点的IP,端口默认是24002StringzkQuorum=xxx.xxx.xxx.xxx:24002,xxx.xxx.xxx.xxx:24002,xxx.xxx.xxx.xxx:24002;}第6页版权所有©2015华为技术有限公司定义HQL语句HQL必须为单条语句,注意HQL不能包含”;”。JDBC开发-代码示例,//定义HQL,不能包含”;”String[]sqls={CREATETABLEIFNOTEXISTSemployees_info(idINT,nameSTRING),SELECTCOUNT(*)FROMemployees_info,DROPTABLEemployees_info“};第7页版权所有©2015华为技术有限公司拼接JDBCURL如果是安全版本需要拼接kerberos用户以及keytab文件路径等信息。、JDBC开发-代码示例,StringuserPrincipal=hive/hadoop.hadoop.com;StringuserKeyTab=conf/hive.keytab;sBuilder.append(;serviceDiscoveryMode=).append(zooKeeper).append(;zooKeeperNamespace=).append(hiveserver2;sasl.qop=auth-conf;auth=KERBEROS;principal=hive/hadoop.hadoop.com@HADOOP.COM).append(;user.principal=).append(userPrincipal).append(;user.keytab=).append(userKeyTab).append(;);第8页版权所有©2015华为技术有限公司使用Python进行二次开发前请确认以下事项:确认FusionInsightHD产品Hive组件已经安装,并且正常运行。客户端机器必须安装有Python,其版本不低于2.6.6。客户端机器必须安装有setuptools,其版本不低于5.0。客户端机器的时间与FusionInsightHD集群的时间要保持一致,时间差要小于5分钟。Hive客户端已经成功下载到本地。(下载过程请参考JDBC开发-环境搭建章节)Python开发-环境准备,第9页版权所有©2015华为技术有限公司Python客户端示例程序搭建步骤:进入本地机器的解压后的目录(以下简称解压目录)。进入“Hive”子目录。将“python-examples”文件夹拷贝到客户端机器。进入客户端机器的“python-examples”文件夹。在客户端机器的命令行终端执行pythonsetup.pyinstall。输出以下关键内容表示安装Python客户端成功。Finishedprocessingdependenciesforpyhs2==0.5.0Python开发-工程搭建,第10页版权所有©2015华为技术有限公司示例:Python开发-代码示例,hosts=[xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx]conf={krb_host:hadoop.hadoop.com,krb_service:hive}try:withHAConnection(hosts=hosts,port=21066,authMechanism=KERBEROS,configuration=conf)ashaConn:withhaConn.getConnection()asconn:withconn.cursor()ascur:printcur.getDatabases()cur.execute(showtables)printcur.getSchema()foriincur.fetch():printiexceptException,e:printe第11页版权所有©2015华为技术有限公司1,执行安装包Hive文件夹下hive_install.bat;2,执行成功后,在Eclipse工具中,单击“FileImportGeneralExistingProjectsintoWorkspaceNextBrowse”。显示“浏览文件夹”对话框,选择“HCatalogExamples”,导入工程,单击“Finish”即可。在FusionInsightOM页面点击ServicesDownloadClient下载客户端demo工程配置开发环境导入Java工程开发应用编译、打包、运行1.参考示例程序提供的接口编写应用程序。2.编写完的应用程序需要打包并上传至任意节点。3.执行以下命令用于配置环境变量信息exportHCAT_HOME=$HIVE_HOME/../HCatalogexportLIB_JARS=$PATHexportHADOOP_CLASSPATH=$HADOOP_PATHHCatalog开发-工程搭建运行:yarn--config$HADOOP_HOME/etc/hadoopjarYOUR_PATH/hcat.jarcom.huawei.bigdata.hcatalog.example.HCatalogExample-libjars$LIB_JARSt1t2第12页版权所有©2015华为技术有限公司HCatInputFormat:HCatInputFormat用于提供接口给MapReduce程序,用于直接从Hive表里读取数据。setInputsetOutputSchemasetInputsetOutputSchemaHCatOutputFormat:HCatInputFormat用于提供接口给MapReduce程序,用于将数据写入Hive表。setOutputsetSchemagetTableSchemaHcatalog开发接口第13页版权所有©2015华为技术有限公司目录1.Hive二次开发2.开发规范规则建议第14页版权所有©2015华为技术有限公司Hive二次开发-规则建议标题规则获取数据库连接Hive的数据库URL在拼接时已经经过安全认证,所以Hive数据库的用户名和密码为null或者空。connection=DriverManager.getConnection(url,,);执行HQL执行HQL,注意HQL不能以“;”结尾,以下为正确示例:Stringsql=SELECTCOUNT(*)FROMemployees_infoHQL语法规则之判空判断字段是否为“空”,即没有值,使用“isnull”;判断不为空,即有值,使用“isnotnull”。要注意的是,在HQL中String类型的字段若是空字符串,即长度为0,那么对它进行ISNULL的判断结果是False。此时应该使用col=''来判断空字符串。第15页版权所有©2015华为技术有限公司Hive二次开发-规则建议标题规则多线程安全登录方式如果有多线程进行login的操作,当应用程序第一次登录成功后,所有线程再次登录时应该使用relogin的方式。login的代码样例:privateBooleanlogin(Configurationconf){booleanflag=false;UserGroupInformation.setConfiguration(conf);try{UserGroupInformation.loginUserFromKeytab(conf.get(PRINCIPAL),conf.get(KEYTAB));flag=true;}catch(IOExceptione){e.printStackTrace();}returnflag;}第16页版权所有©2015华为技术有限公司Hive二次开发-规则建议标题规则HQL编写之隐式类型转换查询语句使用字段的值做过滤时,不建议通过Hive自身的隐式类型转换来编写HQL。因为隐式类型转换不利于代码的阅读和移植。建议示例:select*fromdefault.tbl_srcwhereid=10001;select*fromdefault.tbl_srcwherename='HuangShuang';不建议示例:select*fromdefault.tbl_srcwhereid='10001';select*fromdefault.tbl_srcwherename=HuangShuang;JDBC超时限制Hive提供的JDBC实现有超时限制,默认是5分钟,用户可以通过java.sql.DriverManager.setLoginTimeout(intseconds)设置,seconds的单位为秒。第17页版权所有©2015华为技术有限公司谢谢谢谢