大数据推荐系统(8)分布式数据收集和存储

大数据推荐系统算法(1)大数据框架介绍
大数据推荐系统算法(2) lambda架构
大数据推荐系统算法(3) 用户画像
大数据推荐系统(4)推荐算法
大数据推荐系统(5)Mahout
大数据推荐系统(6)Spark
大数据推荐系统(7)推荐系统与Lambda架构
大数据推荐系统(8)分布式数据收集和存储
大数据推荐系统(9)实战
推荐系统数据
user 用户基本信息
item 产品信息
user行为 用户访问日志(不同行为存在不同机器上和系统上)

分散的数据源(由不同系统组件产生,部署在不同机器上):
用户访问日志
用户购买日志
用户收藏日志
用户搜索日志
日志收集:
Flume/ /Scribe (日志排序)

关系型数据:
用户注册信息:保存在关系型数据库MySQL、Oracle等
传统数据库与Hadoop 同步。数据收集:
Sqoop

一、Flume整体介绍
分布式、可靠、高可用的海量日志采集系统
数据源可定制,可扩展
数据存储系统可定制,可扩展
中间件:屏蔽了数据源和数据存储系统的异构性

特点:
可靠性:保证数据不丢失
可扩展性:各组件数目可扩展
高性能:吞吐率很高,能满足海量数据收集需求
可管理性:可动态增加和删除组件
文档丰富,社区活跃:已成为Hadoop生态系统标配

Flume OG
OG:“Original Generation”
0.9.x或cdh3以及更早版本
由agent、collector、master等组件构成

Flume NG
NG:“Next/New Generation”
1.x或cdh4以及之后的版本
由Agent、Client等组件构成

为什么要推出NG 版本
精简代码
架构简化

FlumeOG基本架构
在这里插入图片描述
FlumeNG基本架构
在这里插入图片描述
Agent内部结构:
在这里插入图片描述

Flume内部组件介绍
Flume NG核心概念
Event
Client
Agent
Source
Channel
Sink
其他组件 :Interceptor 、Channel Selector 、Sink Processor

1.Event
Event 是Flume 数据传输的基本单元
Flume 以事件的形式将数据从源头传送到最终的目的
Event 由可选的header 和载有数据的一个byte array 构成

2.Client
Client是一个将原始log包装成events并且发送它们到一个或多个agent的实体。
目的是从数据源系统中解耦Flume
在flume的拓扑结构中不是必须的

3.Agent
一个Agent包含Source, Channel, Sink和其他组件;
它利用这些组件将events从一个节点传输到另一个节点或最终目的;
Agent是flume流的基础部分;
Flume为这些组件提供了配置、生命周期管理、监控支持

在这里插入图片描述

3.1 Source
Source负责接收event或通过特殊机制产生event,并将events批量的放到一个或多个Channel
包含event驱动和轮询2种类型

3.2Channel
Channel位于Source和Sink之间,用于缓存event;
当Sink成功将event发送到下一跳的channel或最终目的,event从Channel移除。

3.3Sink
Sink负责将event传输到下一跳或最终目的,成功完成后将event从channel移除。
必须作用于一个确切的channel

3.4 其他组件
Interceptor
作用于Source,按照预设的顺序在必要地方装饰和过滤events

Channel Selector
允许Source基于预设的标准,从所有Channel中,选择一个或多个Channel

Sink Processor:
多个Sink可以构成一个Sink Group。Sink Processor可以通过组中所有Sink实现负载均衡;也可以在一个Sink失败时转移到另一个

实例:
在这里插入图片描述

实例的配置文件:

#第一层的配置
#图中第一部分的Agent的设置  一个channels 一个 sources  一个sinks 
a1.channels = c1
a1.sources = r1
a1.sinks = k1 k2

#对sinkgroups 配置     ROUND_ROBIN 文件寻找的方式  backoff 尾数
a1.sinkgroups = g1
a1.sinkgroups.g1.processor.type = LOAD_BALANCE
a1.sinkgroups.g1.processor.selector = ROUND_ROBIN
a1.sinkgroups.g1.processor.backoff = true
a1.channels.c1.type = FILE

#r1和c1绑定
a1.sources.r1.channels = c1
a1.sources.r1.type = AVRO
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 41414

#k1,k2具体实现  k1-c1,k2-c1
a1.sinks.k1.channel = c1
a1.sinks.k1.type = AVRO
a1.sinks.k1.hostname = a21.example.org #那个主机
a1.sinks.k1.port = 41414
a1.sinks.k2.channel = c1
a1.sinks.k2.type = AVRO
a1.sinks.k2.hostname = a22.example.org
a1.sinks.k2.port = 41414

