大数据分析速成

MapReduce

MapReduce是一种可用于数据处理的编程模型。MapReduce程序本质上是并行运行的,因此可以将大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心。它的优势在于处理大规模数据集。

MapReduce任务分为两个处理阶段:map和reduce

Mapper类有四个形参,map()方法输入是一个键和一个值,Context用于输出内容的写入。 

  

Job对象指定作业执行规范,在Hadoop集群上运行这个作业时,要把代码打包成JAR文件。

setOutputPath()来指定输出路径时只能有一个,并且在运行前目录不存在,否则会报错。这种预防措施的目的是防止数据丢失。

MapReduce作业分为映射任务和减少任务。这些任务使用YARN进行调度,并在集群中的节点上运行。如果任务失败,它将自动重新安排在其他节点上运行。 

Hadoop将输入数据分成等长的小数据块,分片数据越小,负载平衡效果越好。但不能太小,如果分割太小,则管理分割的开销主导了总执行时间,一个合理的分片大小趋向于HDFS一个块的大小,默认是128MB

Data locality optimization

Please explain the data locality optimization and its advantages in distributed computing.

数据本地优化:Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能。因为它无需浪费宝贵的集群带宽资源。

 map任务将输出写入本地磁盘,而非HDFS。因为map输出是中间输出,一旦作业完成,它就可以被丢弃。

reduce任务不具备数据本地化的优势,因为输入通常来自于所有mapper的输出,输出存储在HDFS以实现可靠传输。

reduce任务的数量不受输入的大小的控制,而是独立指定的 

combiner

What is the main advantage of combiner function? Why?

一个combiner函数在map输出上运行,以最小化在map和reduce之间传输的数据量,节约了集群带宽成本。

combiner仅仅是一个优化方法,并不能取代recuce功能。

Speculative Execution

推理任务是另一个等效备份的任务,仅针对运行速度明显低于平均水平的一小部分用户启动。当一个任务成功完成时,任何正在运行的重复任务都将被终止。

What is speculative execution? Please briefly explain its benefit

Hadoop试图检测一个任务的运行速度是否明显慢于预期(或相同类型任务的平均时间),并启动另一个等效任务作为备份。当一个任务成功完成时,任何正在运行的重复任务都将被终止。其目标是减少作业执行时间,但这是以降低集群效率为代价的。

Shuffle and Sort

Please briefly explain the map side process of shuffle and sort in a MapReduce Job without combiner.

(1)每个map任务都有一个循环内存缓冲区,它将输出写入该缓冲区。

(2)当缓冲区中的内容达到某个阈值时,它就会开始将这些内容溢出到磁盘上。在写入磁盘之前,线程首先将数据划分为与它们最终将被发送到的reducers相对应的分区。在每个分区中,后台线程在内存中执行按键排序

(3)多个溢出文件被合并到一个经过分区和排序的输出文件中。

(1)map任务一旦完成,reduce就开始复制map输出。

(2)map任务成功完成后,它们将使用心跳机制通知应用程序主服务器。 

(3)map输出不会从磁盘中删除,直到工作完成后应用程序主要求它们删除它们。

(4)小的map输出也可以使用内存缓冲区来编写。 当内存中的缓冲区达到阈值大小或达到map输出的阈值数时,它将被合并并溢出到磁盘上。

 如果指定了combiner,则将在合并期间运行它,以减少写入磁盘的数据量。

map:通过避免多次溢出到磁盘,可以获得最佳的性能;一个是最佳的。

reduce:当中间数据可以完全驻留在内存中时,就可以获得最佳的性能。

Hadoop Streaming

Hadoop流使用Unix标准流作为Hadoop和程序之间的接口,因此您可以使用任何可以读取标准输入和写入标准输出的语言来编写MapReduce程序。

HDFS

管理网络中跨多平台计算机存储的文件系统称为分布式文件系统。

HDFS的设计

1.What is the Design Criteria of HDFS?

 适合存储大文件,特别是PB级的数据。

流数据访问。写入一次(或附加),阅读多次

商品硬件。节点故障处理很简单

HDFS的概念

文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小是磁盘块的整数倍(integral)。磁盘块为512字节。

HDFS块大小为128MB,HDFS中小于一个块大小的文件不会占整个块的空间。

HDFS块比磁盘的块大,目的是为了最小化寻址开销。如果块足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置的时间。

Benefits of block abstraction

(1)一个文件的大小可以大于网络中任意一个磁盘的容量

(2)简化存储子系统

(3)块适合数据备份(replication),提供容错和可用性

2. Please list the function of the differences between namenode and datanode.

namenode的功能是管理文件系统树、所有文件和目录的元数据,它还可以跟踪所有的块。 

datanode的功能是存储和检索块,它还可以向namenote发送它们所存储的块的列表。

HDFS的高可用性

3. How does HDFS achieve high availability with active-standby cofiguration?

