https://blog.csdn.net/marvel_cheng/article/details/45480521
https://blog.csdn.net/qq_26437925/article/details/78467216
http://blog.fens.me/hadoop-family-roadmap/
https://www.cnblogs.com/pangguoming/p/8460747.html

Hadoop

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS

HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。

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

  1. Hadoop解决哪些问题?

    海量数据需要及时分析和处理

    海量数据需要深入分析和挖掘

    数据需要长期保存

  2. 海量数据存储的问题:

    磁盘IO称为一种瓶颈,而非CPU资源

    网络带宽是一种稀缺资源

    硬件故障成为影响稳定的一大因素

Hadoop 相关技术

Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架构。

Apache Pig: 是一个基于Hadoop的大规模数据分析工具,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。

Apache HBase: 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

Apache Sqoop: 是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Apache Zookeeper: 是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务

Apache Mahout:是基于Hadoop的机器学习和数据挖掘的一个分布式框架。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题。

Apache Cassandra:是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身

Apache Avro: 是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用。Avro是新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制

Apache Ambari: 是一种基于Web的工具,支持Hadoop集群的供应、管理和监控。

Apache Chukwa: 是一个开源的用于监控大型分布式系统的数据收集系统,它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。

Apache Hama: 是一个基于HDFS的BSP(Bulk Synchronous Parallel)并行计算框架, Hama可用于包括图、矩阵和网络算法在内的大规模、大数据计算。

Apache Flume: 是一个分布的、可靠的、高可用的海量日志聚合的系统,可用于日志数据收集,日志数据处理,日志数据传输。

Apache Giraph: 是一个可伸缩的分布式迭代图处理系统, 基于Hadoop平台,灵感来自 BSP (bulk synchronous parallel) 和 Google 的 Pregel。

Apache Oozie: 是一个工作流引擎服务器, 用于管理和协调运行在Hadoop平台上(HDFS、Pig和MapReduce)的任务。

Apache Crunch: 是基于Google的FlumeJava库编写的Java库,用于创建MapReduce程序。与Hive,Pig类似,Crunch提供了用于实现如连接数据、执行聚合和排序记录等常见任务的模式库

Apache Whirr: 是一套运行于云服务的类库(包括Hadoop),可提供高度的互补性。Whirr学支持Amazon EC2和Rackspace的服务。

Apache Bigtop: 是一个对Hadoop及其周边生态进行打包,分发和测试的工具。

Apache HCatalog: 是基于Hadoop的数据表和存储管理,实现中央的元数据和模式管理,跨越Hadoop和RDBMS,利用Pig和Hive提供关系视图。

ClouderaHue:是一个基于WEB的监控和管理系统,实现对HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操作和管理。

1. Hbase

Nosql数据库,Key-Value存储
最大化利用内存

2. HDFS

hadoop distribute file system(分布式文件系统)
Hadoop分布式文件系统(HDFS)是一个高度容错性的系统,适合部署在廉价的机器上。
HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用最大化利用磁盘Hbase是一个Nosql 数据库,是一个Key-Value类型的数据库,是高可靠、面向列的、可伸缩的、分布式的数据库。

适用于非结构化的数据存储,底层的数据存储在HDFS上。

3. MapReduce

编程模型,主要用来做数据分析
MapReduce分布式离线计算框架,是Hadoop核心编程模型。主要适用于大批量的集群任务,由于是批量执行,故时效性偏低
最大化利用CPU

Yarn(Hadoop2.0)

前期了解即可,Yarn是一个资源调度平台,主要负责给任务分配资源。
Yarn是一个公共的资源调度平台,所有满足条件的框架都可以使用Yarn来进行资源调度。

Hive

 Hive是一个数据仓库,所有的数据都是存储在HDFS上的。使用Hive主要是写Hql,非常类似于Mysql数据库的Sql。其实Hive在执行Hql,底层在执行的时候还是执行的MapRedce程序

Spark

 Spark 是专为大规模数据处理而设计的快速通用的计算引擎,其是基于内存的迭代式计算。Spark 保留了MapReduce 的优点,而且在时效性上有了很大提高。

Spark Streaming

 Spark Streaming是实时处理框架,数据是一批一批的处理。

Spark Hive

 基于Spark的快速Sql检索。Spark作为Hive的计算引擎,将Hive的查询作为Spark的任务提交到Spark集群上进行计算,可以提高Hive查询的性能