#第二层的配置  只有一个k1 不需要sinkgroups
a2.channels = c1
a2.sources = r1
a2.sinks = k1
a2.channels.c1.type = FILE
a2.sources.r1.channels = c1
a2.sources.r1.type = AVRO
a2.sources.r1.bind = 0.0.0.0
a2.sources.r1.port = 41414
a2.sinks.k1.channel = c1
a2.sinks.k1.type = HDFS
a2.sinks.k1.hdfs.path = hdfs://namenode.example.org
a2.sinks.k1.hdfs.fileType = DataStream

使用 Flume 收集 Web 日志数据

  1. 安装 Flume
  2. 为 为 Flume 采集数据创建 HDFS 目录
    创建 HDFS 目录/dylan/weblogs 来存放 Flume 采集的数据
hdfs dfs -mkdir -p /dylan/weblogs
  1. 为 为 Web 日志输出来创建本地目录

(1)创建一个 spool 目录,通过 web 日志模拟器生成数据到这个目录来给 Flume
采集。在本地文件系统创建/tmp/flume/weblogs_spooldir:

mkdir -p /tmp/flume/weblogs_spooldir

(2)赋予写权限给所有用户:

chmod a+w -R /flume
  1. 配置 Flume

在$FLUME_HOME 目录下创建 Flume 配置文件,包含如下特性:
 Source 从 spool 目录/tmp/flume/weblogs_spooldir 读取数据
 Sink 是 HDFS sink:
 写文件到/dylan/weblogs 目录
 设置 hdfs.rollInterval 为 0 来禁用基于时间的文件轮转
 设置 hdfs.rollCount 为 0 来禁用基于事件的文件轮转
 设置 hdfs.rollSize 为 524288 来启用基于尺寸的文件轮转为 512K
 设置 hdfs.fileType 为 DataStream 写原始文本文文件(不是序列文
件格式)
 Channel 是 Memory Channel:
 使用 capacity 属性可以存储 10000 个事件
 使用 transactionCapacity 属性设置 10000 个事务容量

  1. 运行 Agent

使用刚刚创建的配置文件启动 Flume agent

$ flume-ng agent --conf /$FLUME_HOME/conf \
--conf-file spooldir.conf \
--name agent1 -Dflume.root.logger=INFO,console
  1. 模拟 Apache Web Server 输出
    1、打开另外的终端窗口,并切换到实验目录。运行脚本来把 web 日志文件
    放到/tmp/flume/weblogs_spooldir 目录
    2、回到运行 Flume agent 的终端并观察日志输出。将会输出文件写入 HDFS
    的信息。
    3、一旦 Flume agent 完成,输入 CTRL+C 来终止进程。
    4、使用命令行或 Hue File Browser,列出 Flume agent 添加的 HDFS 文
    件。

二、Sqoop
2.1Sqoop:SQL-to-Hadoop
连接 传统关系型数据库 和 Hadoop 的桥梁
把关系型数据库的数据导入到 Hadoop 系统 ( 如 HDFS、HBase 和 Hive) 中;把数据从 Hadoop 系统里抽取并导出到关系型数据库里
利用MapReduce 加快数据传输速度

2.2优势:
高效、可控地利用资源 :任务并行度 , 超时时间等
数据类型映射与转换 :可自动进行 , 用户也可自定义
支持多种数据库:MySQL、Oracle、PostgreSQL

2.3 Sqoop架构
在这里插入图片描述

2.4 Sqoop import
将数据从关系型数据库导入Hadoop 中
步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息;
步骤2:Sqoop启动一个Map-Only的MR作业,利用元数据信息并行将数据写入Hadoop
在这里插入图片描述
2.5 Sqoop import使用方法
sqoop import
–connect jdbc:mysql://mysql.example.com/sqoop
–username sqoop
–password sqoop
–table cities

–connnect: 指定JDBC URL
–username/password :mysql 数据库的用户名
–table :要读取的数据库表

2.6 Sqoop export
将数据从Hadoop 导入关系型数据库导中
步骤1:Sqoop与数据库Server通信,获取数据库表的元数据信息
步骤2:并行导入数据 :将Hadoop 上文件划分成若干个split.每个split 由一个Map Task 进行数据导入

2.7 Sqoop export 导出
sqoop export
–connect jdbc:mysql://mysql.example.com/sqoop
–username sqoop
–password sqoop
–table cities
–export-dir cities

–connnect: 指定JDBC URL
–username/password :mysql 数据库的用户名
–table : 要导入的数据库表
export-dir : 数据在HDFS 上存放目录

