跳到主要内容

大数据

[TOC]

大数据

By:weimenghua
Date:2023.11.14
Description:

一、简介

  • Hadoop - 大数据解决方案
  • Spark - 大数据计算框架
  • Flink - 大数据实时分析框架
  • Storm - 大数据实时分析框架
  • Hive - 大数据仓库
  • HBase - 大数据仓库

二、Hadoop

Hadoop 教程

Hadoop 是一个分布式系统基础架构,现在被广泛地应用于大数据平台的开发,对处理海量数据,有着其他技术无可匹敌的优势。Google File System、MapReduce与BigTable被誉为分布式计算的三驾马车。Hadoop的基本架构的底层是 HDFS,上面运行的是 MapReduce/Tez/Spark,再往上封装的是 Pig 和 Hive!

Hadoop 只是一套工具的总称,它包含三部分:HDFS,Yarn,MapReduce,功能分别是分布式文件存储、资源调度和计算。

在 Hadoop 架构里面,master 节点上会运行一个叫做 namenode 的守护进程,每个 slave 节点上都会有 datanode 守护进程,两个进程都是属于HDFS 的。因此,slave 节点也叫做 datanode 节点。Namenode 主要用于存储元数据和管理 datanode 节点。而 datanode 则是真正存储数据和执行任务的地方。

Hadoop 主要有4个守护进程:

  • NameNode :它是HDFS运行在Master节点守护进程。
  • DataNode:它是 HDFS 运行在Slave节点守护进程。
  • ResourceManager:它是 Yarn 运行在 Master 节点守护进程。
  • NodeManager:它是 Yarn 运行在 Slave 节点的守护进程。

Hadoop 搭建

运行容器
docker run -it sequenceiq/hadoop-docker:latest /etc/bootstrap.sh -bash

设置环境变量
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

检查版本
hadoop version

查看环境变量
which hadoop

启动 HDFS
hdfs namenode -format
start-dfs.sh

Hadoop 基础命令

显示根目录 / 下的文件和子目录,绝对路径
hadoop fs -ls /

新建文件夹,绝对路径
hadoop fs -mkdir /hello

上传文件
hadoop fs -put hello.txt /hello/

下载文件
hadoop fs -get /hello/hello.txt

输出文件内容
hadoop fs -cat /hello/hello.txt

Hadoop WordCount

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar wordcount /hello/hello.txt /output

hadoop fs -cat /output/part-r-00000

三、Spark

四、Hive

Hive 简介

Hive 是基于 Hadoop 的一个数据仓库工具。Hive 的数据存储在 Hadoop 一个分布式文件系统上,即 HDFS。

Hive Data Model Hive 是一个基于 Hadoop 的开源数据仓库系统,主要用于对存储在 Hadoop 上的数据进行查询和分析。它可以处理结构化和半结构化数据。而 Hive 中的数据可以分成以下几类:

  • 分区

按数据的照粒度顺序,数据存储单元数据被组织为:

  • 数据库 Databases
  • 数据表 Tables
  • 分区 Partitions
  • 桶或簇 Buckets (or Clusters)

在 Hive 创建表的时候,Hive 将以默认的方式管理表数据,也就是说,Hive 会默认把数据存储到 /user/hive/warehouse 目录里面。

创建表类型

分类类型描述字面量示例
原始类型BOOLEANtrue/falseTRUE
TINYINT1字节的有符号整数 -128~1271Y
SMALLINT2个字节的有符号整数,-32768~327671S
INT4个字节的带符号整数1
BIGINT8字节带符号整数1L
FLOAT4字节单精度浮点数1.0
DOUBLE8字节双精度浮点数1.0
DEICIMAL任意精度的带符号小数1.0
STRING字符串,变长“a”,’b’
VARCHAR变长字符串“a”,’b’
CHAR固定长度字符串“a”,’b’
BINARY字节数组无法表示
TIMESTAMP时间戳,毫秒值精度122327493795
DATE日期‘2016-03-29’
INTERVAL时间频率间隔
复杂类型ARRAY有序的的同类型的集合array(1,2)
MAPkey-value,key必须为原始类型,value可以任意类型map(‘a’,1,’b’,2)
STRUCT字段集合,类型可以不同struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
UNION在有限取值范围内的一个值create_union(1,’a’,63)

Hive SerDe

SerDe 是 Serializer/Deserializer 的缩写,即序列化和反序列化。

  • 序列化是对象转换成字节序列的过程。
  • 反序列化是字节序列转换成对象的过程。

表数据行的序列化和反序列化大概过程如下:

  • HDFS 文件 ——> InputFileFormate ——> ——> 反序列化 ——> 数据行对象(Row object)
  • 数据行对象(Row object)——> 序列化 ——> ——> OutputFileFormate ——> HDFS 文件

