如何使用Java程序通过JDBC访问HDInsight Hive Server

很多用户在使用HDInsight的时候,需要Java客户端访问群集的Hive Server语句、或者提交作业,在Azure的门户已经提供了使用ODBC访问Hive Server的方式(海外环境配置ODBC链接,中国环境配置ODBC链接),本文主要介绍如何让Java程序通过JDBC访问HDInsight Hive Server。 首先需要注意的是,从安全的角度,HDInsight会使用SSL安全连接,监听443端口,如下为一个示例连接字符串: jdbc:hive2://myclustername.azurehdinsight.net:443/default;ssl=true?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/hive2jdbc:hive2://myclustername.azurehdinsight.cn:443/default;ssl=true?hive.server2.transport.mode=http;hive.server2.thrift.http.path=/hive2   如下步骤为一个以Maven项目为例的访问Hive Server的示例: 1. 假定已经安装好Eclipse和Maven,为了获取Maven的项目模板,请执行如下命令:       mvn archetype:generate -DgroupId=com.microsoft.css -DartifactId=HiveJdbcTest -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 2. 修改POM.XML:默认的POM文件,并不包含HDInsight所需的Jar依赖文件,请手动添加以下依赖。 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>0.14.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>0.14.0</version> </dependency> <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-avatica</artifactId> <version>0.9.2-incubating</version> </dependency> <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-core</artifactId> <version>0.9.2-incubating</version> </dependency>…


提交HDInsight Pig作业

Pig是Hadoop常用的一个模块,Azure提供了使用PowerShell提交Pig作业的方式,当Pig Latin的脚本较为短小时,可使用New-AzureHDInsightPigJobDefinition的-Query直接指定脚本内容,示例如下: $clusterName = “HDIDemo” $QueryString = “intxt1 = load ‘wasb://hdirawdata@teststorage.blob.core.chinacloudapi.cn/userbehavior.log’ ;” + “store intxt1 into ‘wasb:///home/mytest1’ ;” $pigJobDefinition = New-AzureHDInsightPigJobDefinition -Query $QueryString $pigJob = Start-AzureHDInsightJob -Cluster $clusterName -JobDefinition $pigJobDefinition Wait-AzureHDInsightJob -Job $pigJob -WaitTimeoutInSeconds 3600 Write-Host “Display the standard output …” -ForegroundColor Green Get-AzureHDInsightJobOutput -Cluster $clusterName -JobId $pigJob.JobId -StandardError 当Pig Latin的脚本过长时,则会遇到”The input line is too…


Azure HDInsight HBase DR解决方案

Apache HBase是目前非常流行的NoSQL数据库,通过HDFS+Zookeep+Master+Region Server的架构避免了单点故障具有很高的可靠性。在Azure HDInsight中的HBase也提供了相应的功能,通过Azure Storage来代替HDFS并提供了3个zookeeper及在多个workernode上的region server,并提供每月99.9%的SLA。但是对于一些更苛刻的场景,用户还需要DR的方案来保证业务的连续性。Apache HBase自身提供了Replication的功能,这种功能类似于MySQL里面的Master-Salve部署模式,我们可以部署2套Apache HBase Cluster来实现DR的要求。在Azure的数据中心设计时,我们也考虑到DR的情况,在每一个区域我们都提供了2个互为灾备的数据中心,在中国我们有北部和东部2个数据中心来做数据中心间的灾备,这样我们就可以利用Azure的资源来设计HBase的灾备解决方案了。 首先在设计Azure HDInsight HBase灾备的前提是网络层面的互通。Azure是一种多租户的环境,每隔客户之间的网络是相互隔离的,即便是一个客户的订阅下,北部数据中心和东部数据中心的网络也是不能互通的。为了达到这种互通的效果,我们需要借助Azure Virtual Network以及Site-to-Site VPN技术将2个数据中心的网络层进行互联,具体可以参考 https://msdn.microsoft.com/library/azure/dn133795.aspx 其次我们还需要处理名称解析的问题。处于安全考虑Azure默认提供的DNS只能解析一个云服务内的名称解析,对于这种跨Azure数据中心的名称解析,我们可以通过自己搭建DNS并在虚拟网络里设定DNS的方法来处理,将2个Cluster里面的服务器通过手工的方法注册到DNS之中。 最后的步骤就是创建HBase Cluster了。由于需要在部署Hbase的时候指定虚拟网络并修改hbase-site.xml,所以我们需要通过Powershell脚本的方式来创建。下面的示例脚本可以帮我们在2个数据中心中创建我们需要的2个cluster #default storage account name for HDInsight cluster $storageAccountName01=”Your storage account name in China North” $storageAccountName02=”Your storage account name in China East” #default storage container name for HDInsight cluster, the container is used to save the hadoop…


