1.hive-site.xml的配置
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1: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>hadoop</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hadoop</value>
</property>
<property>
<name>javme>datanucleus.readOnlyDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive-${user.name}</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/tmp/${user.name}</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive/resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/tmp/${user.name}</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/tmp/${user.name}/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
</configuration>
2.hive-env.sh配置
export HADOOP_HOME=/Users/soft/hadoop/hadoop-2.7.1
export HIVE_CONF_DIR=/Users/soft/hive/apache-hive-2.1.0-bin/conf
export HIVE_AUX_JARS_PATH=/Users/soft/hive/apache-hive-2.1.0-bin/hive_lib
export HIVE_HOME=/Users/soft/hive/apache-hive-2.1.0-bin
3.hive全局变量的配置
在profile文件中export HIVE_HOME等环境变量
4.从 Hive 2.1 版本开始, 我们需要先运行 schematool 命令来执行初始化操作。
schematool -dbType mysql -initSchema
二 Hive的基本使用
1.多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;
其实只有一个reduce任务的情况,除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外,还有以下原因:
a) 没有group by的汇总,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’ group by pt; 写成 select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’;这点非常常见,希望大家尽量改写。
b) 用了Order by(全局排序)
c) 有笛卡尔积
通常这些情况下,除了找办法来变通和避免,我暂时没有什么好的办法,因为这些操作都是全局的,所以hadoop不得不用一个reduce去完成;同样的,在设置reduce个数的时候也需要考虑这两个原则:使大数据量利用合适的reduce数;使单个reduce任务处理合适的数据量;
2.hive reduce个数设置
- set mapred.reduce.tasks = 3;手动设置默认参数;
- set hive.exec.reducers.bytes.per.reducer=50000000; (50M)参数的值;
3.hive SQL基本使用
CREATE TABLE phone_info(id int,name String,storage String,price double)
ROW FORMAT DELIMITED //代表一行是一条记录
FIELDS TERMINATED BY '\t'//列是按照table键分开
STORED AS TEXTFILE[SEQUENCEFILE];//二种最常见的存储格式,一般可以不写
**RCFile格式的table不能直接load数据,只能通过 数据复制的形式转下**
- INSERT OVERWRITE phoen_info_like SELECT * FROM phone_info;//into是追加数据,overwrite是覆盖以及存在的数据,属于重复性校验
4.Hive集中排序
- order by 会对输入做全局排序,因此只有一个reducer
- sort by不是全局排序,其在数据进入reducer前完成排序.因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sort by只保证每个reducer的输出有序,不保证全局有序。1
-
- 按照指定的字段对数据进行划分到不同的输出reduce /文件中