Storm

 Storm是一个实时计算框架,和MR的区别就是,MR是对离线的海量数据进行处理,而Storm是对实时新增的每一条数据进行处理,是一条一条的处理,可以保证数据处理的时效性

Zookeeper

 Zookeeper是很多大数据框架的基础,它是集群的管理者。监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户

Kafka

 kafka是一个消息中间件,在工作中常用于实时处理的场景中,作为一个中间缓冲层

Flume

 Flume是一个日志采集工具,常见的就是采集应用产生的日志文件中的数据,一般有两个流程。一个是Flume采集数据存储到Kafka中,方便Storm或者SparkStreaming进行实时处理。另一个流程是Flume采集的数据存储到HDFS上,为了后期使用hadoop或者spark进行离线处理

Pig

 Yahoo开发的,并行地执行数据流处理的引擎,它包含了一种脚本语言,称为Pig Latin,用来描述这些数据流。Pig Latin本身提供了许多传统的数据操作,同时允许用户自己开发一些自定义函数用来读取、处理和写数据。在LinkedIn也是大量使用

4.集中式系统

集中式系统用一句话概括就是:一个主机带多个终端。终端没有数据处理能力,仅负责数据的录入和输出。而运算、存储等全部在主机上进行。现在的银行系统,大部分都是这种集中式的系统,此外,在大型企业、科研单位、军队、政府等也有分布。集中式系统,主要流行于上个世纪。

集中式系统的最大的特点就是部署结构非常简单,底层一般采用从IBM、HP等厂商购买到的昂贵的大型主机。因此无需考虑如何对服务进行多节点的部署,也就不用考虑各节点之间的分布式协作问题。但是,由于采用单机部署。很可能带来系统大而复杂、难于维护、发生单点故障(单个点发生故障的时候会波及到整个系统或者网络,从而导致整个系统或者网络的瘫痪)、扩展性差等问题。

5. 分布式系统(distributed system)

一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。分布式意味着可以采用更多的普通计算机(相对于昂贵的大型机)组成分布式集群对外提供服务。计算机越多,CPU、内存、存储资源等也就越多,能够处理的并发访问量也就越大。

一个标准的分布式系统应该具有以下几个主要特征:

(1)分布性

分布式系统中的多台计算机之间在空间位置上可以随意分布,系统中的多台计算机之间没有主、从之分,即没有控制整个系统的主机,也没有受控的从机。

(2)透明性

系统资源被所有计算机共享。每台计算机的用户不仅可以使用本机的资源,还可以使用本分布式系统中其他计算机的资源(包括CPU、文件、打印机等)。

(3)同一性

系统中的若干台计算机可以互相协作来完成一个共同的任务,或者说一个程序可以分布在几台计算机上并行地运行。

(4) 通信性

系统中任意两台计算机都可以通过通信来交换信息。
分布式数据和存储

大型网站常常需要处理海量数据,单台计算机往往无法提供足够的内存空间,可以对这些数据进行分布式存储。

6. 分布式计算

随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。分布式计算将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。
关系型数据库, MapReduce (大规模数据批量分析)

数据访问效率

磁盘寻址时间提高速度远远小于数据传输速率提高速度(寻址是将磁头移动到特定硬盘位置进行读写操作,这是导致硬盘操作延迟的主要原因,而传输速率取决于硬盘的带宽)。对于超大规模数据(以PB为单位)必须考虑使用其他方式。关系型数据库使用B树结构进行数据的更新查询操作,对于最大到GB的数据量,一般相对数据量较小,效果很好。但是大数据量时,B树使用排序/合并方式重建数据库以更新数据的效率远远低于MapReduce。
数据结构不同

结构化数据

(structured data):是具体既定格式的实体化数据,如XML文档或满足特定预定义格式的数据库表。这是RDBMS包括的内容。
半结构化数据

半结构化数据

(semi-structured data):比较松散,虽然可能有格式,但是经常被忽略,所以他只能作为对的一般指导。如:一张电子表格,其结构是由单元格组成的网格,但是每个单元格自身可保存任何形式的数据。
非结构化数据

非结构化数据
(unstructured data):没有什么特别的内部结构,如纯文本或图像数据。

关系型数据使用的是结构化数据,在数据库阶段按具体类型处理数据。关系型数据的规范性非常重要,保持数据的完整性,一致性。
MapReduce 线性,可伸缩性编程