namenode之间需要通过高可用共享存储实现编辑日志的共享。当备用namenode接管工作后,它将通读共享编辑日志直至末尾,以实现与活动namenode的状态同步,并继续读取由活动namenode写入的新条目。

datanote需要同时向两个namenode发送数据块处理报告,因为数据块的映射信息存储在namenode的内存中,而非磁盘。 

新的namenode满足以下情节才能响应服务:

(1)将命名空间的映像导入内存中;

(2)重演编辑日志;

(3)接收到足够多的来自datanode的数据块报告并退出安全模式。

Standby NN better than secondary NN
客户端处理namenode故障转移对于用户是透明机制。

数据流

4. Please explain the data flow for a File Read process.

(1)客户端在HDFS的分布式文件系统对象上打开该文件。 

(2)分布式文件系统调用namenode,以确定文件中起始块的位置。对于每个块,namenode返回具有该块副本的已排序datanode的地址。

(3)客户端调用FSDataInputStream的read()方法。

(4)FSDataInputStream连接距离最近的文件中第一个块所在的datanode。通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端。

(5)到达块的末端时,FSDataInputStream关闭与该datanode的连接,然后寻找下一个块的最佳datanode。FSDataInputStream还将根据需要调用namenode来检索下一批块的datanode位置。

(6)客户端读完后,FSDataInputStream关闭。

Benefits of this data flow

(1)客户端直接联系datanode去检索数据。

(2)允许HDFS可以扩展到大量的并发客户端,因为数据流量分布在集群中的所有datanode上。

(3)namenode任务轻,它只服务于块的位置请求。

5. Please explain the data flow for a File Write process.

 

(1)客户端通过对分布式文件系统对象调用create()来新建文件。

(2)分布式文件系统要求namenode在文件系统的命名空间中创建一个新文件。namenode会执行各种检查,以确保该文件不存在,并且客户端具有创建该文件的正确权限。 

(3)如果这些检查通过,客户端将写入数据。

(4)(FSDataOutputStream)数据输出流将数据分成数据包,并将其写入数据队列。DataStreamer处理数据队列,DataStreamer负责挑选出适合存储数据复本的一组datanode,并据此来要求namenode分配新的数据块。这一组datanode构成了一个管线。数据流将数据包流式传输到管线中的第一个datanode,该datanode存储数据包并将其转发到管线中的第二个datanode。

(5)FSDataOutputStream还维护一个确认队列。只有当管线中的所有datanode确认时,该数据包才会从确认队列删除。

(6)当客户端完成数据写入后,流将关闭。此操作将所有剩余的数据包写入datanode管线,并等待确认。

(7)分布式文件系统联系namenode,表示文件已完成。

Replica Placement 

要对可靠性、写入带宽、读取带宽进行权衡。

Hadoop默认的布局策略是在运行客户端的节点上放第1个复本,第2个复本放在与第一个不同且随机另外选择的机架中节点上,第3个复本与第2个复本在同一个机架上,且随机选择另一个节点。

 

一致模型 

通过hflush(),HDFS保证在文件中写入的数据已经到达写入管道中的所有数据节点,并且对所有新读取器都可见 

 YARN

Benefits of Yarn

Scalability, Availability, Utilization, Multitenancy 

1. What are two types of long-running daemon in Yarn and what are their tasks?

资源管理器(每个群集一个)管理整个群集的资源的使用 。

在集群中的所有节点上运行的节点管理器将启动和监视容器。

2. What are the three scheduling options in YARN? Which is suitable for big shared cluster?

 FIFO调度器、容量调度器、公平调度器

容量和公平调度器适合大规模共享集群。这两种调度器都允许长时间运行的作业能及时完成,同时也允许正在进行较小临时查询的用户能够在合理时间内得到返回的结果。

牺牲整体集群的利用率,大作业的执行时间比FIFO长。 

3. Please briefly describe the delay scheduling.

YARN调度器都试图以本地请求为重。在繁忙的集群上,如果应用程序请求一个特定的节点,则很有可能在请求时有其他容器在该节点上运行。延迟调度等待很短的时间,从而极大地增加在请求节点上分配容器的机会,从而提高集群的效率。

容量调度器和公平调度器都支持延迟调度。

4. If there is a cluster with a total of 100 CPUs and 10 TB of memory. Application A requests containers of (4 CPUs, 300 GB). What is its dominant resource?

A的请求是(4%,3%),所以CPU占主导地位。

6. Please draw the queue hierarchies for configuration setting. What is the ratio of resource utilization of queue D in the cluster?

HBase

HBase是一个在HDFS上开发的面向列的分布式数据库,并不是关系型数据库,它不支持SQL。

1. How to indicate a column member in an Hbase table?

列族:列族限定符

2. Please describe the process of fresh clients connection HBase when a client want to read.

客户端找到hbase:meta的位置。