Hive SQL 与 SQL

  1. 结构化查询语言(SQL):

SQL 是一种特定于领域的语言,用于编程,用于管理关系数据库管理系统(也称为 RDBMS)中的数据。它在处理结构化数据时也很有用,即包含实体和变量之间关系的数据。SQL是在数据库中存储、操作和检索数据的标准语言。

  1. 配置单元查询语言(HiveQL):

HiveQL 是一种用于 Hive 分析和处理元存储中结构化数据的查询语言。它与 SQL 非常相似,具有高度的可扩展性。它重用关系数据库世界中熟悉的概念,如表、行、列和模式,以简化学习。Hive 支持四种文件格式,即文本文件、序列文件、ORC 和 RC 文件(记录列文件)。

Hive 和 SQL 之间的主要区别:

  • 架构:Hive 是一个用于数据分析的数据仓库项目;SQL是一种编程语言。不过,Hive通过一种名为HiveQL的编程语言(类似于SQL)执行数据分析。
  • 设置:Hive 是一个基于开源软件程序 Hadoop 构建的数据仓库。
  • 数据分析:Hive比SQL更有效地处理复杂数据,SQL适合不太复杂的数据集。

SQL 和 HiveQL 之间的区别:

对比项SQLHiveQL
表结构中的更新命令UPDATE, DELETE, INSERTUPDATE, DELETE, INSERT
管理方式关系型数据数据结构
事务处理支持支持有限
索引支持支持
数据类型它总共包含5种数据类型: Integral, floating-point, fixed-point, text and binary strings, temporal它总共包含9种数据类型: Boolean, integral, floating-point, fixed-point, text and binary strings, temporal, array, map, struct.
函数大量内置函数大量内置函数
Mapreduce不支持支持
多表插入不支持支持
Create table as Select不支持支持
Select 命令支持支持使用SORT BY子句进行偏序,并使用LIMIT限制返回的行数
Joins支持Inner joins, outer joins, semi join, map joins, cross joins
子查询支持仅用于 FROM, WHERE, or HAVING clauses
视图可以更新只读,不能更新

五、HBase

HBase 简介

HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以表的形式组织数据,表也由行和列组成;不同的是,HBase 有列族的概念,它将一列或者多列组织在一起,HBase 的每一个列都必须属于某个列族。

HBase 特点

  • 大:一个表可以有上亿行,上百万列。
  • 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
  • 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
  • 无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
  • 数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
  • 数据类型单一:HBase中的数据都是字符串,没有类型。

HBase 和 HDFS

HDFSHBase
HDFS是适用于存储大文件的分布式文件系统。HBase是建立在HDFS之上的数据库。
HDFS不支持快速的单个记录查找。HBase为大型表提供快速查找。
它提供高延迟的批处理;没有批处理的概念。它提供了数十亿条记录对单行的低延迟访问(随机访问)。
它仅提供数据的顺序访问。HBase在内部使用哈希表并提供随机访问,并且将数据存储在索引的HDFS文件中,以加快查找速度。

HBase 存储机制

HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续地存储在磁盘上。表中的每个单元格值都具有时间戳。总之,在一个HBase:

  • 表是行的集合。
  • 行是列族的集合。
  • 列族是列的集合。
  • 列是键值对的集合。

HBase 模式例子

HBase 安装

docker run -d --name my_hbase harisekhon/hbase

docker exec -it my_hbase bash

键入 hbase shell 进入 shell 程序

键入 exit 命令退出 shell 程序

查看 HBase UI
http://localhost:16010

HBase 表操作

Shell 数据定义语言

下面列举了HBase Shell支持的可以在表中操作的命令。

  • create: 用于创建一个表。
  • list: 用于列出HBase的所有表。
  • disable: 用于禁用表。
  • is_disabled: 用于验证表是否被禁用。
  • enable: 用于启用一个表。
  • is_enabled: 用于验证表是否已启用。
  • describe: 用于提供了一个表的描述。
  • alter: 用于改变一个表。
  • exists: 用于验证表是否存在。
  • drop: 用于从HBase中删除表。
  • drop_all: 用于丢弃在命令中给出匹配“regex”的表。
  • Java Admin API: 在此之前所有的上述命令,Java提供了一个通过API编程来管理实现DDL功能。在这个org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor 这两个重要的类提供DDL功能。

Shell 数据操作语言

  • put: 用于把指定列在指定的行中单元格的值在一个特定的表。
  • get: 用于取行或单元格的内容。
  • delete:用于删除表中的单元格值。
  • deleteall: 用于删除给定行的所有单元格。
  • scan: 用于扫描并返回表数据。
  • count: 用于计数并返回表中的行的数目。
  • truncate: 用于禁用、删除和重新创建一个指定的表。
  • Java client API: 在此之前所有上述命令,Java提供了一个客户端API来实现DML功能,CRUD(创建检索更新删除)操作更多的是通过编程,在org.apache.hadoop.hbase.client包下。 在此包HTable 的 Put和Get是重要的类。

