您的位置:首页 > 其它

Hive简述及几种访问方式

2015-07-13 16:26 176 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: