大数据之旅-问题反思

1.谈谈你对MR执行流程各个阶段的理解(提示里面涉及到排序,快速排序或者归并排序知道两种实现形式)?

https://editor.csdn.net/md/?articleId=134878869

2.hadoop 1.0和hadoop 2.0明显的差异如何理解?

hadoop2.0与hadoop1.0区别体现在在架构、性能、功能和组件方面,新的版本更加强大、灵活、可靠和高效,适用于大规模数据的处理、存储和分析。
1.Hadoop 2.0具有更好的集群管理能力
Hadoop 2.0引入了YARN(Yet Another Resource Negotiator)框架,它是Hadoop1.0中JobTracker和TaskTracker的替代品,能够更好地管理资源任务分配。与Hadoop 1.0相比,Hadoop 2.0可支持多种类型的处理程序,如批处理、流处理以及图形处理等等。

2. Hadoop 2.0支持非MapReduce应用程序

Hadoop2.0提供了一个面向资源管理的通用框架,允许运行除MapReduce之外的非批处理程序,如Storm、Spark、Samza等等。这使得Hadoop可以处理各种类型的数据,并且更灵活,更适合混合型分析任务。

3. Hadoop 2.0中修改了HDFS的体系结构

Hadoop 2.0中对HDFS体系结构进行了大规模修改,使其更加健壮和可靠。新版本中引入了一些新的特性,如Secondary
NameNode的去除、NameNode的高可用性、块缓存以及数据完整性检查等。

4. Hadoop 2.0提高了性能和效率

Hadoop 2.0的新版高效执行引擎不仅允许在多个应用程序之间共享资源,还改善了任务调度效率,从而提高了处理速度和性能。Hadoop2.0还采用了新的资源分配和管理功能,如容器(Container)机制,可以更好地利用机器资源,实现资源的细粒度管理。

总体而言,Hadoop 2.0对于大规模的数据处理任务来说有显著的性能优势,高可用性、可靠性及更好的集群管理能力是Hadoop 2.0的显著优势。

3.谈谈工作中数据处理的流程?

4.hive 内外表的区别和使用场景有哪些?

区别:

1.在建表的时候,外部表要使用 EXTERNAL 关键字,不指定默认是内部表;
2.创建外部表的同时,语句末尾一般要自己指定 数据文件存储路径 location ‘/AUTO/PATH’ 3。内部表不用特殊指定,默认为/user/hive/warehouse,

可配置:hive-site.xml   
   <property>
    	<name>hive.metastore.warehouse.dir</name>
    	<value>/hive/warehouse</value>   
   </property>

4.内部表数据由Hive自身管理,外部表数据由HDFS管理; 5.DTOP TABLE
内部表:元数据和数据文件都会被删除掉
外部表:元数据被删除,数据文件任然保留 ,此时重建表都是可以的,还是可以直接查数据的
6.LOAD DATA
加载HDFS DATA都是会将HDFS数据进行移动到对应的表目录,类似 mv 命令

应用场景:

1.每天采集的ng日志和埋点日志,在存储的时候建议使用外部表,因为日志数据是采集程序实时采集进来的,一旦被误删,恢复起来非常麻烦。而且外部表方便数据的共享。

2.抽取过来的业务数据,其实用外部表或者内部表问题都不大,就算被误删,恢复起来也是很快的,如果需要对数据内容和元数据进行紧凑的管理, 那还是建议使用内部表

3.在做统计分析时候用到的中间表,结果表可以使用内部表,因为这些数据不需要共享,使用内部表更为合适。并且很多时候结果分区表我们只需要保留最近3天的数据,用外部表的时候删除分区时无法删除数据。

5.行式存储和列式存储有什么区别(优劣)?

行存储将每条数据的所有列连续存储在一起,一条记录接着一条记录; 行存储中数据写入的成本较低,适合数据有频繁更新的场景;
通过使用索引,能大幅提高行存储的数据查询速度;
行存储是传统的数据组织形式,更适合传统的 OLTP 系统;(OLTP数据库表的设计强调范式,底层一般有多张有关联关系的窄表)

