编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

大数据学习之路(二)(大数据学习顺序)

wxchong 2024-08-07 02:17:06 开源技术 16 ℃ 0 评论

数据的收集

  • 外部数据收集(互联网数据收集)

网络爬虫:从页面获取的策略分为几个大类:深度优先、宽度优先和最佳优先三种。

  • 深度优先

该策略从起始网页开始,选择一个URL进入,分析这个网页中的URL,然后再选择另一个URL进入。如此一个链接一个链接地抓取下去,直到处理完整条路线之后再处理下一条路线。可以用栈来实现。

存在的问题:通常门户网站的链接往往是最具价值的,评级也很高,但随着每一层的深入,网页的价值就会相应地有所下降。这就暗示了重要网页通常距离种子较近,而过度深入抓取到的网页却价值很低。合理的控制深度是该种策略的关键。

  • 宽度优先(广度优先)

这个策略是指在抓取过程中,只有在完成当前层次的搜索之后,才进行下一层次的搜索。可以用队列实现。

  • 最佳优先(聚焦、定向)

当需要爬取的网页数量很庞大的时候,无论是深度优先还是宽度优先可能都不能高效地获取用户所关心的内容,而最佳优先策略只访问经过网页分析算法预测为“相关”的网页,在一定程度上缓解了之前两种策略重“量”不重“质”的局面。

如何判断新获取的网页和用户定义的候选网页之间的相似度呢?

常见的算法模型:布尔模型、基于偏序的布尔模型、向量空间模型、概率模型和语言模型,等等。

在数据的爬取方面,Nutch和Heritrix都是不错的开源系统,可以帮助我们快速实现爬取。

两者区别:

  • Nutch集成了Lucene对于抓取内容的索引和检索是非常方便的。Heritrix时,用户需要自己负责文件格式的转换、索引和检索等工作。Heritrix网络蜘蛛的功能更为强大,可以专注于网络信息的下载。

  • 从对待爬取内容的处理方式上看,Nutch只获取并保存可索引的内容,且可以对下载内容进行过滤修改,而Heritrix则适用于各种类型的信息,力求保持网页原貌。另外,Nutch一般是通过刷新操作将旧内容替换为新内容的,而Heritrix则是不断追加新内容。

  • 从用户使用来看,Nutch采用命令行运行和控制。而Heritrix有Web控制管理界面,更为人性化一些。Nutch的定制能力不算很强,而Heritrix可控制的参数比较多,只是配置起来有点麻烦。

  • 内部数据收集

收集的模型,内部数据的收集主要分为推送(Push)和拉取(Pull)两大类。Flume、Scribe和Logstash等开源方案,提供了拉取或推送的采集模式,提供了不同的特性和选择。”

  • Flume

我们可以将源头想象成为一个水龙头,沉淀器是一个水桶,而通道就是水管。水管两头分别接上水龙头和水桶,当水龙头打开,水就源源不断地通过水管流入水桶。

Flume的优势是支持集群,并且数据流可以多级嵌套。

  • Facebook的Scribe和Logstash

它们是采用推送模式的代表。

数据存储

NoSQL(Not Only SQL)它泛指非关系型的数据库。

HDFS(Hadoop Distributed File System)和对应的分布式非关系型(非结构化)数据库系统HBase。

Hadoop优势:

  • 透明性:使用者可以在不了解Hadoop分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。

  • 高扩展性:扩展分为纵向扩展和横向扩展,纵向扩展将增加单机的资源,总会达到瓶颈;而横向将增加集群中的机器数量,获得近似线性增加的性能,不容易达到瓶颈。Hadoop集群中的节点资源,采用的就是横向方式,可以方便地进行扩充,并获得显著的性能提升。

  • 高效性:由于采用了多个资源并行处理,使得Hadoop不再受限于单机操作(特别是较慢的磁盘I/O读写),可以快速地完成大规模的任务。加上其所具有的可扩展性,随着硬件资源的增加,性能将会得到进一步的提升。

  • 高容错和高可靠性:Hadoop中的数据都有多处备份,如果数据发生丢失或损坏,能够自动从其他副本(Replication)进行复原。同理,失败的计算任务也可以分配到新的资源节点,进行自动重试。

  • 低成本:正是因为Hadoop有良好的扩展性和容错性,所以没有必要再为其添置昂贵的高端服务器。廉价的硬件,甚至是个人计算机都可以成为资源节点。

Hadoop框架的最核心元素就是HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce为海量的数据提供了计算。

如何理解HDFS的体系架构?

