Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符 (”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
1,安装Hive
解压下载好的apache-hive-1.2.1-bin.tar.gz安装包到 /opt/apache-hive-1.2.1目录下 tar -zxvf apache-hive-1.2.1-bin.tar.gz /opt/apache-hive-1.2.12,配置环境变量
export HIVE_HOME=/opt/apache-hive-1.2.1 export PATH=$HIVE_HOME/bin:$PATH3,三种方式的搭建(配置文件的不同) ①Derby方式 修改hive-site.xml 配置文件,修改如下
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>启动hive
./hive注意:将hive/lib目录下的jline jar包拷贝到hadoop的yarn lib下
这种模式的弊端 使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误
[html] view plaincopyprint? hive> show tables; FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details. NestedThrowables: java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask hive> show tables; FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details. NestedThrowables: java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask②Local(mysql)方式
这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将 mysql的jar包拷贝到$HIVE_HOME/lib目录下)。 即是hive和mysql都配置在客户端修改hive-site.xml,配置如下
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive_meta/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.23.129/hive_remote?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> </configuration>注意一个坑: 权限,虽然hive用户对hive_meta数据库是由操作权限的,但是这个数据库如果不存在,hive用户也是没有权限创建这个数据库,所以需要提前创建好hive_remote数据库
安装mysql
Yum install mysql-server -y 修改mysql权限: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION; flush privileges; 删除多余会对权限造成影响的数据 刷新权限 添加用户: CREATE USER 'hive'@'%' IDENTIFIED BY '123'; 授权用户: grant all privileges on hive_meta.* to hive@"%" identified by '123'; flush privileges; 设置开机启动 chkconfig mysqld on注意每次修改后要刷新权限,否则不起作用
配置过程中出现的错误
[ERROR] Terminal initialization failed; falling back to unsupported java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected at jline.TerminalFactory.create(TerminalFactory.java:101)错误的原因: Hadoop jline版本和hive的jline不一致
③多用户模式
将hive-site.xml配置文件拆为如下两部分
服务端配置文件
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> </configuration>客户端配置文件
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>false</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.57.5:9083</value> </property> </configuration>启动hive服务端程序
hive --service metastore 或者,上面的那条语句执行比较慢,可以采用下面的让他在后台启动 ./hive --service metastore >> meta.log 2>&1 &