HIVE Leaning


http://hadoop.apache.org/hive/
把这里里面的东西看好,你也能成为半个hive的高手。
Hive体系结构的目的就是:low-latency(低延迟),batch-oriented(基于批处理的)

It began its life at Facebook processing large amount of user and log data. 
哈哈,Hive之所以能火起来,就是因为牛逼企业使用了并提高了效率或者较小了成本。
Hive能火,就是因为FaceBook使用他的原因。

需要注意的是,我们可以使用JDBC于Hive建立链接。
Hive的搭建需要jdk1.6及以上和Hadoop0.17及以上。
只有安装好Hadoop并且启动了,Hive才能正常运行。 
此外,必须开启Mysql等数据库服务,Hive才能正常运行。
Hive将“元数据”存储在一个标准的关系型数据库当中。
与Hive一并打包发布的还包括一个Derby的数据库。Derby是在客户端安装和运行的。
当你想要不同的用户使用相同的元数据的时候,那么请你设定你的模式为multi-user。

Cannot find hadoop installation: $HADOOP_HOME must be set or hadoop must be in the path
FIX by modified the profile file:
[root@master bell]# vim /etc/profile
export HADOOP_HOME=/home/bell/software/hadoop-0.20.2
export PATH=/home/bell/software/hadoop-0.20.2/hive-0.7.1/bin:$PATH




hive-site.xml                    使用Hive会涉及到数据库的操作,所以必须要对数据库的链接进行相应的配置
主要包括:
hive.metastore.local

javax.jdo.option.ConnectionURL
javax.jdo.option.ConnectionDriverName

javax.jdo.option.ConnectionUserName
javax.jdo.option.ConnectionPassword

这五个信息是一般都要进行配置的

///
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="http://mazd1002.blog.163.com/blog/configuration.xsl"?>
<configuration>
 <property>
      <name>hive.metastore.local</name>
      <value>true</value>
  </property>

  <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://localhost/metastore_db?characterEncoding=UTF-8</value>
  </property>

  <property>
      <name>javax.jdo.option.ConnectionDriverName</name>
      <value>com.mysql.jdbc.Driver</value>
  </property>

  <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>buaa</value>
  </property>

  <property>
       <name>javax.jdo.option.ConnectionPassword</name>
       <value>qwe123</value>
       <description>password to use against metastore database</description>
  </property>
</configuration>
/

jpox.properties必须包括如下的一些基本配置信息:
/
javax.jdo.option.ConnectionDriverName=com.mysql.jdbc.Driver
javax.jdo.option.ConnectionURL=jdbc:mysql://localhost/metastore_db
javax.jdo.option.ConnectionUserName=buaa
javax.jdo.option.ConnectionPassword=qwe123
/


mysql
/
GRANT ALL PRIVALEGES ON metastore_db.*(数据库) to 'bell'@'localhost'(用户名) identified by '123456'(密码);
/


/etc/profile
/
export HADOOP_HOME=/home/bell/software/hadoop-0.20.2
export PATH=/home/bell/software/hadoop-0.20.2/hive-0.7.1/bin:$PATH
/


Hive Build-in aggregate functions
https://cwiki.apache.org/Hive/languagemanual-udf.html





hive> SELECT * FROM cite LIMIT 10;
OK
NULL    NULL
3858241 956203
3858241 1324234
3858241 3398406
3858241 3557384
3858241 3634889
3858242 1515701
3858242 3319261
3858242 3668705
3858242 3707004hive> 
Time taken: 0.17 seconds
//这个传统意义上的sql查询有什么区别?难道仅仅是效率高了?我没有看到Hive有什么过人之处阿。看下面:
 map = 0%, reduce =0%
 map = 12%, reduce =0%
 map = 25%, reduce =0%
 map = 30%, reduce =0%
 map = 34%, reduce =0%
 map = 43%, reduce =0%
 map = 53%, reduce =0%
 map = 62%, reduce =0%
 map = 71%, reduce =0%
 map = 75%, reduce =0%
 map = 79%, reduce =0%
 map = 88%, reduce =0%
 map = 97%, reduce =0%
 map = 99%, reduce =0%
 map = 100%, reduce =0%
 map = 100%, reduce =67%
 map = 100%, reduce =100%
Ended Job = job_200908250716_0001
OK
16522439
Time taken: 85.153 seconds
Hive调用Hadoop进行分布式计算,处理这么大的数据,仅仅花费了85.153秒的时间。
最重要的是:Hive的使用者跟不需要知道Hadoop是怎么工作的……很神奇的一件事情,他只需要按照类似SQL的方法来写就行。

hive> SELECT COUNT(1) FROM cite;


Relational databases use indexes on columns to speed up queries on those columns.
Hive, instead, uses a concept of partition columns, which are columns whose values
would divide the table into separate partitions. 
传统关系型数据库通过在列上加索引来提高查询的效率。Hive却不是这样。Hive使用"分区列 (partition columns)"的概念来提高检索效率。
分区列(partition columns):指的是一个表中那些可以将这个表进行拆分的列。
example, a state column would partition a table into 50 partitions, one for each state.
/user/hive/warehouse/users/date=20090901/state=CA
/user/hive/warehouse/users/date=20090901/state=NY
/user/hive/warehouse/users/date=20090901/state=TX
...
/user/hive/warehouse/users/date=20090902/state=CA
/user/hive/warehouse/users/date=20090902/state=NY
/user/hive/warehouse/users/date=20090902/state=TX
This is because Hive physically stores different partitions in different directories. (Hive存储数据的特点)
设计思想:Hive will still avoid a full scan of all data in a table.
Hive总是想办法避免进行数据的全扫描。

除了patition columns的概念外,Hive还有一个很重要的概念就是:buckets
buckets提供了一个高效查询方法,他在随机数据样本方面效果明显。
 Bucketing divides data into a specified number of files based on the hash of the bucket column. If we specify 32 buckets based on user id in our users table, the full file structure for our table in Hive will look like /user/hive/warehouse/users/date=20090901/state=CA/part-00000
...
/user/hive/warehouse/users/date=20090901/state=CA/part-00031
/user/hive/warehouse/users/date=20090901/state=NY/part-00000
...
/user/hive/warehouse/users/date=20090901/state=NY/part-00031
/user/hive/warehouse/users/date=20090901/state=TX/part-00000
...
//
哈哈,聪明的人都应该反应过来,这样一划分,我们的检索仅仅需要对其中的某个part-000***进行操作,查询数据量肯定是下降的,那么检索的效率肯定是上升的。Hive的高明(核心)之处就是将海量数据大数据进行合理的划分、拆分,从而减小检索的范围,提高检索的效率。
 Hive can run a query on 1/32 of all the users in a partition by using only the data in part-00000, without having to even read the other files. 
从以上的运行数据可以看出,执行一个查询只需要对数据的1/32进行查询,根本不需要读取其他文件。

那么现在就有个问题,buckets的数量设置为多少比较合适呢?
看下面:
/user/hive/warehouse/users/date=20090901/state=NY/part-00000: 为一个sample
通常我们sample的大小为user base的3%。
我目前还不知道这样的数据是如何得出来的,但有一点可以肯定,sample的大小既不能太大(不方便用户从sample中检索),同时也不能太小(不方便Hadoop进行运算),必须取一个大小对双方都比较合适的数值。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值