而列存储有以下特点:

列存储将多行记录的列连续存储在一起,一列接着一列; 由于连续存储在一起的列的数据类型都一样,所以数据压缩率更高,更省存储空间;
列存储中数据查询的成本较低,特别适合分析时只查询部分列的场景,因为不需要扫描/读取不需要查询的列;
列存储由于数据更新成本较高,一般适合读多写少的场景;(但是不代表不能更新!) 列存储是新型数据组织形式,更适合 OLAP分析型系统;(OLAP数据库表的设计强调反范式,底层一般是星型模式的若干张事实表和维度表,倾向使用大宽表)

6.hive 常见存储格式和应用场景

存储格式:
textfile ,sequencefile,RCfile,orcfile,parquet 等
常用的是orcfile 和 parquet
应用场景:

  • Textfile:适合于小型查询,查看具体数据内容的和测试操作。
  • sequencefile:适用于数据量较小,大部分列的查询。
  • ORC:适用于Hive中大型的存储、查询

7.常见hive优化方式有哪些?

普通优化:
1.本地模式
  大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务时消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

(1)set hive.exec.mode.local.auto=true; //开启本地mr

用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。

(2)set hive.exec.mode.local.auto.inputbytes.max=50000000;

设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M

(3)set hive.exec.mode.local.auto.input.files.max=10;

设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4

2.Group By优化
  默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。

(1)开启Map端聚合参数设置,默认为True

hive.map.aggr = true

(2)在Map端进行聚合操作的条目数目

hive.groupby.mapaggr.checkinterval = 100000

(3)有数据倾斜的时候进行负载均衡(默认是false)

hive.groupby.skewindata = true

3.避免迪卡尔基
  尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积。

4.行列过滤
  列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。
5.开启动态分区
  关系型数据库中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。

(1)开启动态分区功能(默认true,开启)
    hive.exec.dynamic.partition=true

(2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。)
    hive.exec.dynamic.partition.mode=nonstrict

(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。
    hive.exec.max.dynamic.partitions=1000

(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。
    hive.exec.max.dynamic.partitions.pernode=100

(5)整个MR Job中,最大可以创建多少个HDFS文件。
    hive.exec.max.created.files=100000

(6)当有空分区生成时,是否抛出异常。一般不需要设置。
    hive.error.on.empty.partition=false

6.开启并行执行
  Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。

通过设置参数hive.exec.parallel值为true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。

set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。

当然,得是在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。

7.开启严格模式
  Hive提供了一个严格模式,可以防止用户执行那些可能意向不到的不好的影响的查询。通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询。

1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。

2)对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reducer中进行处理,强制要求用户增加这个LIMIT语句可以防止Reducer额外执行很长一段时间。

3)限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在执行JOIN查询的时候不使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。
8.开启JVM重用
  JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。

Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出。

<property>
 	<name>mapreduce.job.jvm.numtasks</name>
 	<value>10</value>
	<description>How many tasks to run per jvm. If set to -1, there is no limit. 
	</description>
</property>

这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

9.开启推测执行机制
  在分布式集群环境下,因为程序Bug(包括Hadoop本身的bug),负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生,Hadoop采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。

设置开启推测执行参数:Hadoop的mapred-site.xml文件中进行配置:

<property>
	<name>mapreduce.map.speculative</name>
	<value>true</value>
	<description>If true, then multiple instances of some map tasks  may be executed in parallel.</description>
</property>

<property>
	<name>mapreduce.reduce.speculative</name>
	<value>true</value>
	<description>If true, then multiple instances of some reduce tasks  may be executed in parallel.</description>
</property>

不过hive本身也提供了配置项来控制reduce-side的推测执行:

<property>
	<name>hive.mapred.reduce.tasks.speculative.execution</name>
	<value>true</value>
    <description>Whether speculative execution for reducers should be turned on. </description>
</property>

