vlambda博客
学习文章列表

SQL学习总结(13)—— hadoop生态圈概览(hive/spark/HQL等)+ hive SQL(HQL)与SQL


以《SQL必知必会》为基础,结合其他书籍和刷题过程中遇到的问题,总结归纳,便于后续查找。(代码需左右滑动)

hadoop生态圈概念 

一、大数据技术本质解决4个核心问题:

1. 存储,海量数据有效存储,主要包括hdfs、Kafka;

2. 计算,海量数据快速计算,主要包括MapReduce、Spark、Flink等;

3. 查询,海量数据快速查询,主要为Nosql和Olap,Nosql主要包括Hbase、Cassandra ,其中olap包括kylin、impla等,Nosql主要解决随机查询,Olap技术主要解决关联查询;

4. 挖掘,海量数据挖掘出隐藏知识,火热的机器学习和深度学习等技术,包括TensorFlow、caffe、mahout等。

 

二、 特别说明-hadoop,hive,spark

Hadoop包括三大部分,分别是hdfs、MapReduce和hbase:hdfs解决大数据的存储问题。mapreduce解决大数据的计算问题。hbase解决大数据量的查询问题。Hadoop不断衍生和进化,其中最激烈的当属计算技术,其次是查询技术,存储技术基本无太多变化,hdfs一统天下。

1. mapreduce太复杂?推出了hive,pig、impla等SQL ONHadoop的方法;

2. mapreduce不能适用不同场景?推出了基于内存的Spark,意图解决所有大数据计算问题;

3. hadoop只能批量计算?推出了SparkStreaming、Storm,S4等流式计算技术,能够实现数据即时计算;

4. 推出flink,想一统流计算和批量计算。

 

三、详细解释:

Hadoop生态圈基本上都是为了处理超过单机尺度的数据处理而诞生的。

1.传统的文件系统是单机的,不能横跨不同的机器。HDFS(Hadoop Distributed File System)的设计本质上是为了大量的数据能横跨成百上千台机器(分布式文件存储),但是看到的是一个文件系统而不是很多文件系统,即引用的是一个文件路径,但是实际的数据存放在很多不同的机器上,HDFS管理这些数据。

2.单机处理是速度慢,如果要用多台机器处理,就面临如何分配工作、一台机器挂了如何重新启动相应的任务、机器之间如何互相通信交换数据以完成复杂的计算等。这就是MapReduce / Tez / Spark的功能,MapReduce的设计采用简化的计算模型,只有Map和Reduce两个计算过程(中间用Shuffle串联),可以简单理解为map阶段为各机器分别做目标任务形成结果,reduce阶段对结果进行整合完成目标任务,Map+Reduce的简单模型好用但很笨重。第二代的Tez和Spark本质上是让Map/Reduce模型更通用,让Map和Reduce之间的界限更模糊,数据交换更灵活,更少的磁盘读写,以便更方便地描述复杂算法,取得更高的吞吐量。

3.MapReduce的程序写起来很麻烦,为简化,Pig和Hive应运而生。Pig是接近脚本方式去描述MapReduce,Hive则用的是SQL。它们把脚本和SQL语言翻译成MapReduce程序,丢给计算引擎去计算,使用者就从繁琐的MapReduce程序中解脱,用更简单更直观的语言去写程序了。Hive逐渐成长为大数据仓库的核心组件。

4.Hive在MapReduce上跑很慢,于是Impala,Presto,Drill诞生了,三个系统的核心理念是MapReduce引擎太慢,因为它太通用,太强壮,太保守,SQL需要更轻量,更激进地获取资源,更专门地对SQL做优化,而且不需要那么多容错性保证。如果说MapReduce是大砍刀,砍啥都不怕,那Impala,Presto,Drill就是剔骨刀,灵巧锋利,但是不能应用于过于庞大的东西。Hive on Tez / Spark和SparkSQL也被开发出来,它们的设计理念是MapReduce慢,但是如果我用新一代通用计算引擎Tez或者Spark来跑SQL,就能跑的更快,而且用户不需要维护两套系统。

5.数据仓库构架的简要总结:底层HDFS,上面跑MapReduce/Tez/Spark,在上面跑Hive,Pig。或者HDFS上直接跑Impala,Drill,Presto。这解决了中低速数据处理的要求,如果要更高速的处理就用到Streaming(流)计算,Storm是最流行的流计算平台,其思路是如果要达到更实时的更新,在数据流进来的时候就进行处理。流计算基本无延迟,但短处是不灵活,想要统计的东西必须预先知道。还有一个有些独立的模块是KV Store,比如Cassandra,HBase,MongoDB等,KVStore是有一堆键值,能很快速滴获取与Key绑定的数据,基本无法处理复杂的计算,大多没法JOIN,也许没法聚合,没有强一致性保证,但很快、极快。除此之外,还有更特制的系统/组件,比如Mahout是分布式机器学习库,Protobuf是数据交换的编码和库,ZooKeeper是高一致性的分布存取协同系统等。

6.有了上述纷繁复杂的工具,都在同一个集群上运转,需要有序工作,就要有调度系统,现在最流行的是Yarn,可以将其视作中央管理,进行统筹调度。


学习链接:

https://www.zhihu.com/question/27974418/answer/156227565

https://www.zhihu.com/question/27974418/answer/38965760


HQL与SQL的区别

HQL与SQL总体是一致的,Hive-SQL设计目的就是让会SQL不会编程MapReduce的也能使用Hadoop进行处理数据。用法上的区别有:


1. HQL不支持行级别的增、改、删,所有数据在加载时就已经确定,不可更改。

2. 不支持事务。

3. 支持分区存储。

4. 不支持等值连接,一般使用leftjoin、right join 或者inner join替代。

5. 不能智能识别concat(‘;’,key),只会将‘;’当做SQL结束符号。

6. HQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False,使用left join可以进行筛选行。

7.不支持 ‘< dt<’这种格式的范围查找,可以用dt in(”,”)或者between替代。

8. hive不支持INSERTINTO 表 Values(), UPDATE, DELETE操作(关于这个很多人都写了不支持,但是在Hive的之前版本已经新增了这几个命令,现在是可以使用的)。

9. 建表语句不一样,hive有列分割,按字段分割,sql没有,hive中在创建表时,一般会根据导入的数据格式来指定字段分隔符和列分隔符。

10. hive落地到hdfs,Mysql落地到磁盘(hive支持将转换后的数据直接写入不同的表,还能写入分区、hdfs和本地目录; SQL落地到文件。

11.官方说明文档链接:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

12.HQL函数汇总链接;

https://blog.csdn.net/xiaohu21/article/details/108436462



学习链接:

https://www.jianshu.com/p/0696a52226bb

https://blog.csdn.net/weixin_41744624/article/details/105291756