hadoop以及MapReduce暂告一段落!
这一节我们做个过渡,讲一讲Hive以及Spark。
一、Hive介绍
Hive是分布式的数据库。对于结构化数据存储、查询的高效工具。
查询特殊的行、列,数据库操作非常重要。
数据库就像计算器一样。
——李丰老师
不管什么类型的数据库,都有sql,数据库查询语言。能够对很大的表格进行类似excel的操作。
数据库面向不同的对象:
计算机:设计高效数据库,快速存储海量数据。
使用者:快速得到想要的数据。
大数据时代,数据库进入瓶颈,因为其不可扩展。轻量级的数据应用就不太喜欢数据库,转而使用hdfs。但hdfs没有数据库那样便利,不能select…from…
就诞生了基于hdfs的数据库工具。
初衷:为了使企业能够快速部署使用结构化表格与操作。能将hdfs上的表格当做数据库的表格来使用(如csv)。
只要用sql语句就可以在hdfs上处理结构化数据。其实Hive是把sql解析成了MapReduce语句,最后传递回用户。
Hadoop(系统)hdfs(文件管理系统)
hive-SQL(可操作的客户端)complie+optimize+execute(很快啊!)
hive其实有小缓存,如果大量/经常查询同一条,就会被缓存下来,方便直接调用。
不会hadoop也可以用hive,只需要sql语句就行了。
hive可以做spark中dataframe的查询引擎。hive的功能就是能用sql的客户端。(氦核:这一点在之后的工作中显示了其强大与方便)
hive将sql解析成XML语句(标记位置)
hive完全是模拟了sql的写法,sql用的最广,python之流不适合这样的工作。
二、启动一个Hive任务
Hive + 回车(进入交互界面)
Exit (退出)
hive允许执行很多命令同时推出
如:
Hive -e “dfs -ls /;”
e是执行。引号内是hive语句,分号是模仿sql的结束符号。
传递给hadoop就是hadoop fs -ls /
结果再传回hive
也可以写成文件:
Hive -f /path/to/file/withqueries.hql
hql(hive的文本文件,与sql区分)
输入hive可以进入终端
操作时,在终端中可以直接输入dfs -ls /; (别忘了分号)
注:sql语言的特点——对大小写不敏感,语句中可以小写可以大写。但是对表的字段依然敏感。
Show databases;
可以看分布式集群上有什么数据库
Show databases like ‘d*’;
Create database if not exists mydb;
if not exists(是一个条件,如果有了就不会再创建,如果没有的话就创建)
数据库下有表,mydb不指定文件夹,就在warehouse的文件夹下。
location参数可以指定创建的位置
Create database if not exists fff location ‘user/lifeng/hive’
创建一个指定位置的数据库fff
Drop database fff;
删库,跑路!(危)
hive里如何创建表1
2
3
4
5
6
7
8
9
10
11
12
13CREATE TABLE IF NOT EXISTS mydb.employees (
name
STRING COMMENT 'Employee name',
salary
FLOAT COMMENT 'Employee salary',
subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
deductions MAP<STRING, FLOAT>
COMMENT 'Keys are deductions names, values are percentages',
address
STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
COMMENT 'Home address')
COMMENT 'Description of the table'
TABLEPROPERTIES ('creator'='me', 'created_at'='2012-01-02 10:00:00');
列名,comment记录注释,最后一行只创建了表头、创建者、创建时间等
hive记录了表的信息
因为刚刚用了use wyh_db;现在Show tables;就能看有哪些表。
hive提供了专门工具,把外部的csv文件链接进数据库。
hive可以创建外部表:
1 | create external table if not exists stocks ( |
逗号分隔,原来是csv文件,要加一个逗号分隔(倒数第二行)
linux里有个内置命令awk脚本工具,能够
Awk -f 5,4啥的,能够选择打印第5和第4列
主要是不想导入python中处理。
如可以使用pig工具,合并两个表或多个表(我们用的不多)
pig有自己的书写习惯,计算机架构的工程师经常用
hbase是对谷歌bigtable的开源实现
能够按行更新(如python的append)
能做基于内存的文件缓存,加快速度
不支持sql的查询,但是hive目前有工具可以与之通行。
(HIVE的简介到此结束,后面有任务再见)
三、Spark
Speed - Run workloads 100x faster.
Ease of Use - Write applications quickly in Java, Scala, Python, R, and SQL.
Generality - Combine SQL, streaming, and complex analytics.
Runs Everywhere - Spark runs on Hadoop, Apache Mesos, Kubernetes, standalone, or in the cloud. It can access diverse data sources.
伯克利的博士生,针对hadoop的问题重新写成了spark(老师也希望我们做这样的博士生,扶额)
Databricks公司,官网上提供了简单交互学习的平台。
spark在计算过程中非常快,是hadoop速度的一百倍
可以使用python,r,java,还有spark自带的scala语言。Scala语言有java的特性,又像r一样好写。
可以将spark当做python的一个模块来使用。(氦核:事实证明,pyspark很强,还自带深度学习模块,不过没那么顺手。)用户只需要学一点点就能用起来。
sparkR可以启动r。r语言设计用于统计分析,但是spark需要计算机组件,但是r没有,python有。
spark与hadoop的区别
hadoop是分布式的框架,spark对MapReduce看的更少,结果算的很快。
还有,hadoop不能交互;spark可以交互式操作一个对象。可以创建分布式对象, 在不同的节点上都存在,同时保证应用性和速度
spark也有通用性和广泛性,可以把sql集成进spark。
spark也可以处理流数据。
spark甚至可以机器学习和深度学习。
spark可以看做是分布式系统上更方便操作的hadoop客户端。
可以运行在hadoop上,可以当做独立的分布式系统。
spark可以接受hdfs等来源的文件,也可以自己建立dataframe。
spark可以用数据框组织数据。
spark有内置机器学习库,叫ml_lib;图形处理GraphX;流数据处理Spark Streaming(企业常用)。
spark也可以运行在其他分布式平台上,各种各样的平台上都有spark接口。易用性使其广泛普及。
spark提供了hive的集成。不过select不能写很复杂。但是通过spark可以先让spark执行select,再让hive执行。
快的原因:
1.很多worker节点,worker之间交互很快(通过交换机)
2.worker上可以运行很多任务(executor)
3.每个worker上都有一些存储最常用数据的内存
劣势:
需要很大的内存 — hadoop最不耗内存
spark的官方建议,需要原始数据2-5倍的内存才能保证平稳运行
有名的spark错误:OOM错误
Out of memory(哈哈哈)
加内存,扩容,烧钱啊。
尽可能让代码写快一些,用最少的资源得到最大的价值。
——李丰老师
之后课程计划讲:数据类型、机器学习的库(老版本基于rdd,新版本基于数据框)、streaming
不讲:计算机视觉相关包
四、启动spark
启动:.py .r
1 | Spark-submit \ |
使用spark-summit提交上去就能执行了。在spark运算前,要想想全部需要多少运算资源,给每个executor分多少内存。
Tiny fat 两种分配资源想法
Tiny 模式给每个核分一个executor,32g给8核,只能拿到4g,加上系统消耗就会更少。这种情形适用于cpu负荷大,如迭代类型,更多时候是迭代的分布式要跑起来。
Fat 模式,要是对IO很多的时候,我们不一定需要很多executor,八核可能只用两个executor,每个executor就有4核、16g使用。
python有个**x,即将列表展开按位置放入
x的长度不超过256,但是python3.8现在允许任意长度参数传入
X = [1,2,3,…,1000]
Sumfunc(**x)
登录服务器,输入spark-shell
使用pyspark要输入神秘代码(就是python的版本,配置时一定要与spark版本对应起来,比如服务器只能用3.6版本的python)
或者直接在python中import pyspark,有时候需要先import findspark。
Spark的API
rdd是什么(resilient distributed dataset)RDD是Spark里最重要的一个概念。
任何一个spark都可以通过rdd对象连接起来,也允许用户部署任何计算。
通过rdd转化成驱动程序,放入计算节点上计算,如传统的数学计算都可以转化。
spark-rdd提供了数据上的一个抽象,提供了海量数据的拆分机制,也可以通过不同的方式创建。
如分布式hdfs上有个文件,可以直接转化(好比hive上有个表),它也能判断哪些数据应该放入内存、硬盘。来提高效率。
其次,rdd也监视了每个计算节点的数据完整性。复活的基本机理与hadoop相似。闲暇时间拷贝。
spark能进行机器学习的理由:spark允许变量进行共享,每个节点都有想同的变量。
1.常量,都用得着,不需修改。通过广播(broadcast variables)来传递给每个节点
2.传递到节点后,还可能要修改(如迭代算法)会消耗资源(accumulators)
如何创建spark context
1 | import findspark |
使用了sc.parallelize就会传上spark,是一个对象。如果数据在本地或hdfs,都可以上传。
给一个自己的作业超简单案例
1 | #! /usr/bin/env python3.6 |
(未完待续,下次再细讲Spark,学吧,学无止境,太深了)
本文链接: https://konelane.github.io/2020/11/02/201102hadoop/
-- EOF --
转载请注明出处 署名-非商业性使用-禁止演绎 3.0 国际(CC BY-NC-ND 3.0)