Reduce对Pig作业性能的影响

很多用户在使用HDInsight的Pig功能时,发现有时很简单一个Pig Latin的relation会花费很长时间执行,当HDI使用MR框架时,由于Pig会根据具体的relation拆分成相应的Map和Reduce任务。根据Hadoop的MR框架如下特点,针对Reduce并行度的优化,会对Pig的作业有很大的性能影响。 Hadoop的MR框架中有以下特点: Map的并行度个数是由输入文件来决定,而Reduce并行度的个数是由Parallel关键字来决定。 当不指定parallel关键字时, Reduce task仅有一个。 Reduce的并行度依赖于cluster的规模。 具体内容看如下文档:http://wiki.apache.org/pig/PigLatin   当我们使用Get-AzureHDInsightJobOutput来进一步分析Pig作业的具体执行情况,我们可以通过Pig作业执行的具体日志来查看Map和Reduce的效率。如下为当使用group by的Pig作业的日志信息: =================================================== 测试1:默认一个Reduce的Pig 作业,执行Pig作业花费了74分钟: —————————– 2015-02-10 09:01:27,937 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher- 0% complete 2015-02-10 09:02:43,446 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher- 4% complete … 2015-02-10 10:15:18,029 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher- 100% complete … JobId     Maps    Reduces              MaxMapTime   MinMapTIme    AvgMapTime              MedianMapTime            MaxReduceTime             MinReduceTime              AvgReduceTime              MedianReducetime        Alias      Feature              Outputs job_1423547880282_0013          482        1            418        23         …


在Azure HDInsight HBase集群中使用Thrift接口

Apache Thrift 是一种可扩展的跨语言服务接口,可以通过内置的代码生成引擎帮助创建跨语言服务类库,Apache HBase 也是通过Thrift sever与Python,Ruby等其他程序开发语言进行交互。但是默认情况下Thrift Server默认不是启动的,需要手工处理一下。在Azure HDInight HBase中这种处理的方式有2种,我们可以根据使用场景来进行配置。 第一种方法相对简单,我们可以通过RDP远程连接到HeadNode0上,通过命令行hbase thrift2 start的方法启动thrift server进程。这种方法很简单,但是并不能能满足高可用的要求,只能用于开发测试环境。 第二种方法会复杂很多,但是可以提供生产级别的可用性,可扩展性要求。 创建2个Linux VM并将Azure HDInsight HBase集群部署到相同的虚拟网络上 在VM中设置$JAVA_HOME 在VM中配置repositories wget -nv http://public-repo-1.hortonworks.com/HDP/centos6/2.x/GA/2.2.0.0/hdp.repo -O /etc/yum.repos.d/hdp.repo 在VM中安装HBase sudo yum install hbase 在VM中修改hbase-site.xml,主要是提供zookeeper的地址,可以通过DNS或者host文件的方法提供这些zookeeper及workernode的名字解析,zookeeper以及workernode的名称可以通过Ambari API得到  <configuration>   <property>     <name>hbase.cluster.distributed</name>     <value>true</value>   </property>   <property>     <name>hbase.zookeeper.quorum</name>     <value>zookeeper0.hbase.hdicluster.local,zookeeper1.hbase.hdicluster.local,zookeeper2.hbase.hdicluster.local</value>   </property>   <property>     <name>hbase.zookeeper.property.clientPort</name>     <value>2181</value>   </property> </configuration> 配置服务进程,我们需要在/etc/init.d目录下添加一个名称为hbase-thrift2的服务启动脚本 #!/bin/sh #chkconfig :2345 90 60 #description : hbase thrift gateway service,…


Azure HDInsight与Hadoop周边系统集成