程序员需要编写 map函数 和 reduce函数。每个函数定义从一个键值对集合到另一个键值对集合的映射。
MapReduce 工作原理

map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。

reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

7. HDFS

HDFS采用master/slave架构

(1) rack

放服务器的支架。

一个Block的副本会保存到两个或两个以上的机架上的服务器中,这样能防灾容错,因为一个机架出现掉电,交换机挂了的概率还是很高的。
数据块

linux中每个磁盘有默认的数据块大小,这是对磁盘操作的最小单位,通常512字节。HDFS同样也有块(Block)的概念,默认64MB/128MB,比磁盘块大得多。与单一的文件系统类似,HDFS上的文件系统也被划分成多个分块(Chunk)作为独立的存储单元。

一个hadoop文件就是由一系列分散在不同的DataNode上的block组成。

(2) HDFS默认的Block为64MB/128MB?

块相对较大,主要是把寻道时间最小化。如果一个块足够大,从硬盘传输数据的时间将远远大于寻找块起始位置的时间。这样使得HDFS的数据块速度和硬盘的传输速度更加接近。

(3) NameNode 元数据节点

NameNode的作用是管理文件目录结构,接受用户的操作请求,是管理数据节点的,是一个jetty服务器。名字节点维护两套数据, 一套是文件目录与数据块之间的关系 , 另一套是数据块与节点之间的关系 。 前一套 数据是 静态的 ,是存放在磁盘上的, 通过fsimage和edits文件来维护 ; 后一套 数据是 动态的 ,不持久放到到磁盘的,每当集群启动的时候,会自动建立这些信息,所以一般都放在内存中。

NameNode保存文件metadata信息,包括:

文件owership和permissions文件包含哪些块Block保存在哪个DateNode(由DataNode启动时上报给)

例如一个Metadata

file.txt
Blk A:
DN1,DN5,DN6

Blk B:
DN7,DN1,DN2

Blk C:
DN5,DN8,DN9

1
2
3
4
5
6
7
8
9

NameNode的metadata信息在启动后会加载到内存中

文件包括:

fsimage (文件系统镜像):元数据镜像文件。存储某一时段NameNode内存元数据信息。

edits: 操作日志文件。

fstime: 保存最近一次checkpoint的时间

NameNode决定是否将文件映射到DataNode的复制块上:多副本,默认三个,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储到不同机架的某个节点上。

转自:http://www.cnblogs.com/gisorange/p/4328859.html

(4) DataNode

DataNode的作用是HDFS中真正存储数据的。

DataNode的作用:

保存Block,每个块对应一个元数据信息文件。这个文件主要描述这个块属于哪个文件,第几个块等信息。启动DataNode线程的时候会向NameNode汇报Block信息通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode 10分钟没有收到DataNode的心跳,认为其已经lost,并将其上的Block复制到其它的DataNode.

假设文件大小是100GB,从字节位置0开始,每64MB字节划分为一个block,依此类推,可以划分出很多的block。每个block就是64MB大小。block是hdfs读写数据的基本单位。

(5) Secondary NameNode(辅助元数据信息)

Secondary NameNode是一个用来监控HDFS状态的辅助后台程序。定期的将Namespace镜像与操作日志文件(edit log)合并,以防止操作日志文件(edit log)变得过大;能减少NameNode启动时间。

它不是NameNode的热备份,可以作为一个冷备份

  • 将本地保存的fsimage导入
  • 修改cluster的所有DataNode的NameNode地址
  • 修改所有client端的NameNode地址
  • 或者修改Secondary NameNode IP为 NameNode IP


hadoop读取文件


hadoop写文件

Hadoop在创建新文件时是如何选择block的位置的呢
综合来说,要考虑以下因素:带宽(包括写带宽和读带宽)和数据安全性。如果我们把三个备份全部放在一个datanode上,虽然可以避免了写带宽的消耗,但几乎没有提供数据冗余带来的安全性,因为如果这个datanode当机,那么这个文件的所有数据就全部丢失了。另一个极端情况是,如果把三个冗余备份全部放在不同的机架,甚至数据中心里面,虽然这样数据会安全,但写数据会消耗很多的带宽。Hadoop 0.17.0给我们提供了一个默认replica分配策略(Hadoop 1.X以后允许replica策略是可插拔的,也就是你可以自己制定自己需要的replica分配策略)。replica的默认分配策略是把第一个备份放在与客户端相同的datanode上(如果客户端在集群外运行,就随机选取一个datanode来存放第一个replica),第二个replica放在与第一个replica不同机架的一个随机datanode上,第三个replica放在与第二个replica相同机架的随机datanode上。如果replica数大于三,则随后的replica在集群中随机存放,Hadoop会尽量避免过多的replica存放在同一个机架上。

