Hive简述及几种访问方式
2015-07-13 16:26
351 查看
what is hive?
Hive 是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据的提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类SQL查询语言,称为 HQL,它允许熟悉SQL的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。Hive在hadoop生态圈中属于数据仓库的角色。他能够管理**hadoop中的数据,同时可以查询**hadoop中的数据。
优点与缺点
成本低,入手较快。可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReuduce应用。
不支持实时查询。
Hive系统架构
元数据存储:通常是存储在关系数据库中,如mysql, derby 。 Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
驱动:解释器、编译器、优化器、执行器
查询编译器:
执行引擎:
服务器:
客户端组件:
可扩展接口部分:
Hive元数据存储
Derby(内嵌derby,默认)单session
在启动终端日录创建元数据文件
不能多用户共享
MySQL
安装MySQL,配置账户,权限
mysql-connector-java-5.1.22-bin.jar拷贝至hive安装目录lib目录下面
修改hive-site.xml
Hive Client访问方式
1、Cli命令行[root@hadoop1 ~]# hive
2、Hwi
[root@hadoop1 ~]# hive --service hwi http://localhost:9999/hwi[/code]
3、HiveServer启动hiveserver [root@hadoop1 ~]# hive --service hiveserver 如果出现org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000. 解决方法:端口被占用,kill该端口进程或者重新制定端口hive --service hiveserver -p 10001 通过Hive-jdbc方式访问。 private static String HiveDriver="org.apache.hadoop.hive.jdbc.HiveDriver"; private static String url="jdbc:hive://hadoop1:10001/default"; private static String name=""; private static String password=""; Class.forName(HiveDriver); Connection conn = DriverManager.getConnection(url,name,password); Statement stat=conn.createStatement(); String sql="show tables"; ResultSet rs = stat.executeQuery(sql);
Demo:package example; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class HiveJDBC { private static String HiveDriver="org.apache.hadoop.hive.jdbc.HiveDriver"; private static String url="jdbc:hive://hadoop1:10001/default"; private static String name=""; private static String password=""; public static void main(String[] args) { try { Class.forName(HiveDriver); Connection conn = DriverManager.getConnection(url,name,password); Statement stat=conn.createStatement(); String sql="show tables"; String sqlString = "select * from addressall_2015_07_09"; ResultSet rs = stat.executeQuery(sqlString); while(rs.next()){ //hive是从1开始的 //System.out.println(rs.getString(1)); System.out.println(rs.getString(1)+" "+rs.getInt(2)+" "+rs.getInt(3)+" "+rs.getInt(4)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
运行结果:2015_07_09 536 488 493
相关文章推荐
- 修改oracle服务器端字符集
- 闪回查询(SELECT AS OF)
- 【C#】判断文件是否正在被其他进程占用
- 用了 CSDN 的 markdown 编辑器吐槽下~~
- 视频监控系统:C/S & B/S
- 深入理解Windows Phone 8.1 UI控件编程
- 解析XML三种方式(PULL、SAX、DOM)
- 条码扫描二维码扫描——ZXing android 源码简化
- DisplayIndex属性设置错乱的解决方案
- android 的unregisterReceiver报错处理 提示“Receiver not registered”
- GIT界的神探--bisect
- CentOS 6图形界面自定义开启终端快捷键
- truncate table
- Android网络编程之Http请求服务器数据(GET方式)
- genymotion报出unable to connect to virtual device的解决方法
- 1139_My Summary
- Android PullToRefresh 实战(ListView)
- Less
- 实现数字转换RMB大写~
- static类型指针使用中的问题(AVPicture 类型内存释放)