hive安装
(1)tar -zxf hive-0.7.1-bin.tar.gz
(2)mv hive-0.7.1-bin /usr/local/hive
(3)vim hive-config.sh
export HADOOP_HOME=/usr/local/hadoop/hadoop-0.20.204.0/
export JAVA_HOME=/usr/java/jdk1.6.0_27
export HIVE_HOME=/usr/local/hive
(4)cd /usr/local/hadoop/hadoop-0.20.204.0
(5)bin/hadoop fs -mkdir /tmp
(6)bin/hadoop fs -mkdir /user/hive/warehouse
(7)bin/hadoop fs -chmod g+w /tmp
(8)bin/hadoop fs -chmod g+w /user/hive/warehouse
(9)vim /etc/profile
#hive home
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
(10)source /etc/profile
(11)检查echo $HIVE_HOME
(12)修改core文件
cd /usr/local/hadoop/hadoop-0.20.204.0/conf
vim core-site.xml
<name>fs.default.name</name>
<value>hdfs://master:9060</value>
hive使用mysql保存metastore .
Hive 将元数据存储在 RDBMS 中,有三种模式可以连接到数据库:
1)ingle User Mode: 此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test。
2)Multi User Mode:通过网络连接到一个数据库中,是最经常使用到的模式。
3)Remote Server Mode:用于非 Java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer,客户端利用 Thrift 协议通过 MetaStoreServer 访问元数据库。
Hive默认是采用Derby来存储其Meta信息的,
现在我们需要修改为mysql
(13)安装mysql
tar -zxf mysql-5.1.51-linux-i686-glibc23.tar.gz
mv /mysql-5.1.51-linux-i686-glibc23 /usr/local/mysql
cp /usr/loacal/mysql/support-files/my-large.cnf /etc/my.cnf
groupadd mysql
useradd mysql -g mysql
chown -R root.mysql /usr/local/mysql
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql
vim /etc/my.cnf 找到log-bin=mysql-bin这一行,将其注释:
#log-bin=mysql-bin
#binlog_format=mixed
在client下加入
default-character-set=utf8
在mysqld下加入
default-character-set=utf8
key_buffer_size = 256M
max_allowed_packet = 64M
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
启动mysql: service mysql start
设置本地登录密码mysqladmin -u root password 123456
进入数据库 /usr/local/mysql/bin/mysql -uroot -p
远程登录权限设置grant all privileges on *.* to root@"%" identified by '123456' with grant option;
grant all privileges on *.* to root@"master" identified by '123456' with grant option;
create database hive
(14)把一个jar包mysql-connector-java-5.1.15-bin.jar拷贝到hive的lib目录下
连接数据库
主要配置项如下:
hive.metastore.warehouse.dir:(HDFS上的)数据目录 (即/user/hive/warehouse)
hive.exec.scratchdir:(HDFS上的)临时文件目录 (即/tmp)
连接数据库配置
默认meta数据库为derby ,为了避免使用默认的Derby数据库(有并发访问和性能的问题),通常还需要配置元数据库为MySQL,(mysql的安装过程这里就省了哈),修改hive-site.xml配置以下参数:
javax.jdo.option.ConnectionURL:元数据连接字串
javax.jdo.option.ConnectionDriverName:DB连接引擎,MySQL为com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName:DB连接用户名
javax.jdo.option.ConnectionPassword:DB连接密码
(1)cp hive-default.xml hive-site.xml
示例
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?useUnicode=true&characterEncoding=UTF-8&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>root</value>
<description>username to use against metastore database</description>
</property>
###################
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
***另外有一个需要注意的地方是
需要把一个jar包mysql-connector-java-5.1.15-bin.jar拷贝到hive的lib目录下才行,否则执行语句的时候会报错,类似下面这样
hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
NestedThrowables:
java.lang.reflect.InvocationTargetException
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
测试
hive> CREATE TABLE tt(id int,name string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ',' ########与后面load文件数据格式有关
> STORED AS TEXTFILE;
#####可以指定将表创建到外部hdfs文件系统中。
CREATE EXTERNAL TABLE foo(id INT)
STORED AS TEXTFILE LOCALTION '/user/foo/foo_data';
hive> show tables;
OK
tt
***************************在hive中查询插入的表
进入mysql***************************************在mysql中查询刚插入的表tt
/usr/local/mysql/bin/mysql -uroot -p
mysql> use hive
mysql> show tables;
-----------------+
| Tables_in_hive |
+-----------------+
| BUCKETING_COLS |
| COLUMNS |
| DATABASE_PARAMS |
| DBS |
| PARTITION_KEYS |
| SDS |
| SD_PARAMS |
| SEQUENCE_TABLE |
| SERDES |
| SERDE_PARAMS |
| SORT_COLS |
| TABLE_PARAMS |
| TBLS |
| federal_address |
+-----------------+
14 rows in set (0.02 sec)
mysql> select * from TBLS;
+--------+-------------+-------+------------------+-------+-----------+-------+----------+---------------+--------------------+--------------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | RETENTION | SD_ID | TBL_NAME | TBL_TYPE | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT |
+--------+-------------+-------+------------------+-------+-----------+-------+----------+---------------+--------------------+--------------------+
| 1 | 1320808723 | 1 | 0 | root | 0 | 1 | tt | MANAGED_TABLE | NULL | NULL |
+--------+-------------+-------+------------------+-------+-----------+-------+----------+---------------+--------------------+--------------------+
1 row in set (0.00 sec)
插入数据
LOAD DATA [LOCAL] INPATH '/data/userdata' [OVERWRITE] INTO TABLE user;
使用LOCAL选项将使用本地文件系统 ,否则将使用hdfs文件系统。使用OVERWRITE选项将删除原来table中的数据,否则将新数据添加到文件末尾。
########Load data导入数据将仅仅将文件拷贝到hive管理的目录下,并用table的元数据去解释这个文件。所以必须保证数据文件的结构必须和table的结构一致,
否则可以load data成功但是数据解释不正确。特别注意fields分隔符和lines分隔符要和Table一致。id int,name string。。哈哈格式是
1,'la'
2,'yu'
3,'ji'
#########查询语句。 这里列出一些和标准SQL不同的地方。
不能使用select count(*);需要指定count的列下标,select count(1) 。
不能使用CREATE TABLE newtable SELECT * FROM user;必须事先Create table,再用INSERT向其中写入数据。
排序关键字是SORT BY。
LIMIT关键字只能跟一个数字,即从第一条记录开始选出若干条。
INSERT语句变换很大,不能直接插入一条记录。插入的数据必须用SELECT子查询获取或者从某个文件导入
附录:出现下列错误
hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Access denied for user 'root'@'master' (using password: YES)
NestedThrowables:
java.sql.SQLException: Access denied for user 'root'@'master' (using password: YES)
可能是用户名密码错误
进行下面操作查询用户密码
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
mysql> use mysql
mysql> select host,user,password from user;
果然如此。然后进行赋权