PeersLee 发表于 2016-3-26 12:46:54

Hadoop 之 Hive & Hbase 简介

本帖最后由 PeersLee 于 2016-3-24 19:17 编辑

问题导读:

1.一个初学者眼中的 Hive(数据仓库工具)是什么样子?
2.Hive 的 Metastore 三种工作模式是什么?
3.Hive 与 传统数据库的相异点在哪?
4.Hbase的建构思路是什么?
5.如何用Java语言构建一颗汉语单词前缀树(trie树)?


static/image/hrline/3.gif


解决方案:

Hive:



[*]概念:



hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

说白了,Hive就是将将SQL查询转换为一系类在 Hadoop 集群上运行的MapReduce 作业进行处理。Hive把数据组织成表,按照表中的结构在 HDFS 中存储。元数据(如表模式)存储在metastore 数据库(Derby、Mysql)中。


static/image/hrline/line6.png



[*]Hive可以和哪些版本的 Hadoop 共同工作?


只要确保 Hadoop 可执行文件在相应的路径中或设置了HADOOP_HOME 环境变量,就不需要另行告诉Hive 你使用的Hadoop 版本。


static/image/hrline/line6.png




[*]安装:



安装教程:http://www.aboutyun.com/thread-7374-1-1.html                http://blog.csdn.net/an342647823/article/details/46048403

下载地址:http://www.apache.org/dyn/closer.cgi/hive/环境变量:exportHIVE_HOME = /home/peerslee/app/hive_install                  export PATH =$PATH:$HIVE_HOME/bin

static/image/hrline/line6.png


[*]配置信息(hive/conf/)

       (1) hive-site.xml            通过这个文件可以控制,每次运行Hive 时希望Hive使用的选项。该文件最适合存它储详细的集群连接信息。因为可以使用Hadoop 属性fs.default.na的me和mapred.job.tracker 来指定文件系统和jobtracker。如果没有配置这两个变量的时候,也就是使用本地的文件系统,这对于试着用Hive 来处理测试数据集是非常方便的。另外,metastore的配置选项一般也能在hive-site.xml 中找到。       (2) hive-default.xml            记录Hive使用的选项以及默认值。       (3) set 命令

不带参数的set 的命令会列出除了Hadoop 的默认值的所有属性值,Set –v 可以列出系统中的所有属性,包括hadoop 的默认值。       (4) hive-log4j.properties            修改日志的级别和其他日志相关设置。然后,更方便的方法是在会话中对日志配置进行设置。

[*]Hive的体系结构:





static/image/hrline/1.gif


Hive Metastore的三种配置方式:


Metastore 本来就镶嵌在 Hive 服务中的一个服务,Metastore 又分为数据存储和前台服务,这里Metastore有三种配置方式。


(1)内嵌Metastore配置       默认情况下,metastore服务和hive 服务运行在一个JVM 中,它包括一个内嵌的以本地磁盘作为存储的Derby数据库实例。其缺点是只支持单会话。(2)本地Metastore 配置       要支持多会话就需要只用一个独立的数据库(MySQL)。关键配置信息:

(3)远程metastore配置       Metastore 服务和 Hive 服务不在一个JVM中,即不在一个进程中,这是时候将数据库层放在防火墙内(说明他是安全的,不需要阻碍),这样就不需要用户名和密码的验证,所以方便了管理和安全性。       实际操作参考资料:http://blog.csdn.net/reesun/article/details/8556078防火墙:http://baike.baidu.com/subview/3067/9048966.htm

static/image/hrline/1.gif

Hive 与 传统数据作比较:

(1)
传统数据库是写时模式(schema on write),即数据在写入数据库时对模式进行检查。Hive在数据加载时不进行验证,而是在查询时进行,是读时模式(schema on read)。写时模式有利于提升查询性能,因为数据库可以对列进行索引,并对数据压缩。但作为权衡,此时加载数据会花更多时间。此外,在很多情况下,加载时模式是未知的,因为查询尚未确定,因此也不能决定使用何种索引。这些情况下,正是Hive发挥其长处的地方。