转自:http://www.cnblogs.com/beanmoon/archive/2012/12/17/2821548.html

(5) NameNode 安全模式

在分布式文件系统自动的时候,开始时会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中不允许有上传,修改,删除等写操作,只能读,直到安全模式结束。

1) namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作

2) 一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不要SecondaryNameNode)和一个空的日志edits文件

3) NameNode开始监听RPC和HTTP请求

4) 此刻namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的。(可以显示目录,显示文件内容等;写,删除,重命名等操作都会失败)

5) 系统中的数据块的位置不是有namenode维护的,而是以块列表的形式存储在datanode中(datanode启动汇报的)

6) 在系统的正常操作期间,namenode会在内存中保留所有块位置的映射信息

7)在安全模式下,各个datanode会向namenode发送块列表的最新情况

8) 进入和离开安全模式

查看namenode处于哪个状态
hadoop dfsadmin -sagemode get

进入安全模式(hadoop启动的时候是在安全模式)
hadoop dfsadmin -sagemode enter

离开安全模式
hadoop dfsadmin -sagemode leave
Hadoop中的RPC机制

同其他RPC框架一样,Hadoop RPC分为四个部分:

(1)序列化层:Clent与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型;

(2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用;

(3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制;

(4)服务器端框架层:RPC Server利用java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力;

分类记忆:

MapReduce/Spark/Storm(并行计算架构):

1、数据处理方式来说分离线计算和在线计算:


角色 | 描述
MapReduce | MapReduce常用于离线的复杂的大数据计算
Storm | Storm用于在线的实时的大数据计算,Storm的实时主要是一条一条数据处
Spark | 可以用于离线的也可用于在线的实时的大数据计算,Spark的实时主要是处理一个个时间区域的数据,所以说Spark比较灵活。

2、数据存储位置来说分磁盘计算和内存计算:

角色 | 描述

MapReduce | 数据存在磁盘中
Spark和Strom | 数据存在内存中

3、Pig/Hive(Hadoop编程):
角色 | 描述
Pig | 是一种高级编程语言,在处理半结构化数据上拥有非常高的性能,可以帮助我们缩短开发周期。
Hive | 是数据分析查询工具,尤其在使用类SQL查询分析时显示出极高的性能。可以在分分钟完成ETL要一晚上才能完成的事情,这就是优势,占了先机!

4、HBase/Sqoop/Flume(数据导入与导出):

角色| 描述

HBase | 是运行在HDFS架构上的列存储数据库,并且已经与Pig/Hive很好地集成。通过Java API可以近无缝地使用HBase。
Sqoop | 设计的目的是方便从传统数据库导入数据到Hadoop数据集合(HDFS/Hive)。
Flume | 设计的目的是便捷地从日志文件系统直接把数据导入到Hadoop数据集合(HDFS)中。

以上这些数据转移工具都极大地方便了使用的人,提高了工作效率,把精力专注在业务分析上。

5、ZooKeeper/Oozie(系统管理架构):

角色 | 描述

ZooKeeper | 是一个系统管理协调架构,用于管理分布式架构的基本配置。它提供了很多接口,使得配置管理任务简单化。
Oozie | Oozie服务是用于管理工作流。用于调度不同工作流,使得每个工作都有始有终。这些架构帮助我们轻量化地管理大数据分布式计算架构。

6、Ambari/Whirr(系统部署管理):

角色 | 描述
Ambari | 帮助相关人员快捷地部署搭建整个大数据分析架构,并且实时监控系统的运行状况。
Whirr | Whirr的主要作用是帮助快速地进行云计算开发。

Mahout(机器学习):
Mahout旨在帮助我们快速地完成高智商的系统。其中已经实现了部分机器学习的逻辑。这个架构可以让我们快速地集成更多机器学习的智能。

hadoop 中各种概念解释记忆相关推荐

  1. php中的pecl是什么,什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释

    什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释 概述 关于PEAR,PECL这两个东西,初学PHP的时候就知道,但是貌似用的人很少再加上以前也是在Windows下做开发,所以了解的不多 ...

  2. 关于LCD控制器中一些寄存器的概念解释

    关于LCD控制器中一些寄存器的概念解释 TFT屏工作时序 1) VSYNC(VFRAME):帧同步信号 HSYNC(VLINE)    :行同步信号 VDEN(VM /DE)     :数据有效标志信 ...

  3. CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解

    feature map.卷积核.卷积核个数.filter.channel的概念解释 feather map的理解 在cnn的每个卷积层,数据都是以三维形式存在的.你可以把它看成许多个二维图片叠在一起( ...

  4. Hadoop 大数据概念那些事儿

    又开始接触大数据了,相比较2013年的Hadoop发觉新增了太多组件,近五年真是... 话不多说,常见的概念应用场景先搞清楚 文章目录 Hadoop HDFS 适用场景 参考 YARN 百度百科中的Y ...

  5. 数据蒋堂 | Hadoop中理论与工程的错位

    作者:蒋步星 来源:数据蒋堂 校对:林亦霖 本文共1400字,建议阅读6分钟. 本文分析了在Hadoop的设计和实现中的理论问题和工程问题. Hadoop是当前重要的大数据计算平台,它试图摒弃传统数据 ...

  6. Hadoop中任务提交运行流程

    在Hadoop中提交一个任务大致分为6个步骤,分别为: 作业提交 -> 作业初始化 –> 任务分配 –> 任务执行 –> 更新任务执行进度和状态 -> 作业完成 目录 作 ...

  7. Hadoop的基本概念和简单使用

    文章目录 1.概念 1.1.Hadoop 1.0和Hadoop 2.0 什么是Hadoo1.0 什么是Hadoo2.0 两者区别 Hadoop整体框架区别 MapReduce计算框架区别 1.2.Ma ...

  8. faster-rcnn原理及相应概念解释

    R-CNN --> FAST-RCNN --> FASTER-RCNN R-CNN: (1)输入测试图像: (2)利用selective search 算法在图像中从上到下提取2000个左 ...

  9. EBS模块介绍和概念解释

    Oracle模块介绍和概念解释 Oracle重要模块简介 账套 会议科目表 记账本位币 会议日历的财务报告实体 组织 业务组 公司的最高部门 法人实体 提交财务和税务报表的法人公司 经营单位 orac ...

最新文章

  1. java cmd copy_将CMD输出复制到剪贴板
  2. 游戏AI之初步介绍(0)
  3. Apache OFBIZ高速上手(二)--MVC框架
  4. 关于HP ILO 卡图形界面无响应的解决方案
  5. Java中UDP协议的基本原理和简单用法
  6. 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试
  7. Exec l 中分列的作用
  8. c语言编写一个多位数的倒数
  9. python写网页插件_用python 实现activex网页控件
  10. FastDFS配置之常见错误
  11. java treeset排序_java TreeSet的排序之自然排序
  12. 【Arduino】基于Arduino的循迹小车电路连接与程序编写
  13. 解决 | 点击任务栏没有反应
  14. 深度学习实战(十一)——多标签分类(基于Keras)
  15. leetcode(19):Anagrams (字谜游戏)
  16. 太阳能逐日自动跟踪系统,太阳能光伏追光追日发电实训系统
  17. 写给新人程序猿的15点建议:苦逼程序员的辛酸反省与总结
  18. 托福艺术导向(纪录片《文明》单词总结)PART1
  19. 雪亮工程 视频分类总结
  20. 一个快捷的计算e的值(第4章-5 求e的近似值 (15分))

热门文章

  1. openwrt c语言配置文件,OpenWrt学习笔记7 -- 让人类重建巴别塔的UCI之UCI配置文件
  2. “超越巴菲特计划“之股市小知识常用的术语笔记
  3. Sqlite中文排序研究
  4. Android4.4 往短信收件箱中插入自定义短信(伪造短信)
  5. 使用Jenkins自动编译我的.net 项目
  6. 广告点击率预估中的特征选择
  7. 客户 服务器协议简写,客户端和服务器端的简写
  8. 千里马 android framework之MotionEvent.ACTION_CANCEL怎么产生-讨厌的android触摸面试题
  9. 【如何下载钉钉云课堂视频】
  10. linux-千兆网口测速只有百兆