HBase 基础操作

获取HBase中所有表
list

查看系统上运行的服务器的详细信息
status

查看HBase系统版本
version

查看帮助文档
table_help

查看HBase用户
whoami

HBase 表报错

创建表
create '<table name>','<column family>'

示例:创建名为emp的表,它有两个列族:personal data和professional data。
create 'emp', 'personal data', 'professional data'

禁用表
disable 'emp'

正则禁用表
disable_all 'emp.+'

查看表是否被禁用
is_disabled 'emp'

启用表
enable 'emp'

查看表是否被启用
is_enabled 'emp'

查看表数据
scan 'emp'

检查表是否存在
exists 'emp'

返回表的描述
describe 'emp'

更改列族的最大单元数
alter 'emp', NAME => 'personal data', VERSIONS => 5

设置只读
alter 'emp', READONLY

删除名为professional的列族
alter 'emp','delete'⇒'professional'

删除表之前需禁用 disable 'emp'
drop 'emp'

正则删除表
drop_all 't.*'

HBase 数据更新操作

插入数据
put '<table name>','row1','<colfamily:colname>','<value>'
put 'emp','1','personal data:name','raju'
put 'emp','1','personal data:city','hyderahad'
put 'emp','1','personal data:designation','manager'
put 'emp','1','personal data:salary','50000'

create 'user','info','ship';

put 'user', '524382618264914241', 'info:name', 'zhangsan'
put 'user', '524382618264914241', 'info:age',30
put 'user', '524382618264914241', 'info:height',168
put 'user', '524382618264914241', 'info:weight',168
put 'user', '524382618264914241', 'info:phone','13212321424'
put 'user', '524382618264914241', 'ship:addr','beijing'
put 'user', '524382618264914241', 'ship:email','sina@sina.com'
put 'user', '524382618264914241', 'ship:salary',3000

put 'user', '224382618261914241', 'info:name', 'lisi'
put 'user', '224382618261914241', 'info:age',24
put 'user', '224382618261914241', 'info:height',158
put 'user', '224382618261914241', 'info:weight',128
put 'user', '224382618261914241', 'info:phone','13213921424'
put 'user', '224382618261914241', 'ship:addr','chengdu'
put 'user', '224382618261914241', 'ship:email','qq@sina.com'
put 'user', '224382618261914241', 'ship:salary',5000

查看数据
scan 'emp'

更新数据
put 'table name','row','Column family:column name','new value'
put 'emp','row1','personal:city','Delhi'

读取数据
get '<table name>','row1'
get 'emp', '1'

读取指定的列
get 'table name', 'rowid', {COLUMN ⇒ 'column family:column name'}
get 'emp','row1', {COLUMN => 'personal data:name'}

删除表格中的特定单元格
delete '<table name>', '<row>', '<column name>', '<time stamp>'
delete 'emp', '1', 'personal data:city'

删除表中的所有单元格
deleteall '<table name>', '<row>'
deleteall 'emp','1'

其它

count 计数
count '<table name>'
count 'emp'

truncate 清空表
truncate 'table name'
truncate 'emp'

授权
R-表示读取特权。
W-表示写特权。
X-代表执行特权。
C-表示创建特权。
A-表示管理员特权。
grant <user> <permissions> [<table> [<column family> [<column; qualifier>]]
grant 'hadoopdoc', 'RWXCA'

回收权限
revoke <user>
revoke 'hadoopdoc'

列出特定表的所有权限
user_permission 'tablename'
user_permission 'emp'

Flink 教程

Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。Flink不仅可以运行在包括YARN、Mesos、Kubernetes在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。

  • 边界:无边界和有边界数据流,可以理解为数据的聚合策略或者条件;
  • 状态:即执行顺序上是否存在依赖关系,即下次执行是否依赖上次结果;

七、Storm

八、知识碎片

Parquet

大数据列存标准格式 - Parquet

Parquet 是 Hadoop 生态圈中主流的列式存储格式,最早是由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 孵化器里毕业成为 Apache 顶级项目。

有这样一句话流传:如果说 HDFS 是大数据时代文件系统的事实标准,Parquet 就是大数据时代存储格式的事实标准。

Python 读取 Parquet 文件

import pyarrow.parquet as pq
# 读取Parquet文件
path = '/tmp/tmp.parquet'
table = pq.read_table(path)

# 将Parquet文件转换为Pandas DataFrame对象
df = table.to_pandas()

# 打印DataFrame
print(df)