一、查看需求
安装java 1.6及hadoop 0.20.x
二、安装hive
tar -xf hive-x.y.z.tar.gz(本次安装为hive-0.8.1.tar.gz)
将解压后的hive-0.8.1文件放在系统的/home/hadooptest/中。
在/etc/profile中添加:
export HIVE_HOME=/home/hadooptest/hive-0.8.1
export PATH=$HIVE_HOME/bin:$PATH
修改hive-0.8.1目录下/conf/hive-env.sh.template中的HADOOP_HOME为实际的Hadoop安装目录:/home/hadooptest/hadoop-0.20.205.0。
在HDFS中创建/tmp和/user/hive/warehouse并设置权限:
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
将conf/
hive-default.xml.template复制两份,分别命名为
hive-default.xml(
用于保留默认配置
)和
hive-site.xml(
用于个性化配置,可覆盖默认配置
)
启动hive:
$
$HIVE_HOME/bin/hive
hive> show tables;
OK
Time taken: 3.496 seconds
执行成功。
(可根据https://cwiki.apache.org/confluence/display/Hive/GettingStarted中的指引使用hive自带的数据来建表进行测试)
依据https://cwiki.apache.org/confluence/display/Hive/GettingStarted中的方法建表并进行查询,使用select * from pokes查询成功,但只查询表中某一项时却报错(若查询成功说明你的mapreduce没有问题,可跳过下列的报错分析):
hive> select foo from pokes;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
java.net.ConnectException: Call to namenode/192.168.1.112:8021 failed on connection exception: java.net.ConnectException: Connection refused
......
mapreduce无法执行。于是,退出hive,执行jps查看java进程,发现jobtracker进程挂了。
于是重启hadoop(由于这个hadoop的配置还有些问题,datanode丢失block的比例达到阈值,系统会一直处于安全模式,所以想在HDFS中进行写入或擦除时,必须先执行
hadoop dfsadmin -safemode leave来关闭安全模式
),执行jps发现所有hadoop进程都正常运行,但是执行关闭安全模式命令后,jobtracker和tasktracker进程便挂了,所以mapreduce无法运行。
执行mapreduce程序时提示无法连接namenode:
INFO ipc.Client: Retrying connect to server: namenode/192.168.1.102:8021. Already tried 0 time(s).
INFO ipc.Client: Retrying connect to server: namenode/192.168.1.102:8021. Already tried 1 time(s).
......
查看
hadoop-hadooptest-jobtracker-tigerchan-VirtualBox.log日志文件,发现错误为:
2012-03-04 21:43:47,919 INFO org.apache.hadoop.mapred.CapacityTaskScheduler: Initializing 'default' queue with cap=100.0, maxCap=-1.0, ulMin=100, ulMinFactor=1.0, supportsPriorities=false, maxJobsToInit=3000, maxJobsToAccept=30000, maxActiveTasks=200000, maxJobsPerUserToInit=3000, maxJobsPerUserToAccept=30000, maxActiveTasksPerUser=100000
2012-03-04 21:43:47,921 FATAL org.apache.hadoop.mapred.JobTracker: java.io.IOException: Queue 'slow' doesn't have configured capacity!
at org.apache.hadoop.mapred.CapacityTaskScheduler.parseQueues(CapacityTaskScheduler.java:906)
at org.apache.hadoop.mapred.CapacityTaskScheduler.start(CapacityTaskScheduler.java:823)
at org.apache.hadoop.mapred.JobTracker.offerService(JobTracker.java:2581)
at org.apache.hadoop.mapred.JobTracker.main(JobTracker.java:4979)
2012-03-04 21:43:47,922 INFO org.apache.hadoop.mapred.JobTracker: SHUTDOWN_MSG:
由此可知,队列slow没有配置容量!!哦,原来是之前我把mapred-site.xml文件中的mapred.queue.names设置为default,slow,fast,却忘记配置slow和fast队列。故,把mapred.queue.names设置为default,或者保留slow,fast,然后正确配置队列即可。重启hadoop便正常运行。上述的查询问题也得以解决。
这个问题可能不是很普遍,可能其他人会遇到其他问题。所以,在使用hive时,一定要先保证hadoop正常运行。若出现问题,则第一时间查看日志分析错误,没法找出错误再上网查找解决方法。此次出现错误,我第一时间上网查找方法,但“无法连接namenode”这样简单的错误会搜索到很多解决方法,但大家遇到的问题都不一样,问题一直没有解决。后来才想起去查看日志,一眼便看出问题。因此,一定要养成出错先看日志的习惯。
三、安装mysql
但是这样安装的元数据保持在内嵌的数据库Derby中,只能允许一个会话连接,如果要支持多用户多会话,则需要一个独立的元数据库,目前比较流行的是使用MySQL,下面进行配置。
1)安装MySQL服务器并启动MySQL服务
2)为Hive建立相应的MySQL帐号,并赋予足够的权限
①进入root:mysql -uroot -p;
②创建hive数据库:create database hive;
③创建用户hive,它只能从localhost连接到数据库并可以连接到wordpress数据库:grant all on hive.* to hive@localhost identified by '123456'。
3)在Hive的conf目录下修改配置文件hive-site.xml,配置文件修改如下
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost: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>123456</value>
<description>password to use against metastore database</description>
</property>
4)把MySQL的JDBC驱动包(我使用的是mysql-connector-java-5.0.8-bin.jar,从http://downloads.mysql.com/archives/mysql-connector-java-5.0/mysql-connector-java-5.0.8.tar.gz下载并解压后可以找到)复制到Hive的lib目录下。
5)启动Hive shell,执行
show tables;
如果不报错,表明基于独立元数据库的Hive已经安装成功了。
查看一下元数据的效果。
在Hive上建立数据表:
CREATE TABLE my(id INT,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
show tables;
select name from my;
然后我们以刚刚建立的hive帐号登录MySQL查看元数据信息。
mysql> use hive
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
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 |
+-----------------+
13 rows in set (0.00 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 | 1319445990 | 1 | 0 | hadoop | 0 | 1 | my | MANAGED_TABLE | NULL | NULL |
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
1 row in set (0.00 sec)
在TBLS中可以看到Hive表的元数据。
参考:
https://cwiki.apache.org/confluence/display/Hive/GettingStarted
http://wadefall.iteye.com/blog/1204286
http://blog.csdn.net/lengzijian/article/details/7042280