分布式1102-Hi,Hive!Hi,Spark!

目录

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
13
CREATE 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
2
3
4
5
6
7
8
9
10
11
create external table if not exists stocks (
symbol string,
ymd string,
price_open float,
price_high float,
price_low float,
price_close float,
volume int,
price_adj_close float )
row format delimited fields terminated by ','
location '/user/lifeng/data';

逗号分隔,原来是csv文件,要加一个逗号分隔(倒数第二行)

linux里有个内置命令awk脚本工具,能够

Awk -f 5,4啥的,能够选择打印第5和第4列

主要是不想导入python中处理。

如可以使用pig工具,合并两个表或多个表(我们用的不多)

pig有自己的书写习惯,计算机架构的工程师经常用

hbase是对谷歌bigtable的开源实现

能够按行更新(如python的append)

能做基于内存的文件缓存,加快速度

不支持sql的查询,但是hive目前有工具可以与之通行。

(HIVE的简介到此结束,后面有任务再见)

三、Spark

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
2
3
4
5
6
Spark-submit \
--class
--master #什么节点(yarn)
--deploy-mode
--executor-memory 20G \
--conf

Spark案例

使用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
2
3
4
5
6
import findspark
findspark.init("/usr/lib/spark-current")
import pyspark

sc.stop()
sc = pyspark.SparkContext("local", "My First Spark App")

使用了sc.parallelize就会传上spark,是一个对象。如果数据在本地或hdfs,都可以上传。

给一个自己的作业超简单案例

1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/bin/env python3.6
import pyspark

conf = pyspark.SparkConf().setAppName("Hehe First Spark RDD APP").setMaster("local") # “yarn”
sc = pyspark.SparkContext(conf=conf)
sc.stop()
sc = pyspark.SparkContext.getOrCreate()
licenseFile = sc.textFile("2020210995wangyuanhe/reg/stocks.txt")
lineLengths = licenseFile.map(lambda s: len(s))
totalLength = lineLengths.reduce(lambda a, b: a + b)

print(totalLength)

(未完待续,下次再细讲Spark,学吧,学无止境,太深了)


本文链接: https://konelane.github.io/2020/11/02/201102hadoop/

-- EOF --

¥^¥请氦核牛饮一盒奶~suki