初识Hadoop、Hive
2016.10.13 20:28
很久没有写随笔了,自打小宝出生后就没有写过新的文章。数次来到博客园,想开始新的学习历程,总是被各种琐事中断。一方面确实是最近的项目工作比较忙,各个集群频繁地上线加多版本的提测,每次到了晚上就感觉很疲惫,另一方面确实是自己对自己最近有些放松,没有持续地学习。很庆幸今天能在一个忙碌的工作日后,开始着手这篇文章。
来到大数据前,我对大数据可以说是一无所知。诸如Hadoop、Hive等名词仅仅处于“听过”的阶段,完全不知道其作用。大数据的概念真的很多,想真正理解必须从实践中慢慢体会,否则则永远只能停留在字面意思。
一、Hadoop
相信大部分人都听过Hadoop,但是都不知道它到底是干什么的,有什么作用。Hadoop其实可以分为两块:HDFS和MapReduce。
HDFS:Hadoop Distributed File System,是一个分布式文件系统,它的主要作用是为海量数据提供存储,并提供“流式“访问文件系统中的数据。存储在HDFS中的数据文件是结构化的,比如日志文件。
MapReduce:看过廖雪峰的Python教程的人应该都对Map和Reduce有一定了解,这里的MapReduce其实就是一样的操作(如果没看过,想了解Map、Reduce过程可以访问《廖雪峰Python教程-map/reduce》)。它主要提供了对海量数据的计算。
二、Hive
在实践中,数据开发工程师们想对数据进行计算就要写一个MapReduce程序,而这显然需要较大的成本,对于那些不擅长开发的人想简单地查询数据更是抬高了较大的门槛。于是Hive就是为了解决这个问题而生的。它将存储在HDFS中的数据文件(例如日志),通过建立一种映射关系映射成一张数据库表,即Hive表。Hive中有一个模块“metastore”,,一般使用mysql,就是专门用来存储该映射后的数据库表的表结构信息,例如表名、字段名、分区、属性(是否外部表、分区表)等,没有具体的数据。业界也称它为”元数据“。然后真实的数据可以通过load data转换为hive表中的数据,或者通过add partition的方式建立数据映射,从而Hive就提供了一种通过SQL语句查询的方式来计算HDFS中的实际数据文件。
当一条Hive SQL语句被执行时,Hive有一套映射工具(metastore,一般存放在mysql、derby中),它会对应地将SQL语句转化为MapReduce任务,把sql中的表、字段映射成HDFS中的文件、列,然后去执行对HDFS原始数据文件的计算。
其实这些内容似乎在所有关于Hadoop、Hive的地方都能看到,字面上理解也并不难。但是如果你是一个真正的初次接触大数据的人的话,我想你会可能也跟我刚开始一样,对它们的理解仅仅是停留在字面。这里举一个例子来解释上面这些字面真正的意思。
比如我有一个存在HDFS中的access.log日志文件,其内容如下:

假如想统计ip为10.165.152.123的登录记录,如果通过MapReduce去做的话,可能的代码实现方法是:首先解析日志文件,每行去查找是否包含“10.165.152.123”,如果是则再通过正则匹配去取出后面的相关内容(Map);然后对每行的结果进行汇总计算(Reduce)。
Hive的做法:
1. 先任意取一条日志,例如10.165.152.123 - - [13/Oct/2016:14:55:06 +0800] "GET /index.html HTTP/1.0" 200 7992 2124,将其中的列映射成字段,如:10.165.152.123对应ip,13/Oct/2016:14:55:06对应time,GET /index.html HTTP/1.0对应method(请求方法),200对应result(返回码),7992对应bytes(字节数),2124对应response_time(响应时间)。
2. 然后相对应地,选定一个数据库(比如znilog)下,创建一张表名为tbl_accesslog的记录字段名、是否分区(比如按date分区)、属性(是否外部表)的hive表。
需要注意的是,hive表的实际存储位置也是在hdfs上,比如这种情况下默认的hdfs路径可能就是/warehouser/znilog.db/tbl_accesslog。这个路径就是内部表(也称管理表)的hdfs存储路径。如果是外部表,用户可以自己设定外部表的location。
3. 对于内部表,我们需要将数据通过load data的方式,将原始数据文件中的数据通过映射的方式,转化为映射后的数据(一般按列存放)存入内部表下。
4. 对于外部表,我们可以直接通过add partition的方式将原始hdfs路径下的数据文件,映射到外部表下。当删除表时,Hive默认存储位置的数据会被删除,但是外部表的数据不会被删除。
5. 这样我们就有了Hive表,以及Hive表包含的元数据信息(存在metastore中,一般是mysql),Hive表中包含转化后的数据信息,我们可以直接通过Hive SQL语句(select * from tbl_accesslog where ip='10.165.152.123')来获取我们想要的信息。
初识Hadoop、Hive的更多相关文章
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- 初识Hadoop入门介绍
初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...
- 大数据测试之初识Hadoop
大数据测试之初识Hadoop POPTEST老李认为测试开发工程师是面向测试的开发,也就是说,写代码就是为完成测试任务服务的,写自动化测试(性能自动化,功能自动化,安全自动化,接口自动化等等)的cas ...
- 细细品味大数据--初识hadoop
初识hadoop 前言 之前在学校的时候一直就想学习大数据方面的技术,包括hadoop和机器学习啊什么的,但是归根结底就是因为自己太懒了,导致没有坚持多长时间,加上一直为offer做准备,所以当时重心 ...
- Hive创建表格报【Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException】引发的血案
在成功启动Hive之后感慨这次终于没有出现Bug了,满怀信心地打了长长的创建表格的命令,结果现实再一次给了我一棒,报了以下的错误Error, return code 1 from org.apache ...
- FineReport中hadoop,hive数据库连接解决方案
1. 描述 Hadoop是个很流行的分布式计算解决方案,Hive是基于hadoop的数据分析工具.一般来说我们对Hive的操作都是通过cli来进行,也就是Linux的控制台,但是,这样做本质上是每个连 ...
- hive 使用where条件报错 java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalkerInfo.getConvertedNode
hadoop 版本 2.6.0 hive版本 1.1.1 错误: java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalk ...
- hadoop+hive使用中遇到的问题汇总
问题排查方式 一般的错误,查看错误输出,按照关键字google 异常错误(如namenode.datanode莫名其妙挂了):查看hadoop($HADOOP_HOME/logs)或hive日志 h ...
- Hadoop Hive基础sql语法
目录 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的 ...
- Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql、oracle...)间进行数据的传递
http://niuzhenxin.iteye.com/blog/1706203 Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql.postgresql.. ...
随机推荐
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常. 意思是出现了死循环,也就是Model之间有循环包含关系: ...
- Gradle配置APK自动签名完整流程
转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...
- 学习笔记之MVC级联及Ajax操作
由于刚转型到MVC,MVC的架构模式很多不是很清楚,比如今天就想做个级联的操作,因为之前的ASP.NET的方式是通过:控件-->添加事件-->后台编写级联事件进行触发,但是这个MVC就不同 ...
- 【置顶】CoreCLR系列随笔
CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...
- 微信小程序前端源码逻辑和工作流
看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.j ...
- 原生JavaScript实现hasClass、addClass、removeClass、toggleClass
兼容IE6+,因IE6.IE7.IE8不支持Array.prototype.indexOf()和String.prototype.trim(),分别用Polyfill实现支持. 详细: indexOf ...
- Xamarin Android 应用程序内图标上数字提示
最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示.在这里和大家分享一下实现方法,如果你有更新好的实现方法, ...
- Android6.0运行时权限管理
自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...