快消品公司的虚拟案例

  • 扩建仓库:单个仓库的扩建,就是所谓的纵向扩展。纵向扩展很容易达到瓶颈,建立仓库是这样,计算机系统也同样如此。例如单机的硬盘和内存,不可能无限制地被加大。这时就需要考虑横向扩展了,在郊区新建一个仓库,在计算机系统中就是增加新的机器作为资源节点,不过这些机器节点存储的不再是纯净水,而是数据。在HDFS中,这些存储数据的节点被称为数据节点(Data Node)。

  • 增加协调部门:协同部门可以实时收集各个仓库的运作情况,并决策将进货存放在哪里更为合适。在HDFS中,扮演这个角色的节点称为命名节点(Name Node),它维护着系统中的大量元数据,负责管理文件系统的命名空间(Name Space)和控制外部的访问,包括打开、关闭、重命名文件或目录,将数据块映射到具体的数据节点等。随着协同部门职能重要性的日益增加,总公司可能还会将其管理内容进行备份,这就是次要命名节点(Secondary Name Node)。次要命名节点和命名节点的区别在于,它不会与数据节点和其他任务节点沟通,也不接收HDFS上的任何变化记录。次要命名节点最主要的目标就是与命名节点通信,根据配置定期地获取命名节点上的HDFS元数据快照,因此效率是非常高的。

  • 在多个仓库中进行备货:意外总是会发生,为了防止意外导致缺货的情况发生,可以采用的一项策略是将货物存储在多地的仓库中。在HDFS中也有同样的理念,这就是备份或副本(Replication)。存储在数据节点上的数据库可以有多个副本,并分发到其他节点上。这样在某个数据节点上丢失的数据,可以在其他数据节点上找到并恢复。容错性得以提升。

HDFS存在如下几个弱点:

  • 不适合实时性很强的数据访问。(数据查询)

  • 无法高效存储大量小文件。

  • HDFS对多用户的写入及文件任意修改的支持也不足。文件并发时的写入者只有1个,而且写操作只能在文件末尾追加新的数据,还不能在文件的任意位置进行插入。

  • HBase

基于HDFS的数据库系统。它是一个分布式的、面向列的开源数据库,适合于非结构化数据的数据库,最大的特点是基于列而不是基于行的模式进行存储。

关系型数据库优势,查询简单,有强事务。

HBase几个关键概念:

  • 表格(Table):HBase同样用二维表格来组织数据。

  • 行(Row):在表格里,每一行代表一条记录,每行通过行键(Row Key)进行唯一标识。

  • 列族(Column Family):了解这点很关键,行里的字段按照列族进行分组,可以看作一堆属性或字段的集合。

  • 列限定符(Column Qualifier):列族里包括多个属性,限定符可以帮助定位列族里的数据。与列族不同,列限定符没有必要预先被定义,因此每行可以拥有不同数量和名称的限定符。

  • 单元(Cell):二维表里的单元格,通过行键、列族和列限定符来唯一确定。存储在其中的值称为单元值(Cell Value)。

  • 版本(Version):注意,这是HBase与很多数据库的不同之处。即使单元被确定了,里面的单元值仍然可以根据时间的不同拥有多个版本。版本用时间戳(Timestamp)来标识。读取的时候如果没有指定时间戳,那就默认获取最近的版本。

  • MongonDB(文档型存储)

它的主要功能特性为面向集合存储,且拥有自由的Schema模式定义方式。所谓的“面向集合”,意思是数据被分组存储在数据集中,该数据集称为一个集合(Collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。

MongoDB和HBase也存在差异

  • 底层的支持:HBase是架构在HDFS之上的,它会将数据按照列拆分开来存储,对MapReduce?支持得非常好。而MongoDB则会直接将整个数据存储在文件系统之上,与HDFS没有关联。

  • 数据模型:HBase的数据模型和关系型的二维表非常相似,其灵活性体现在列式存储上。而MongoDB的数据模型是以文档为基本单位的,其灵活性体现在文档可以支持多种复杂的结构。

非持久化存储系统,Memcached、Berkeley DB和Redis。不过,需要注意的是,系统属于持久化还是非持久化,有时划分得并没有那么绝对。这里的划分主要是按照这些系统目前在业界最常见的应用方式进行的。

  • Memcached

尽管Memcached是“分布式”缓存服务器,但服务器端并没有完整的分布式功能,例如切片(Sharding)和副本(Replication),各个Memcached服务器之间也不会互相通信以共享信息,因此需要应用端来实现类似的逻辑。

  • Redis

它是一个开源的、高性能的、基于键–值型的缓存和存储系统。支持分布式集群。Redis的特性主要包括:提供了极高的性能、支持多种数据类型、支持事务性(一定程度上)、可设定生命周期、提供持久化存储等。

数据处理

根据处理的及时性不同,主要分为离线处理和在线处理。介于二者之间,还会介绍提升及时性的消息机制。

  • 离线批量处理(MapReduce)

水源分级的整个流程。

MapReduce框架包含几个重要的组成模块:

  • 数据分割(Data Splitting):将数据源进行切分,并将分片发送到Mapper上。例如对文档的每一行作为最小的处理单元。

  • 映射(Mapping):Mapper根据应用的需求,将内容按照键-值的匹配,存储到散列结构<k1,v1>中。

  • 洗牌(Shuffling):将键-值的配对不断地发给Reducer进行归约。如果存在多个Reducer,还会使用分配(Partitioning)对Reducer进行选择。

  • 归约(Reducing):分析接收到的一组键值配对,如果是键内容相同的配对,就将它们的值合并。

  • 为了提升洗牌阶段的效率,可以选择减少发送到归约阶段的键-值配对。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表