本帖最后由 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
(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 Metastore的三种配置方式:
Metastore 本来就镶嵌在 Hive 服务中的一个服务,Metastore 又分为数据存储和前台服务,这里Metastore有三种配置方式。
(1)内嵌Metastore配置 默认情况下,metastore服务和hive 服务运行在一个JVM 中,它包括一个内嵌的以本地磁盘作为存储的Derby数据库实例。其缺点是只支持单会话。 (2)本地Metastore 配置 要支持多会话就需要只用一个独立的数据库(MySQL)。 关键配置信息:
(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,基本架构如图:
参考资料: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]
树结构:
|