导入HIVE
sqoop import
–connect jdbc:mysql://mysql.example.com/sqoop
–username sqoop
–password sqoop
–table cities
hive-import 导入表对应的location

导入Hbase
sqoop import
–connect jdbc:mysql://mysql.example.com/sqoop
–username sqoop
–password sqoop
–table cities
–hbase-table cities \ #加上表名,
–column-family world #列族

实验
MySQL 中导入数据。再通过Sqoop导入到hdfs中

1.安装 Sqoop
2. 从 从 MySQL 中导入数据到 HDFS

2.1、列出 dylan 数据库的表

sqoop list-tables \   查看当前数据库
--connect jdbc:mysql://localhost:3306/dylan\
--username root --password root

2.2、使用 sqoop 来导入 dylan 数据库的 accounts 表,并保存到 HDFS 的/dylan目录下

sqoop import \
--connect jdbc:mysql://localhost:3306/dylan\  (那个服务器端口的那个数据库)
--username root --password root\
--table acconts \(那个表)
--targe -dir /dylan/account (hdfs中的表)
--null -non-string '\\N'   空值用字符串表示
  1. 查看 查看 导入 的 数据
    hdfs dfs -ls /dylan/accounts 查看hdfs中的数据
    hdfs dfs -tail /dylan/accounts/part-m-00000
    1、列出 accounts 目录的内容
    2、使用 Hue File Browser 或 hdfs 命令的-tail 选项来查看每个文件的最后一
    部分数据
    3、输出的头 6 个数字是 account ID。记住最大的 ID,后面需要用到。

  2. 导入 导入 增量的更新
    1、运行 add_new_accounts.py 脚本来添加新的账户到 MySQL
    2、增量的导入和追加新增的账户到 accounts 目录。使用 Sqoop 基于 acct_num
    列来增量地导入最新的 account ID。
    3、列出 accounts 目录内容来验证 Sqoop 的导入
    4、可以看到三个新文件,使用 Hadoop 的 cat 命令来查看这些文件的内容

sqoop import \
--connect jdbc:mysql://localhost:3306/dylan\  (那个服务器端口的那个数据库)
--username root --password root\
--incremental append \ #追加,增量的模式
--table acconts \(那个表)
--table --dir /dylan\accounts\
--null -non-string '\\N'
--check--column acct_num   基于那个列做增量。增量字段
--last-value   最后的行数(从哪加行)

三、分布式数据存储 HDFS
3.1数据存储:直接通过数据模块得到的数据
HDFS:用户点击日志等
MySQL/Oracle:用户基本信息、用户购买记录等

数据组织:为推荐系统准备数据
将不同的数据源中的数据导入HBase
HBase中以用户为单位组织数据

HDFS多台机器上的分布式文件存储
HDFS是用JAVA实现的文件系统
基于Google的GFS

部署在本地文件系统之上
比如:ext3,ext4或xfs

为海量数据提供冗余存储(一份数据分成多个副本,存在不同的主7上)
使用很成熟的工业标准的计算机

HDFS最适合于合理数量的大文件
百万级,而不是十亿级的文件
每个文件在100MB及以上

HDFS文件是“一次写”的
不允许随机写

HDFS为大文件的连续读作了优化
而不是随机读

3.2文件如何存储文件分不同小文件,再进行分配和存储再不同机器上,
数据文件在加载时拆分成块(默认128MB)并进行分布
每个块被复制到多个数据节点中(默认3份)
NameNode存储元数据 (存每个住机上的对应哪些块结构)

在这里插入图片描述

从local到hdfs
在这里插入图片描述
在这里插入图片描述
接近原则。Cilent和那个Node近,就先给Client推送Node里面的块。

3.3 访问HDFS的方式:
Hadoop
客户端和HDFS之间的数据拷贝
API和命令行

生态项目
Flume
从网络源采集数据(比如,网站、系统日志)
Sqoop
在HDFS和RDBMSs之间传输

3.4命令
从本地磁盘拷贝文件foo.txt到HDFS的用户目录
在这里插入图片描述
文件将会拷贝到/user/username/foo.txt

获取用户home目录的目录列表
在这里插入图片描述

获取HDFS的根目录
在这里插入图片描述

显示HDFS文件/user/fred/bar.txt内容
在这里插入图片描述

在用户home目录下创建input目录
在这里插入图片描述

在这里插入图片描述

删除input_old目录和所有里面的内容
在这里插入图片描述

实验
HDFS 导入文档数据
在这个实验里,你将要使用 HDFS 命令上传文档数据
上传文件到 HDFS
上传新的数据到 HDFS
1、上传 kb 目录到 HDFS 的/dylan 目录