传统的Hadoop系统提供给用户2个非常优秀的框架,MR计算框架和HDFS存储框架,尽管MR已经显得有些老迈而缓慢,但是HDFS还是很多应用系统的基石,很多应用都可以把HDFS作为系统的基本数据输入和输出方式。HDFS的基本特征就是数据是分布式切块存储,通过多副本冗余的方式来提供数据持久性保障,并且可以通过节点的增加来进行系统的扩容,这也是很多用户和系统所看重的特点。目前在Hadoop社区里面有各种各样的组件和解决方案用于处理海量数据、可靠性消息、数据分析及预测等多种领域。 Microsoft Azure是一个开放的平台,用户当然可以在Azure上通过运行虚拟机的方式运行Hadoop系统来实现自己的业务功能,但是Azure平台还提供了Azure HDInsight这种PaaS服务来帮助客户更简单的部署和管理他们的Hadoop系统。Azure HDInsight是一套核心的计算组件,请注意我只说了它是负责计算相关的工作。在计算的方面,目前HDInsight提供了3种不同的Cluster类型,标准的Hadoop(HIVE),HBase Cluster,Storm Cluster,未来Azure还会根据用户的需求引入其他Hadoop的集群。每种不同的Cluster类型我们都进行了针对这个组件相关的一些特殊设计和处理,这样可以针对特定的组件进行优化和配置。从架构上看HDInsight和传统的Hadoop Cluster有一些不同,我们在用户接入层有一层安全网关负责接入客户端请求以及认证,然后将认证后的请求转发到后端可用的headnode上,这种方式不但给Hadoop提供了安全认证以及端口的保护,而且也实现了Name Node的高可用性。如果是HBase Cluster,后端还会有3个zookeeper节点的HA方案。如果用户需要直接访问headnode,我们可以通过将cluster部署到Region VNET的方式来支持,这个功能需要通过Powershell来指定VirtualNetworkId和SubnetName参数来实现,注意这个参数是ID而不是VNET的Name,可以通过(Get-AzureVNetSite-VNetName$VNetName).Id 得到,这样就可以将Cluster与你其他的VM放在同一个VNET里面进行直接通信了。另外最近我们在HDInsight上支持了自定义脚本操作,这个功能非常有意义,可以用于安装新的组件例如Spark和R,也可以用来给现有的组件进行补丁的更新,具体的细节你可以参考 http://azure.microsoft.com/en-us/documentation/articles/hdinsight-hadoop-script-actions/ 除了计算功能之外,Microsoft Azure还提供了功能强大的存储功能,Azure Storage是Azure最基础的服务之一,提供了高持久性、高可用的分布式存储系统完全可以媲美HDFS,所以在HDInsight中我们使用了Azure Storage而不是HDFS的技术,也就是说HDInsight实现了在Hadoop上的计算与存储分离。这样处理的优势非常明显,用户可以根据计算的用量来动态创建和销毁Cluster而不需要考虑数据的问题,只需要保持使用同样的存储账号、容器、基于Azure SQL DB的Hive元数据库。这种基于使用成本的优化方式是传统的Hadoop和HDFS所不能实现的,具体的信息可以参考 http://www.windowsazure.cn/zh-cn/documentation/articles/hdinsight-use-blob-storage/ Hadoop的强大之处并不是因为只有MR和HDFS,发挥更多作用的还是周边的生态系统组件,这些组件不断的在丰富和扩展Hadoop的功能,让客户更加容易的发挥其作用,所以HDInsight必须能够与其他的相关系统进行集成才能与开源社区和客户相连。 在HDInsight平台上除了自身默认支持的功能外,通过自定义脚本操作很多Hadoop周边的系统都可以运行在HDInsight之上,但是而然会有一些周边的系统需要通过HDFS直接与Hadoop系统进行连接,例如用于日志收集的Apache Flume。在这种情况下,为了和Hadoop生态系统保持更好的兼容,微软在Hadoop的source code上也贡献了关于这个部分的源代码,我们可以通过下面的git命令获取Apache Hadoop的源代码并在 hadoop-common\hadoop-tools\hadoop-azure下看到在HDFS上支持Azure Storage方面的代码。 git clone git://git.apache.org/hadoop-common.git 通过编译后我们可以将生成的hadoop-azure-3.0.0-SNAPSHOT.jar以及引用的microsoft-windowsazure-storage-sdk-0.6.0.jar复制到你需要的相关Hadoop组件的classpath路径内,然后在hadoop client中的core-site.xml中添加 <property>  <name>fs.azure.account.key.{your account}.blob.core.chinacloudapi.cn</name>  <value>{your key}</value></property> 这样Hadoop生态系统中相关的其他系统中通过wasb://来代替hdfs://达到与HDInsight的集成的效果