客户端通过查找合适的hbase:meta区域来获取用户空间区域所在节点及其位置。

客户端直接与管理那个区域的regionserver交互。

3. What is the smallest unit of distributed storage in Hbase?

HRegion

4. Write the shell command to create an HBase table named “scores” with two column families “math” and “eng”

 create 'scores', 'math', 'eng' 

create, put, get, disable, drop 

 

hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'
hbase(main):017:0> disable 'student','1002','info:sex'
hbase(main):017:0> drop 'student','1002','info:sex'

Spark

    Hadoop    Spark
类型    分布式基础平台, 包含计算, 存储, 调度    分布式计算工具
场景    大规模数据集上的批处理    迭代计算, 交互式计算, 流计算
价格    对机器要求低, 便宜    对内存有要求, 相对较贵
编程范式    Map+Reduce, API 较为底层, 算法适应性差    RDD 组成 DAG 有向无环图, API 较为顶层, 方便使用
数据存储结构    MapReduce 中间计算结果存在 HDFS 磁盘上, 延迟大    RDD 中间运算结果存在内存中 , 延迟小
运行方式    Task 以进程方式维护, 任务启动慢    Task 以线程方式维护, 任务启动快

创建RDD

parallelizedRows=spark.sparkContext.parallelized(newRows)

DataFrame与Dataset

两者都是(分布式的)类似表的集合,具有定义良好的行和列。

每个列必须与所有其他列(包括null)相同,并且每个列的类型信息必须与集合中的每行一致的类型信息。

区别:

数据帧的类型由Spark完全维护,并且只在运行时检查这些类型是否与模式一致。

数据集在编译时检查类型是否符合规范。

DataFrame Transformations

创建DataFrame

myDF=spark.createDataFrame([ () ]).toDF( schema ) 

df.select(expr("*"), lit(1).alias("Ones")).show(2)

  1. 从DataFrame df 中选择所有列。
  2. 添加一个新列,该列的每一行都是值1,并且给这个新列命名为 "Ones"。
  3. 显示修改后的DataFrame的前2行。

val newDf = df.withColumn("newColumn", df("existingColumn1") + df("existingColumn2"))

功能:添加一个新列,该列是现有两列的和  

 df.withColumn("count2", col("count").cast("long"))

功能:总结来说,这行代码的作用是将DataFrame df 中名为 "count" 的列的数据类型转换为 "long",并将转换后的列命名为 "count2",然后返回一个新的包含这个新列的DataFrame。

val filteredDfWhere = df.where(col("age") > 30).where(col("count")>2)

val filteredDfFilter = df.filter(col("age") > 30) 

df.select("column1", "column2").distinct().count()

  1. 选择列df.select("column1", "column2") 这部分代码选择了DataFrame df 中的 column1column2 这两列。

  2. 去重.distinct() 是一个转换操作,它会返回一个新的DataFrame,其中只包含由 select 指定的列的唯一组合的行。

  3. 计数.count() 是一个动作操作,它会返回去重后DataFrame中的行数。

功能:这行代码的作用是计算DataFrame dfcolumn1column2 的不同组合的数量,去重。

for(LongWritable count:values){

sum+=1.get();

result.set(sum);

context.write(key,result);

}

df.sample(withReplacement = false, fraction = 0.1, seed = 42).count()

功能:

  • 从DataFrame df 中无放回地(withReplacement = false)随机抽取大约10%(fraction = 0.1)的行。
  • 使用种子 42 来确保抽样的可重复性。
  • count() 计算并返回被抽取的行数。

dataFrames = df.randomSplit([0.25, 0.75], seed);

dataFrames[0].count() > dataFrames[1].count();   False

intRDD1.union(intRDD2).union(RDD3).collect()

功能:取并集,但不包含重复元素。

// 按照column1进行升序排序,如果column1相同,则按照column2升序排序

val sortedDf = df.orderBy(col("column1"), col("column2"))

// 如果需要按照column1升序、column2降序排序

val sortedDfDesc = df.orderBy(col("column1"), col("column2").desc) 

sort为局部排序,orderBy为全局排序

 val result = df.groupBy("col").agg( expr("avg(Q) as averageQ"), expr("stddev_pop(Q) as stddevQ") ).show()

功能:应该是按照"col" 进行分组,并计算列 Q 的均值和总体标准差。

df_rdd.map(lambda x :(x[7],1)).reduceByKey(lambda x,y :x+y).sortByKey().collect() 

左外连接

val leftOuterJoinedDf = df1.join(df2, df1("key") === df2("key"), "left_outer")

// 显示连接结果 leftOuterJoinedDf.show() 

它结合了两个或多个 DataFrame,并返回所有左侧 DataFrame(df1)的行,以及右侧 DataFrame(df2)中匹配连接条件的行。如果右侧 DataFrame 中没有匹配的行,则相应的列会填充为 null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值