impala 同步 hive数据可以使用hive的内嵌函数吗

hive|LOFTER(乐乎) - 记录生活,发现同好
LOFTER for ipad —— 记录生活,发现同好
记录生活,发现同好
62位喜爱 #hive 的小伙伴邀你来玩
查看高清大图
喜欢并收藏内容
关注达人获取动态
评论私信与同好交流
10秒注册,查看更多优质内容
网易公司版权所有 & ICP备:浙B2-增值电信业务经营许可证:浙B2-
{if x.type==1}
{if !!x.title}${x.title}{/if}
{if !!x.digest}${x.digest}{/if}
{if x.type==2}
{if x.type==3}
{if x.type==4}
加入 LOFTER 开通功能特权
查看高清大图
喜欢并收藏内容
关注达人获取动态
评论私信与同好交流hadoop(13)
1. Impala架构
Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。其架构如图 1所示,Impala主要由Impalad, State Store和CLI组成。
Impalad: 与DataNode运行在同一节点上,由Impalad进程表示,它接收客户端的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。同时Impalad也与State
Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务。
Impala State Store: 跟踪集群中的Impalad的健康状态及位置信息,由statestored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后(Impalad发现State Store处于离线时,会进入recovery模式,反复注册,当State Store重新加入集群后,自动恢复正常,更新缓存数据)因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。
CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口。
2. 与Hive的关系
&&&&&&&&Impala与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。Impala与Hive在Hadoop中的关系如图
2所示。Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询,Impala给数据分析人员提供了快速实验、验证想法的大数据分析工具。可以先使用hive进行数据转换处理,之后使用Impala在Hive处理后的结果数据集上进行快速的数据分析。
3. Impala的查询处理过程
Impalad分为Java前端与C++处理后端,接受客户端连接的Impalad即作为这次查询的Coordinator,Coordinator通过JNI调用Java前端对用户的查询SQL进行分析生成执行计划树,不同的操作对应不用的PlanNode, 如:SelectNode, ScanNode, SortNode, AggregationNode, HashJoinNode等等。
执行计划树的每个原子操作由一个PlanFragment表示,通常一条查询语句由多个Plan Fragment组成, Plan Fragment 0表示执行树的根,汇聚结果返回给用户,执行树的叶子结点一般是Scan操作,分布式并行执行。
Java前端产生的执行计划树以Thrift数据格式返回给Impala C++后端(Coordinator)(执行计划分为多个阶段,每一个阶段叫做一个PlanFragment,每一个PlanFragment在执行时可以由多个Impalad实例并行执行(有些PlanFragment只能由一个Impalad实例执行,如聚合操作),整个执行计划为一执行计划树),由Coordinator根据执行计划,数据存储信息(Impala通过libhdfs与HDFS进行交互。通过hdfsGetHosts方法获得文件数据块所在节点的位置信息),通过调度器(现在只有simple-scheduler,
使用round-robin算法)Coordinator::Exec对生成的执行计划树分配给相应的后端执行器Impalad执行(查询会使用LLVM进行代码生成,编译,执行。对于使用LLVM如何提高性能有说明),通过调用GetNext()方法获取计算结果,如果是insert语句,则将计算结果通过libhdfs写回HDFS当所有输入数据被消耗光,执行结束,之后注销此次查询服务。
Impala的查询处理流程大概如图3所示:
&&&&&&&&下面以一个SQL查询语句为例分析Impala的查询处理流程。如select
sum(id), count(id), avg(id) from customer_small& group by id; 以此语句生成的计划为:
FRAGMENT 0
& PARTITION: UNPARTITIONED
4:EXCHANGE
&&&& tuple ids: 1
FRAGMENT 1
& PARTITION: HASH_PARTITIONED: &slot 1&
STREAM DATA SINK
&&& EXCHANGE ID: 4
&&& UNPARTITIONED
3:AGGREGATE
& |& output: SUM(&slot 2&), SUM(&slot 3&)
& |& group by: &slot 1&
& |& tuple ids: 1
& 2:EXCHANGE
&&&& tuple ids: 1
FRAGMENT 2
& PARTITION: RANDOM
STREAM DATA SINK
&&& EXCHANGE ID: 2
&&& HASH_PARTITIONED: &slot 1&
1:AGGREGATE
& |& output: SUM(id), COUNT(id)
& |& group by: id
& |& tuple ids: 1
& 0:SCAN HDFS
&&&& table=default.customer_small #partitions=1 size=193B
&&&& tuple ids: 0
&&&&&&&&执行行计划树如图
4所示, 绿色的部分为可以分布式并行执行:
4. Impala相对于Hive所使用的优化技术
1、没有使用MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与MapReduce相比:Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。
2、使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。
3、充分利用可用的硬件指令(SSE4.2)。
4、更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时Impala支持直接数据块读取和本地代码计算checksum。
5、通过选择合适的数据存储格式可以得到最好的性能(Impala支持多种存储格式)。
6、最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。
5. Impala与Hive的异同
数据存储:使用相同的存储数据池都支持把数据存储于HDFS,
元数据:两者使用相同的元数据。
SQL解释处理:比较相似都是通过词法分析生成执行计划。
执行计划:
Hive: 依赖于MapReduce执行框架,执行计划分成map-&shuffle-&reduce-&map-&shuffle-&reduce…的模型。如果一个Query会被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的map-&reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
Impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
内存使用:
Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,当前版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用。Impala在多个阶段之间利用网络传输数据,在执行过程不会有写磁盘的操作(insert除外)。
Hive: 任务调度依赖于Hadoop的调度策略。
Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度吧。
Hive: 依赖于Hadoop的容错能力。
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败,再查一次就好了,再查一次的成本很低)。但从整体来看,Impala是能很好的容错,所有的Impalad是对等的结构,用户可以向任何一个Impalad提交查询,如果一个Impalad失效,其上正在运行的所有Query都将失败,但用户可以重新提交查询由其它Impalad代替执行,不会影响服务。对于State Store目前只有一个,但当State Store失效,也不会影响服务,每个Impalad都缓存了State
Store的信息,只是不能再更新集群状态,有可能会把执行任务分配给已经失效的Impalad执行,导致本次Query失败。
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。
6. Impala的优缺点
支持SQL查询,快速查询大数据。
可以对已有数据进行查询,减少数据的加载,转换。
多种存储格式可以选择(Parquet,
Text, Avro, RCFile, SequeenceFile)。
可以与Hive配合使用。
不支持用户定义函数UDF。
不支持text域的全文搜索。
不支持Transforms。
&不支持查询期的容错。
对内存要求高。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:424906次
积分:5643
积分:5643
排名:第3387名
原创:26篇
转载:583篇
评论:220条
(19)(44)(1)(1)(20)(12)(9)(1)(4)(15)(2)(12)(4)(2)(6)(5)(8)(104)(2)(4)(6)(2)(2)(2)(3)(17)(3)(17)(231)(13)(30)(11)hadoop(41)
1. Impala架构
&&&&&& Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。其架构如图
1所示,Impala主要由Impalad, State Store和CLI组成。
&&&&&&& Impalad: 与DataNode运行在同一节点上,由Impalad进程表示,它接收客户端的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。同时Impalad也与State
Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务。
&&&&&&& Impala State Store: 跟踪集群中的Impalad的健康状态及位置信息,由statestored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后(Impalad发现State Store处于离线时,会进入recovery模式,反复注册,当State
Store重新加入集群后,自动恢复正常,更新缓存数据)因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。
&&&&&&& CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口。
2. 与Hive的关系
&&&&&&& Impala与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。Impala与Hive在Hadoop中的关系如图 2所示。Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询,Impala给数据分析人员提供了快速实验、验证想法的大数据分析工具。可以先使用hive进行数据转换处理,之后使用Impala在Hive处理后的结果数据集上进行快速的数据分析。
3. Impala的查询处理过程
&&&&&&& Impalad分为Java前端与C++处理后端,接受客户端连接的Impalad即作为这次查询的Coordinator,Coordinator通过JNI调用Java前端对用户的查询SQL进行分析生成执行计划树,不同的操作对应不用的PlanNode, 如:SelectNode, ScanNode, SortNode, AggregationNode, HashJoinNode等等。
&&&&&&& 执行计划树的每个原子操作由一个PlanFragment表示,通常一条查询语句由多个Plan Fragment组成, Plan Fragment 0表示执行树的根,汇聚结果返回给用户,执行树的叶子结点一般是Scan操作,分布式并行执行。
&&&&&&& Java前端产生的执行计划树以Thrift数据格式返回给Impala C++后端(Coordinator)(执行计划分为多个阶段,每一个阶段叫做一个PlanFragment,每一个PlanFragment在执行时可以由多个Impalad实例并行执行(有些PlanFragment只能由一个Impalad实例执行,如聚合操作),整个执行计划为一执行计划树),由Coordinator根据执行计划,数据存储信息(Impala通过libhdfs与HDFS进行交互。通过hdfsGetHosts方法获得文件数据块所在节点的位置信息),通过调度器(现在只有simple-scheduler,
使用round-robin算法)Coordinator::Exec对生成的执行计划树分配给相应的后端执行器Impalad执行(查询会使用LLVM进行代码生成,编译,执行。对于使用LLVM如何提高性能有说明),通过调用GetNext()方法获取计算结果,如果是insert语句,则将计算结果通过libhdfs写回HDFS当所有输入数据被消耗光,执行结束,之后注销此次查询服务。
&&&&&&& Impala的查询处理流程大概如图3所示:
&&&&&&& 下面以一个SQL查询语句为例分析Impala的查询处理流程。如select sum(id), count(id), avg(id) from customer_small& group by id; 以此语句生成的计划为:
PLAN FRAGMENT 0
& PARTITION: UNPARTITIONED
& 4:EXCHANGE
&&&& tuple ids: 1
PLAN FRAGMENT 1
& PARTITION: HASH_PARTITIONED: &slot 1&
& STREAM DATA SINK
&&& EXCHANGE ID: 4
&&& UNPARTITIONED
& 3:AGGREGATE
& |& output: SUM(&slot 2&), SUM(&slot 3&)
& |& group by: &slot 1&
& |& tuple ids: 1
& 2:EXCHANGE
&&&& tuple ids: 1
PLAN FRAGMENT 2
& PARTITION: RANDOM
& STREAM DATA SINK
&&& EXCHANGE ID: 2
&&& HASH_PARTITIONED: &slot 1&
& 1:AGGREGATE
& |& output: SUM(id), COUNT(id)
& |& group by: id
& |& tuple ids: 1
& 0:SCAN HDFS
&&&& table=default.customer_small #partitions=1 size=193B
&&&& tuple ids: 0
&&&&&&& 执行行计划树如图 4所示, 绿色的部分为可以分布式并行执行:
4. Impala相对于Hive所使用的优化技术
1、没有使用MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与MapReduce相比:Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。
2、使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。
3、充分利用可用的硬件指令(SSE4.2)。
4、更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时Impala支持直接数据块读取和本地代码计算checksum。
5、通过选择合适的数据存储格式可以得到最好的性能(Impala支持多种存储格式)。
6、最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。
5. Impala与Hive的异同
数据存储:使用相同的存储数据池都支持把数据存储于HDFS, HBase。
元数据:两者使用相同的元数据。
SQL解释处理:比较相似都是通过词法分析生成执行计划。
执行计划:
Hive: 依赖于MapReduce执行框架,执行计划分成map-&shuffle-&reduce-&map-&shuffle-&reduce…的模型。如果一个Query会被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的map-&reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
Impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
内存使用:
Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,当前版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用。Impala在多个阶段之间利用网络传输数据,在执行过程不会有写磁盘的操作(insert除外)。
Hive: 任务调度依赖于Hadoop的调度策略。
Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度吧。
Hive: 依赖于Hadoop的容错能力。
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败,再查一次就好了,再查一次的成本很低)。但从整体来看,Impala是能很好的容错,所有的Impalad是对等的结构,用户可以向任何一个Impalad提交查询,如果一个Impalad失效,其上正在运行的所有Query都将失败,但用户可以重新提交查询由其它Impalad代替执行,不会影响服务。对于State Store目前只有一个,但当State Store失效,也不会影响服务,每个Impalad都缓存了State
Store的信息,只是不能再更新集群状态,有可能会把执行任务分配给已经失效的Impalad执行,导致本次Query失败。
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。
6. Impala的优缺点
支持SQL查询,快速查询大数据。可以对已有数据进行查询,减少数据的加载,转换。多种存储格式可以选择(Parquet, Text, Avro, RCFile, SequeenceFile)。可以与Hive配合使用。
不支持用户定义函数UDF。不支持text域的全文搜索。不支持Transforms。&不支持查询期的容错。对内存要求高。
原文出自:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:117047次
积分:2242
积分:2242
排名:第12925名
原创:105篇
转载:36篇
评论:23条
(1)(1)(1)(4)(2)(1)(1)(2)(2)(3)(3)(2)(1)(5)(6)(5)(6)(3)(5)(5)(13)(2)(6)(7)(7)(7)(3)(4)(11)(6)(4)(1)(7)(1)(2)(2)首先我是使用cloudera-manager安装的CDH5.4.1
之后我运行了hive ,hbase shell,impala-shell都是好用的。
接下来我试试用JAVA去访问hive ,impala服务
首先是java链接impala
但是要注意的是,你工程里要有hive的JDBC驱动,我把服务器的这个路径下hive开头的所有包都放到工程里了
/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/jars
接下来是JAVA链接IMPALA的代码
import java.sql.C
import java.sql.DriverM
import java.sql.ResultS
import java.sql.SQLE
import java.sql.S
public class ClouderaImpalaJdbcExample {
// here is an example query based on one of the Hue Beeswax sample tables
private static final String SQL_STATEMENT = &SELECT * FROM hbase_table_1&;
// set the impalad host
private static final String IMPALAD_HOST = &10.10.92.151&;
// port 21050 is the default impalad JDBC port
private static final String IMPALAD_JDBC_PORT = &21050&;
private static final String CONNECTION_URL = &jdbc:hive2://& + IMPALAD_HOST + ':' + IMPALAD_JDBC_PORT + &/;auth=noSasl&;
private static final String JDBC_DRIVER_NAME = &org.apache.hive.jdbc.HiveDriver&;
public static void main(String[] args) {
System.out.println(&\n=============================================&);
System.out.println(&Cloudera Impala JDBC Example&);
System.out.println(&Using Connection URL: & + CONNECTION_URL);
System.out.println(&Running Query: & + SQL_STATEMENT);
Connection con =
Class.forName(JDBC_DRIVER_NAME);
con = DriverManager.getConnection(CONNECTION_URL);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(SQL_STATEMENT);
System.out.println(&\n== Begin Query Results ======================&);
// print the results to the console
while (rs.next()) {
// the example query returns one String column
System.out.print(rs.getString(&key&)+&:&);
System.out.println(rs.getString(&value&));
System.out.println(&== End Query Results =======================\n\n&);
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
con.close();
} catch (Exception e) {
// swallow
网上搜的,换成我自己的服务器IP后是可用的
但是我发现他的链接是jdbc:hive2开头的,这让我产生了疑问,我到底连的是hive还是impala?
然后我在网上搜索java链接hive的程序,发现
网上大多使用了org.apache.hadoop.hive.jdbc.HiveDriver而上边我们使用的是org.apache.hive.jdbc.HiveDriver
这2个类名一样,但是包不一样,我一开始认为这就是连hive跟impala的区别?
最后我发现其实不是org.apache.hadoop.hive.jdbc.HiveDriver应该是hadoop1.X的类。而到了hadoop2.X里好像已经换成org.apache.hive.jdbc.HiveDriver了
于是我又搜了一下最近的链接hive的代码发现确实使用的是org.apache.hive.jdbc.HiveDriver
接下来是代码
import java.sql.SQLE
import java.sql.C
import java.sql.ResultS
import java.sql.S
import java.sql.DriverM
* 测试hive 的客户端连接
* @author alexxiyang (/alexxiyang)
public class HiveJdbcCli {
* 注意:hive-server2 引用的driver是
org.apache.hive.* 而 hive-server 是 org.apache.hadoop.hive.*
private static String driverName = &org.apache.hive.jdbc.HiveDriver&;
* @param args
* @throws SQLException
public static void main(String[] args) throws SQLException {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
//hive的默认端口是 10000,如果要修改就修改 hive-site.xml 文件的hive.server2.thrift.port 属性值
//默认用户名hive,默认密码为空
Connection con = DriverManager.getConnection(&jdbc:hive2://10.10.92.151:10000/default&, &hive&, &&);
Statement stmt = con.createStatement();
//测试的表名 testhivedrivertable
String tableName = &ccc&;
//如果已经存在就删除
stmt.execute(&drop table if exists & + tableName);
//创建这张表
stmt.execute(&create table & + tableName + & (key int, value string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'&);
//看下创建是否成功
String sql = &show tables '& + tableName + &'&;
System.out.println(&Running: & + sql);
ResultSet res = stmt.executeQuery(sql);
if (res.next()) {
System.out.println(res.getString(1));
//看下表结构
sql = &describe & + tableN
System.out.println(&Running: & + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1) + &\t& + res.getString(2));
// 加载数据到表里面
// NOTE: filepath 是本地文件所在的位置,注意这个本地不是你的电脑!
// 你得先把这个文件上传到服务器,然后这里的路径是服务器上这个文件的路径
// NOTE: /data/a.txt
String filepath = &/data/a.txt&;
sql = &load data local inpath '& + filepath + &' into table & + tableN
System.out.println(&Running: & + sql);
stmt.execute(sql);
// select * query
String sql = &select * from & + tableN
System.out.println(&Running: & + sql);
ResultSet res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(String.valueOf(res.getInt(1)) + &\t& + res.getString(2));
我只测试了查询,这里也是好用的,那么区别就来了
两个链接都是jdbc:hive2开头的,区别就在于服务的端口,
我进入cloudera-manager的管理页面里,点击hive查看配置发现我链接hive的服务端口配置为
HiveServer2 端口
hive.server2.thrift.port 值是10000
那么可以得出结论JDBD链接hive其实是访问的hive的thrift服务,端口为10000
而Impala链接的是
Impala Daemon HiveServer2 端口
hs2_port 值为21050
其他基本都差不多,以上是我在学习的时候一点点总结
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7644次
排名:千里之外
原创:15篇
(1)(1)(1)(1)(1)(3)(6)(1)(1)}

我要回帖

更多关于 hive和impala 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信