(2)
Hive 被设计为用 MapReduce 操作HDFS 数据。Hive不支持更新(或删除),但支持INSERT INTO,所以可以向现有表中增加新的行。HBase集成,Hbase 可以进行行更新和列索引(现在已经可以通过Hive 访问HBase)




static/image/hrline/1.gif

HBase 的架构思路:

Hbase是基于Hadoop的项目,Hbase中有多个RegionServer的概念,并不意味着数据是持久化在RegionServer上的,事实上,RegionServer是调度者,管理Regions,但是数据是持久化在HDFS上的。
Hbase是一个分布式的数据库,使用Zookeeper来管理集群。在架构层面上分为Master(Zookeeper中的leader)和多个RegionServer,基本架构如图:




参考资料:http://ygydaiaq-gmail-com.iteye.com/blog/1733367


static/image/hrline/1.gif



问题描述如下:

将下列单词构建成一颗前缀树并进行先序遍历:
输入:


中国
共产党
爱人
共和国
人民
人们
艺人
艺术
人生

输出:




















代码:

trie树:
package peerslee.trietest1;

import java.util.ArrayList;

public class TrieNode {
      
      //data
      private Node root;
      
      //getter
      public Node getRoot() {
                return root;
      }

      //construct
      public TrieNode() {
                root = new Node();
      }
      
      //插入函数
      public void insert(String str) {
               
                //
                Node node = root;
               
                //1.遍历整个字符串
                for(int i = 0; i<str.length(); i++) {
                        if(node.nextList.isEmpty()) {
                              //2.在遍历过程中,如果node指针域指向的内存区域为空(没有子节点)直接创建节点,节点中存一个字符
                              Node newNode = new Node();
                              newNode.ch = str.charAt(i);
                              node.nextList.add(newNode);
                        } else
                              //3.如果node存在指向,遍历他所有子节点
                        for(int j = 0; j<node.nextList.size(); j++) {
                              Node temp = node.nextList.get(j);
                              //System.out.println(temp.ch);
                              
                              //4.如果str中的字符 与 node的子节点中存的字符匹配上,node = temp,跳出遍历node子节点的循环
                              if(temp.ch == str.charAt(i)) {
                                        node = temp;
                                        break;
                              } else {
                                        //5.遍历了所有子节点之后还是没有匹配到,添加该str的这个字符为node 的子节点
                                        if( j == node.nextList.size() - 1) {
                                                Node newNode = new Node();
                                                newNode.ch = str.charAt(i);
                                                node.nextList.add(newNode);
                                        }
                              }
                        }
                }
                // 看他是不是单词
                node.isStr = true;
      }
      
      //先序遍历
      public void preTraverse(Node T) {
                if(T != null) {
                        
                        System.out.println(T.ch);
                        
                        for(int i = 0; i<T.nextList.size(); i++) {
                              preTraverse(T.nextList.get(i));
                        }
                }
      }
      
      //节点
      private class Node {
                //数据域
                char ch;
                boolean isStr;
               
                //指针域
                publicArrayList<Node> nextList;
               
                //构造器
                public Node() {
                        ch = ' ';
                        isStr = false;
                        nextList = new ArrayList();
                }
      }
}

测试:
package peerslee.trietest1;

public class main {
      public static void main(String[] args) {
               
                TrieNode trieNode = new TrieNode();
               
                String[] str = {
                              "我","爱","中国","共产党","爱人","共和国","人民","人们","艺人","艺术","人生"
                };
               
                for(int i = 0;i<str.length; i++) {
                //      System.out.println(str);
                        trieNode.insert(str);
                }
               
                trieNode.preTraverse(trieNode.getRoot());
      }
}



树结构:





Gazelle 发表于 2016-7-8 00:52:27

谢大神总结分享
页: [1]
查看完整版本: Hadoop 之 Hive & Hbase 简介