1 分布式数据收集
1.1 推荐系统数据收集需求
- 推荐系统数据收集需求:
将各种数据收集到一个中央化的存储系统中,有利于进行集中式的数据分析与数据共享 - 用户行为数据是多样化的
用户访问日志,产品信息,用户基本信息 - 推荐系统数据收集难点:
数据分散在各个离散的设备上,数据保存在传统的存储设备和系统中
1.2 常见数据来源
- 分散的数据源(由不同系统组件产生,部署在不同机器上):用户访问日志,用户购买日至,用户收藏日志,用户搜索日志
- 关系型数据:用户注册信息,保存在关系型数据库MySQL,Oracle等
1.3 常见的开源数据收集系统
- 数据收集:Flume, Scribe
- 传统数据库与Hadoop:Sqoop
1.3 Flume是什么
- 由Cloundera公司开源
- 分布式、可靠、高可用的海量日志采集系统
- 数据源可定制,可扩展
- 数据存储系统可定制,可扩展
- 中间件:屏蔽了数据源和数据存储系统的异构性
1.4 Flume特点
- 可靠性:保证数据不丢失
- 可扩展性:各组件数目可扩展
- 高性能:吞吐率很高,能满足海量数据收集需求
- 可管理性:可动态增加和删除组件
- 文档丰富,社区活跃:已成为Hadoop生态系统标配
1.5 FlumeNG基本架构
1.6 Flume NG核心概念
- Event
- Client
- Agent:Source,Channel,Sink
1.6.1 Event
- Event是Flume数据传输的基本单位
- Flume以事件的形式将数据从源头传送到最终的目的
- Event由可选的header和载由数据的一个byte array构成
载有的数据对flume是不透明的
Header是容纳了key-value字符串对的无序集合,key在集合内使唯一的
Header可以在上下文路由中使用扩展
1.6.2 Client
- Client是一个将原始log包装成events并且发送它们到一个或多个agent的实体
- 目的是从数据源系统中解耦FLume
- 在flume的拓扑结构中不是必须的
- Client实例:
Flume log4J Appender
可以使用Client SDK(org.apache.flume.api)定制特定的Client
1.6.3 Agent
- 一个Agent包含Source,Channel,Sink和其他组件
- 它利用这些组件将events从一个节点传输到另一个节点或最终目的
- Agent是flume流的基础部分
- Flume为这些组件提供了配置、生命周期管理、监控支持
1.6.4 Agent之Source
- Source负责接收event或通过特殊机制产生event,并将events批量的放到一个或多个Channel
- 包含event驱动和轮询2种类型
- 不同类型的Source:
与系统集成的Source:Syslog,Netcat
自动生成时间的Source:Exec
用于Agent和Agent之间通信的IPC Source:Avro、Thrift - Source必须至少和一个channel关联
1.6.5 Agent之Channel
1.6.6 Agent之Sink
1.6.7 其他组件
1.7 常用拓扑实例
1.7.1 第一层配置实例
1.7.2 第二层配置实例
2 使用Flume收集Web日志数据
2.1 安装Flume
直接解压即可
2.2 为Fume采集数据创建HDFS目录
创建HDFS目录 /data/weblogs 来存放Flume采集的数据
[root@master ~]# hdfs dfs -mkdir -p /data/weblogs
2.3 为Web日志输出出来创建本地目录
1.创建一个spool目录,通过web日志模拟器生成数据到这个目录来给Flume采集。
[root@master flume]# mkdir -p weblogs_spooldir
2.赋予写权限给所有用户
[root@master ~]# chmod a+w -R flume
2.4 配置Flume
wlagent.sources = weblogSrc
wlagent.channels = memoryChannel
wlagent.sinks = hdfsSink
# For each one of the sources, the type is defined
wlagent.sources.weblogSrc.type = spooldir
wlagent.sources.weblogSrc.spoolDir = /home/hadoop/flume/weblogs_spooldir
# The channel can be defined as follows.
wlagent.sources.weblogSrc.channels = memoryChannel
# Each sink's type must be defined
wlagent.sinks.hdfsSink.type = hdfs
wlagent.sinks.hdfsSink.hdfs.path = /data/weblogs
wlagent.sinks.hdfsSink.hdfs.rollInterval = 0
wlagent.sinks.hdfsSink.hdfs.rollCount = 0
wlagent.sinks.hdfsSink.hdfs.rollSize = 5242880
wlagent.sinks.hdfsSink.hdfs.fileType = DataStream
#Specify the channel the sink should use
wlagent.sinks.hdfsSink.channel = memoryChannel
# Each channel's type is defined.
wlagent.channels.memoryChannel.type = memory
# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
wlagent.channels.memoryChannel.capacity = 100000
wlagent.channels.memoryChannel.transactioCapacity = 10000
2.5 运行Agent
使用刚刚创建的配置文件启动Flume agent
[root@master bin]# ./flume-ng agent -n wlagent --conf-file ../conf/flume-conf.properties
出现这个情况
修改flume-env.sh文件
export JAVA_OPTS="-Xmx500m"
再执行
[root@master bin]# ./flume-ng agent -n wlagent --conf /home/hadoop/flume/conf --conf-file ../conf/flume-conf.properties -Dflume.root.logger=INFO,consloe
2.6 模拟Apache Web Server输出
3 Sqoop是什么
- Sqoop:SQL-to-Hadoop
- 链接传统关系型数据库和Hadoop的桥梁
把关系型数据库的数据导入到Hadoop系统(如HDFS、HBase和Hive)中
把数据从Hadoop系统里抽取并导出到关系型数据库里 - 利用MapReduce加快数据传输速度
- 批处理方式进行数据传输
3.1 Sqoop优势
- 高效、可控地利用资源:任务并行度,超时时间等
- 数据类型映射与转换:可自动进行,用户也可自定义
- 支持多种数据库:MySQL,Oracle,PostgreSQL
3.2 Sqoop架构
3.2 Sqoop import
3.2.1 Sqoop import使用方法
3.3 Sqoop export
3.3.1 Sqoop export使用方法
3.4 Sqoop 与其他系统结合
4 使用Sqoop从Mysql中导入数据
在这个练习里,使用Sqoop从MySQL中导入数据到HDFS
4.1 安装Sqoop
直接解压即可
4.2 从MySQL中导入数据到HDFS(未实现)
1、创建数据库,并加载sql文件
mysql> create database sqoop_test;
mysql> source /home/hadoop/data/accounts.sql
2、使用sqoop来导入数据库的accounts表,并保存到HDFS的目录下
sqoop list-tables \
--connect jdbc://master:3306/sqoop_test \
--username root --password root
4.3 查看数据
1、列出accounts目录的内容
2、使用Hue File Browser或hdfs命令的-tail选项来查看每个文件的最后一部分数据
3、输出的头6个数字书account ID。记住最大的ID,后面需要用到