hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive定义
Hive[1] 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。
把hive-0.8.1.tar.gz 放到当前的用户目录下。
解压hive-0.8.1.tar.gz 包 ,tar -vxzf hive-0.8.1.tar.gz
进入 hive-0.8.1 目录 cd hive-0.8.1
进入conf 目录下 复制 并修改 hive-site.xml cp hive-default.xml.template hive-site.xml
修改hive-site.xml 配置,使用mysql 做为 hive的存储元数据的物理位置。
sudo gedit hive-site.xml
主要配置如下:
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.46.1:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> <description>password to use against metastore database</description> </property> <!-- 这是一个默认的存放目录--> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> <description>location of default database for the warehouse</description> </property>这些配置很简单,一个是数据路径,一个是数据库驱动,用户名和密码。
注:由于在linux下安装mysql 出了问题,所以数据库的路径可以是连到另外的一台windows 下的mysql.
保存 hive-site.xml
source hive-site.xml
把hive-0.8.1 的安装目录配置到系统中。
sudo gedit /etc/profile
export HIVE_HOME=/home/liucheng/hive-0.8.1
同时要配置到 path 中。
source /etc/profile
这样初步配置完了hive。
第二步:我们给hive 配置用户。使用root 登陆mysql
create user 'hive'@'%' identified by 'hive'; //添加hive 用户名 密码也为hive
grant all privileges on *.* to 'hive'@'%' with grant option; //赋予权限
flush privileges;// 强制写出
接下来就可以使用 hive 登陆mysql了 图h00001.jpg
第三步:到linux命令下启动hive
cd hive-0.8.1
./bin/hive
就启动了hive
重新启动是 ./bin/hive restart
查看 hive 用户下的mysql ,会新建一个库为hive.同时,有几个表。
创建一个示例表。
hive> CREATE TABLE baobei_info ( > id INT, > owner_id INT);会报一个异常。
hive> CREATE TABLE baobei_info ( > id INT, > owner_id INT); FAILED: Error in metadata: javax.jdo.JDODataStoreException: An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes at sun.reflect.GeneratedConstructorAccessor24.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381)....
这个是hive 对mysql 的utf8 编码有问题 ,mysql 的默认字符集是utf8 不是 UTF-8.
alter database hive character set latin1;然后,再创建一次就可以了,如图:
看一下,创建后的表在mysql 数据库中。
多了几个表,那么哪几个表是存储我新建的表内容呢。
看一下,这个表在 /user/hive/warehouse
注:存储hive 的hdfs 的目录 具体目录是hdfs://localhost:9000/user/hive/warehouse/
当我们要查看hive目录下的文件只能是上述的命令,因为 user目录下hive 与 当前用户(soliucheng)是同一级目录,可以到50070端口下查看这个文件夹。
当使用./bin/hadoop fs -ls 只能查看到soliucheng 下的hdfs 文件夹。