分享

Hadoop 之 Hive & Hbase 简介

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

1.一个初学者眼中的 Hive(数据仓库工具)是什么样子?
2.Hive 的 Metastore 三种工作模式是什么?
3.Hive 与 传统数据库的相异点在哪?

4.Hbase的建构思路是什么?

5.如何用Java语言构建一颗汉语单词前缀树(trie树)





解决方案:

Hive:


  • 概念:



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

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





  • Hive可以和哪些版本的 Hadoop 共同工作?


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







  • 安装:



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

环境变量:exportHIVE_HOME = /home/peerslee/app/hive_install
                  export PATH =$PATH:$HIVE_HOME/bin




  • 配置信息(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 命令

2016-03-21_162108.png

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

  • Hive的体系结构:



2016-03-21_164708.png




Hive Metastore的三种配置方式:


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

2016-03-21_165517.png

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

2016-03-21_170421.png

(3)远程metastore配置
       Metastore 服务和 Hive 服务不在一个JVM中,即不在一个进程中,这是时候将数据库层放在防火墙内(说明他是安全的,不需要阻碍),这样就不需要用户名和密码的验证,所以方便了管理和安全性。
      




Hive 与 传统数据作比较:


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


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






HBase 的架构思路:

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


hbase.png

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






问题描述如下:

将下列单词构建成一颗前缀树并进行先序遍历:
输入:
[mw_shl_code=applescript,true]我

中国
共产党
爱人
共和国
人民
人们
艺人
艺术
人生[/mw_shl_code]

输出:

[mw_shl_code=applescript,true]
















术[/mw_shl_code]

代码:

trie树:
[mw_shl_code=java,true]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;
               
                //指针域
                public  ArrayList<Node> nextList;
               
                //构造器
                public Node() {
                        ch = ' ';
                        isStr = false;
                        nextList = new ArrayList();
                }
        }
}[/mw_shl_code]

测试:
[mw_shl_code=java,true]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());
        }
}
[/mw_shl_code]


树结构:

2016-03-24_153552.png



已有(1)人评论

跳转到指定楼层
Gazelle 发表于 2016-7-8 00:52:27
谢大神总结分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条