关于调优这些推测执行变量,还很难给一个具体的建议。如果用户对于运行时的偏差非常敏感的话,那么可以将这些功能关闭掉。如果用户因为输入数据量很大而需要执行长时间的map或者Reduce task的话,那么启动推测执行造成的浪费是非常巨大大。

10.执行计划分析
  1)基本语法

EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query

2)案例实操
    (1)查看下面这条语句的执行计划

explain select * from emp;
 explain select deptno, avg(sal) avg_sal from emp group by deptno;

(2)查看详细执行计划

explain extended select * from emp;
explain extended select deptno, avg(sal) avg_sal from emp group by deptno;

11.改变压缩格式

Snappy

12.使用TEZ引擎

开启TEZ引擎会将多个并行任务合并为一个任务执行,减少任务启停时间,提高运算效率。

数据倾斜优化:

1…过滤导致数据倾斜的Key、空Key转换
  有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。

有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。
  
2.设置MapJoin
  如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

开启MapJoin参数设置:
  (1)设置自动选择Mapjoin
    set hive.auto.convert.join = true; 默认为true
  (2)大表小表的阀值设置(默认25M一下认为是小表):
    set hive.mapjoin.smalltable.filesize=25000000;

3.Count(Distinct) 去重优化方案
  数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换,虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。

4.开启负载均衡机制

    hive.map.aggr=true
	//Map 端部分聚合,相当于Combiner
	hive.groupby.skewindata=true

有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

5.使用Combine
  使用Combine可以大量地减小数据频率倾斜和数据大小倾斜。在可能的情况下,combine的目的就是聚合并精简数据。
6.抽样和范围分区
  可以通过对原始数据进行抽样得到的结果集来预设分区边界值。
7.自定义分区
  基于输出键的背景知识进行自定义分区。例如,如果map输出键的单词来源于一本书。其中大部分必然是省略词(stopword)。那么就可以将自定义分区将这部分省略词发送给固定的一部分reduce实例。而将其他的都发送给剩余的reduce实例。

8.为倾斜Key打上随机数
  把导致倾斜的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null 值关联不上,处理后并不影响最终结果。

8.讲讲你对宽依赖和窄依赖的理解?

宽依赖 :父 RDD 中每个分区的数据都可以被子 RDD 的多个分区使用(涉及到了shuffle);
窄依赖 :父 RDD 中每个分区的数据最多只能被子 RDD 的一个分区使用。

宽依赖的算子 :join(非hash-partitioned)、groupByKey、partitionBy

窄依赖的算子:map、filter、union、join(hash-partitioned)、mapPartitions

在窄依赖中子 RDD 的每个分区数据的生成操作都是可以并行执行的,而在宽依赖中需要所有父 RDD 的 Shuffle 结果完成后再被执行。

9.如何理解stage划分原理?

会从执行action的最后一个rdd开始往前推,首先会为最后一个rdd创建一个stage,然后继续往前推,如果发现某个rdd是宽依赖,那么就会为这个宽依赖的rdd创建一个stage,那么rdd就是这个新的stage的最后一个rdd。按这个方式继续往前推,根据rdd宽依赖来创建stage,直到左右的rdd遍历完为止 。

spark优化哪些方式?

谈谈你对flume的了解?

Flume是一个分布式,高可靠和高可用的大数据采集系统。
1.三个核心组件:Source,Channel,Sink。
Source负责采集数据源的数据,将其传递给Channel中。
Channel作为数据缓冲区,存储Source传来的数据,并传输给Sink
Sink负责将数据发送到目的地
2.Flume架构包括Agent和Collector
Agent负责采集数据和传输,Collector负责接收数据进行存储和处理。
Agent。可以部署在数据源所在的机器上,通过Source采集数据,并通过Channel传输给Collector。
Collector可以部署在中心化的数据处理平台,如Hadoop集群,以便进行数据分析和挖掘
3.Flume支持多种数据源和目的地,包括文件系统,网络接口,消息队列等。
丰富的source组件:Avro Source,Exec Source, Spooling Directory Source 等
多种sink 组件:HDFS Sink,Kafka Sink,HBase SInk等
4.Flume还提供了数据处理和转换的功能。支持拦截器对数据进行预处理,添加时间戳,过滤无效数据等,还支持使用自定义的插件
5.Flume具有高可靠性和可扩展性,使用事务机制来保证数据的可靠传输,只有在数据完全传输到目的地后才确认传输成功。Flume支持多Agent的并行传输,可以通过配置多个Agent来实现数据的负载均衡和容错处理。

