❶ Hive数据倾斜原因以及怎么解决
要看具体的倾斜原因,有些是SQL写的有问题,有些是数据的问题
❷ 数据倾斜处理一般从什么地方入手
触发shuffle的常见算子:distinct、groupByKey、receByKey、aggregateByKey、join、cogroup、repartition等。要解决数据倾斜的问题,首先要定位数据倾斜发生在什么地方,首先是哪个stage,直接在Web UI上看就可以,然后查看运行耗时的task,查看数据是否倾斜了!根据这个task,根据stage划分原理,推算出数据倾斜发生在哪个shuffle类算子上。查看导致数据倾斜的key的数据分布情况根据执行操作的不同,可以有很多种查看key分布的方式:1,如果是Spark SQL中的group by、join语句导致的数据倾斜,那么就查询一下SQL中使用的表的key分布情况。2,如果是Spark RDD执行shuffle算子导致的数据倾斜,那么可以在Spark作业中加入查看key分布的代码,比如RDD.countByKey()。然后对统计出来各个key出现的次数,collect、take到客户端打印一下,就可以看到key的分布情况。比如针对wordCount案例,最后的receByKey算子导致了数据倾斜:val sampledPairs = pairs.sample(false,0.1) //对pairs采样10%val sampledWordCounts = sampledPairs.countByKey()sampledWordCounts.foreach(println(_))数据倾斜的解决办法方案一:使用Hive ETL预处理数据适用场景:导致数据倾斜的是Hive表,Hive表中的数据本身很不均匀,业务场景需要频繁使用Spark对Hive表执行某个分析操作。实现思路:提前将join等操作执行,进行Hive阶段的ETL。将导致数据倾斜的shuffle前置。优缺点:实现简单,Spark作业性能提升,但是Hive ETL还是会发生数据倾斜,导致Hive ETL的速度很慢。实践经验:将数据倾斜提前到上游的Hive ETL,每天就执行一次,慢就慢点吧。 方案二:过滤少数导致倾斜的key适用场景:少数几个key导致数据倾斜,而且对计算本身影响并不大的话。实现思路:比如Spark SQL中直接用where条件过滤掉这些key,如果是RDD的话,用filter算子过滤掉这些key。如果是动态判断哪些key的数据量最多然后再进行过滤,那么可以使用sample算子对RDD进行采样,然后计算出每个key的数量,取数据量最多的key过滤掉即可。优缺点:实现简单,效果也好。缺点是一般情况下导致倾斜的key还是很多的,不会是少数。 解决方案三:提高shuffle操作的并行度适用场景:直接面对数据倾斜的简单解决方案。实现思路:对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如receByKey(1000),该参数就设置了这个shuffle算子执行的shuffle read task的数量。对于Spark SQL中的shuffle类语句,比如group by,join等,需要设置一个参数,即spark.sql.shuffle.partitions,该参数默认值是200,对于很多场景来说有点过小。优缺点:简单能缓解,缺点是没有根除问题,效果有限。 解决方案四:两阶段聚合(局部聚合+全局聚合)适用场景:对RDD执行receByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,比较适合这种方案。实现思路:先局部聚合,给每个key打一个小范围的随机数,比如10以内的随机数,相当于分成10份,一个task分成10个task。聚合聚合后,去掉key上的随机数前缀,再次进行全局聚合操作。优缺点:大幅度缓解数据倾斜,缺点是仅适用于聚合类的shuffle操作。 解决方案五:将rece join转为map join
❸ Hive是什么
此外,hive也支持熟悉map-rece的开发者使用map-rece程序对数据做更加复杂的分析。hive可以很好的结合thrift和控制分隔符,也支持用户自定义分隔符。hive基于hadoop,hadoop是批处理系统,不能保存低延迟,因此,hive的查询也不能保证低延迟。hive的工作模式是:提交一个任务,等到任务结束时被通知,而不是实时查询。相对应的是,类似于Oracle这样的系统当运行于小数据集的时候,响应非常快,可当处理的数据集非常大的时候,可能需要数小时。需要说明的是,hive即使在很小的数据集上运行,也可能需要数分钟才能完成。低延迟不是hive追求的首要目标。
❹ 怎么把hive日志中判断是哪个rece出现了数据倾斜
怎么把hive日志中判断是哪个rece出现了数据倾斜Hadoop archive 唯一的优势可能就是将众多的小文件打包成一个har 文件了,那这个文件就会按照dfs.block.size 的大小进行分块,因为hdfs为每个块的元数据大小大约为150个字节,如果众多小文件的存在(什么是小文件内,就是小于dfs.block.size 大小的文件,这样每个文件就是一个block)占用大量的namenode 堆内存空间,打成har 文件可以大大降低namenode 守护节点的内存压力。
❺ hive中sql运算出现倾斜的情况,主要原因有哪些
1. Mapjoin是一种避免避免数据倾斜的手段允许在map阶段进行join操作,MapJoin把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了rece运行的效率也会高很多在《hive:join遇到问题》有具体操作在对多个表join连接操作时,将小表放在join的左边,大表放在Jion的右边,在执行这样的join连接时小表中的数据会被缓存到内存当中,这样可以有效减少发生内存溢出错误的几率 2. 设置参数hive.map.aggr = truehive.groupby.skewindata=true 还有其他参数 3.SQL语言调节比如: group by维度过小时:采用sum() group by的方式来替换count(distinct)完成计算4.StreamTable将在recer中进行join操作时的小table放入内存,而大table通过stream方式读取
❻ 面试B类司法辅助人员一般会问什么
咨询记录 · 回答于2021-10-22
❼ 几种数据倾斜的情况,并解释为什么会倾斜,以及如何解决
Mapjoin是一种避免避免数据倾斜的手段
允许在map阶段进行join操作,MapJoin把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了rece运行的效率也会高很多
在《hive:join遇到问题》有具体操作
在对多个表join连接操作时,将小表放在join的左边,大表放在Jion的右边,
在执行这样的join连接时小表中的数据会被缓存到内存当中,这样可以有效减少发生内存溢出错误的几率
2. 设置参数
hive.map.aggr = true
hive.groupby.skewindata=true 还有其他参数
3.SQL语言调节
比如: group by维度过小时:采用sum() group by的方式来替换count(distinct)完成计算
4.StreamTable
将在recer中进行join操作时的小table放入内存,而大table通过stream方式读取
❽ hive数据倾斜求助
设置一下rece数量 就可以了
❾ 如何进行hive优化
1.fetch抓取一些HQL语句,可以不翻译为MR程序,而是使用FetchTask来运行,拉取数据!启用了fetch抓取,可以节省某些HQL语句的查询效率!默认fetch抓取的设置是开启的,为morehive.fetch.task.conversion=more2.表的Join2.1表Join的顺序在hive中,不管是 大表 join 小表还是 小表 Join 大表,hive都可以自动优化!2.2 大表之间的Join在MR中ReceJoin的原理:Map阶段①ReceTask可以启动任意数量,必须保证关联字段相同的分到同一个区关联字段相同的数据,才能分到同一个ReceTask②数据源有两种不同类型的文件,都使用同一个map处理逻辑!因此在map()需要根据切片的来源,进行判断,从而进行不同的封装逻辑的选择!③Mapper中封装数据的bean,应该可以覆盖不同类型文件中的所有字段④需要在bean中打标记,标记bean封装的是哪个文件中的数据只需要将order.txt中的数据进行替换后输出!Rece阶段⑤在rece()中,根据数据的标记进行分类分为order.txt中的数据和pd.txt中的数据⑥在cleanup()中,只讲order.txt中的数据,替换后写出左外连接,如果左表A表中有大量的c字段的值为null的数据,如果不对null的数据进行过滤,此时会产生数据倾斜!
❿ 大数据技术常用的数据处理方式有哪些
大数据技术常用的数据处理方式,有传统的ETL工具利用多线程处理文件的方式;有写MapRece,有利用Hive结合其自定义函数,也可以利用Spark进行数据清洗等,每种方式都有各自的使用场景。
在实际的工作中,需要根据不同的特定场景来选择数据处理方式。
1、传统的ETL方式
传统的ETL工具比如Kettle、Talend、Informatica等,可视化操作,上手比较快,但是随着数据量上升容易导致性能出问题,可优化的空间不大。
2、Maprece
写Maprece进行数据处理,需要利用java、python等语言进行开发调试,没有可视化操作界面那么方便,在性能优化方面,常见的有在做小表跟大表关联的时候,可以先把小表放到缓存中(通过调用Maprece的api),另外可以通过重写Combine跟Partition的接口实现,压缩从Map到rece中间数据处理量达到提高数据处理性能。
3、Hive
在没有出现Spark之前,Hive可谓独占鳌头,涉及离线数据的处理基本都是基于Hive来做的,Hive采用sql的方式底层基于Hadoop的Maprece计算框架进行数据处理,在性能优化上也不错。
4、Spark
Spark基于内存计算的准Maprece,在离线数据处理中,一般使用Spark sql进行数据清洗,目标文件一般是放在hdf或者nfs上,在书写sql的时候,尽量少用distinct,group by recebykey 等之类的算子,要防止数据倾斜。