hdfs dfs -put kb/dylan

2、列出目录及文件

hdfs dfs -ls /dylam/kb

查看 HDFS 文件
1、查看之前拷贝到 HDFS 的数据
打印出文档的最后 20 行

hdfs dfs -cat /dylan/kb/KBDOC-00100.html  |less -20

2、找出KBDOC-00100.html 所对应的块
http://master.50070
进入Browse Directory中找到文件就可以查看

3、下载 KBDOC-00100.html 文件到本地文件系统

hdfs dfs -get /dylan/kb/KBDOC-00100.html  /tmp

四、HBase
4.1简介
HBase是一个分布式的、面向列的开源数据库
HBase在Hadoop之上提供了类似于Bigtable的能力
HBase是一个适合于非结构化数据存储的数据库
HBase基于列的而不是基于行的模式
HBase存储的是松散型数据

4.2 HBase逻辑模型
以表的形式存放数据
表由行与列组成,每个列属于某个列族,由行和列确定的存储单元称为元素
每个元素保存了同一份数据的多个版本,由时间戳来标识区分

在这里插入图片描述

4.3 HBase物理存储
HBase是按照列存储的稀疏行/列矩阵
空单元不存储
在这里插入图片描述

4.4 表中存储数据
在HBase中,数据存储为字节数组
任何可以转换成字节数组的对象都可以存储下来
字符串、数字、复杂对象和图片等

单元大小
对值大小的实际限制
通常,单元大小不能超过10MB

4.5列族内的数据存储
HBase表特性
行键+列+时间戳 -->value
行键和值只是字节
可以存储任何能序列化成字节数组的对象
在这里插入图片描述

4.6 HBase物理模型
在这里插入图片描述
Zookeeper 存元数据(数据所在的位置)
HMaster: 管理分布的数据块的分配信息。协调管理个节点
HRegionServer:管理HRegion
HRegion:相当于每一块的数据. 一份行为6000的数据,分为3块,每块2000的数据
Hlog:预写日志。 可以恢复数据
Store:每个列族分开进行处理。
StoreFlie 一份份存入内存再存入文件中。如果文件内存过大则会合并。
最后得到DFS的日志数据。在通过HDFS进行存储。

4.7 HBase使用场景
存储大量的数据(>TB)
需要很高的写吞吐量
大规模数据集很好性能的随机访问(按列)
数据扩展
存储的数据量大,但通常访问小的数据集
数据缓存在内存中来加速查询
不需要全部的关系数据库特性,例如交叉列、交叉表,事务,连接等等

4.8 HBase操作
创建表
在这里插入图片描述
简写
在这里插入图片描述
在这里插入图片描述
后面movie都是列族

HBase可以定义和管理命名空间 (相当于关系数据库的database)
多个表可以属于一个命名空间
当表创建时定义表的命名空间
可以创建、修改或删除命名空间
在这里插入图片描述
有两种提前定义的特殊命名空间
hbase-系统命名空间,存储HBase内部表
Default-默认

在命名空间里创建表
在这里插入图片描述
在这里插入图片描述

列出所有表
在这里插入图片描述

查看表明细
查看表的所有列族,属性和值
在这里插入图片描述

禁用和启用表
禁用表使表处于维护状态
允许运行多种维护操作
阻止所有客户端访问
需要几分钟来禁用表
在这里插入图片描述
退出维护状态
在这里插入图片描述
Drop命令删除表并移除所有HDFS的文件
需要先禁用表
在这里插入图片描述
Truncate命令删除表的所有行
表和列族的模式不受影响
不需要手动的禁用表
在这里插入图片描述
使用put插入行
通用格式
在这里插入图片描述
示例
在这里插入图片描述
使用get获取行
通用格式:
在这里插入图片描述
例子:
在这里插入图片描述

使用scan返回一组行
通用格式:
在这里插入图片描述

6.8实验 HBase shell 中的数据访问 (把sql文件导入Linux得到数据库,再通过Sqoop导入HBase)
在这个实验里,你将要使用 HBase shell 来上传和获取数据
安装 HBase
创建 HBase 表并生成数据
1、创建 user 和 movie 表
2、导入 mysql 中的 user、movie 和 movierating 的数据到 hbase 中
HBase 表数据操作
1、查看表结构
2、插入数据到 user 表,内容如下:
行键 10000,age:30,gender:F,occupationname:Shanghai,zip:
90210
3、更新 age
Age->31,32
4、获取行键 10000 的 age 记录
5、获取行键 10000 的所有 age 列记录
6、扫描整个表,但只查看 age 列
7、删除 user 表行键为 10000 的列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值