flume和kafka的本质区别是?
功能目标:Flume主要用于数据采集、聚合和传输,它能够从多个来源(例如日志文件、消息队列、数据库)收集数据,并将其发送到目标位置(例如HDFS、HBase、Kafka等)。而Kafka则是一个高吞吐量的分布式消息队列,用于可持久化存储和传输实时数据流。
数据模型:Flume基于事件(Event)模型,数据被划分为小的事件单元,通过Flume的Agent进行收集和传输。而Kafka则是基于发布-订阅模型,将数据以消息的形式发布到主题(Topic)中,并由消费者根据自己的需求订阅并消费这些消息。
可靠性:Flume提供了可靠的消息传输和容错机制,通过事务和可靠性机制来保证数据的完整性和可靠性。Kafka同样也提供了持久化存储和高可靠性的特性,通过数据复制和分区机制来保证数据的可靠传输。
扩展性:Flume的拓扑结构较为简单,可以通过配置多个Agent来实现数据的多级传输和处理,但其整体架构相对较为复杂。而Kafka的拓扑结构相对简单,可以通过添加更多的Broker节点来扩展其处理能力和存储容量。
总体来说,Flume更适合于数据的收集和传输,适用于大规模的日志收集和数据采集场景。而Kafka则更适合作为实时数据流处理的中间件,适用于数据流处理、消息队列和分布式系统之间的数据传输。

什么是kafka, kafka组件的作用是什么?
kafka 是一个分布式流式计算平台,它有四个关键概念:

topic

kafka 把收到的消息按 topic 进行分类,因此可以理解为 topic 是一种类别

producer

往 kafka 发送消息的用户

consumer

接收 kafka 消息的用户

borker

kafka 集群可以由多个 kafka 实例组成,每个实例(server)称为 broker

无论是 kafka broker 本身,还是 producer 或者 consumer,都依赖于 zookeeper 集群保存一些 meta 信息,保证系统可用性,以及使用 zookeeper 的选举机制。
  
kafka作用:消息缓冲 ,flume百万条 ,而sparkstreaming只能处理几万条,中间需要kafka缓冲

kafka的保证策略有哪些?各自有什么特点?

kafka如何定义”活着“?
Kafka判断一个节点是否还活着通常依赖于以下两个条件:

心跳(Heartbeat):Kafka集群中的每个节点(例如,Broker或消费者)会定期发送心跳信号给其他节点,以表示它们的存活状态。这是一种保持连接的机制,确保集群中的其他节点知道该节点仍然是活动的。心跳通常以固定时间间隔发送,并由接收方定期检查。如果一个节点停止发送心跳,其他节点会认为它已经失去联系,可能将其标记为不可用。

会话超时(Session Timeout):Kafka通常使用会话超时来确定节点的状态。每个节点在与其他节点建立连接时都会维护一个会话,其中包括心跳和其他状态信息。如果一个节点在一段时间内没有收到另一个节点的心跳,它可以将该节点的会话标记为已过期。会话超时时间通常是心跳间隔的几倍,以允许一定程度的网络延迟和节点不可用性。

这两个条件的组合通常用于判断节点是否还活着。如果一个节点停止发送心跳或其会话超时,则其他节点可能会认为该节点已经不可用,并采取相应的措施,例如重新分配分区或进行故障切换。

需要注意的是,具体的心跳间隔和会话超时时间可以在Kafka的配置中进行调整,以满足不同场景的需求。这些参数的合理设置对于确保集群的稳定性和可用性非常重要。

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值