hive 数据倾斜、优化策略、hive执行过程、垃圾回收

Hive数据倾斜的原因以及常用解决方案 阅读详情

 

 

 

文章目录

 

1. 数据倾斜

1.1 什么是数据倾斜?

  • 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点

  • Hadoop 框架的特性

    • 不怕数据大,怕数据倾斜
    • Jobs 数比较多的作业运行效率相对比较低,如子查询比较多
    • sum,count,max,min 等聚集函数,通常不会有数据倾斜问题
  • 主要表现:
    任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。
    单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大
    于平均时长。

1.2 容易数据倾斜情况

操作情形后果
join其中一个表小
但是key集中
分发到某一个或几个reduce中的数据远高于平均值
join大表与大表,但是分桶的判断字段0或空值过多这些空值由一个reduce处理,非常慢
group bygroup by维度过小,某值的数据过多处理某值的reduce非常耗时
count distinct某特殊值过多处理此特殊值的reduce耗时
  • reduce join hive执行join的时候如果执行的是reduce join极易数据倾斜的
  • group by 不和聚集函数搭配使用的时候
    select count(*) from course; 全局计数 (一个reduce task中)
  • count(distinct),在数据量大的情况下,容易数据倾斜,因为 count(distinct)是按 group
    by 字段分组,按 distinct 字段排序
  • 小表关联超大表 join

1.3 产生数据倾斜的原因

  • key 分布不均匀
  • 业务数据本身的特性
  • 建表考虑不周全
  • 某些 HQL 语句本身就存在数据倾斜

1.4 不会产生数据倾斜的情况

  1. 不执行MR任务的情况
    fetch过程不会转MR
    配置参数:

    <property>
       <name>hive.fetch.task.conversion</name>
       <value>more</value>
       <description>
         可取值[none, minimal, more].
         Some select queries can be converted to single FETCH task minimizing latency.
         Currently the query should be single sourced not having any subquery and should not have
         any aggregations or distincts (which incurs RS), lateral views and joins.
         0. none : disable hive.fetch.task.conversion
         1. minimal : SELECT *, FILTER on partition columns, LIMIT only
    		也就是:select * ,过滤条件是分区字段,limit   
         2. more    : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
    		也就是:select 所有字段,按照所有字段过滤,limit
       </description>
     </property>
      
    
  2. group by和聚合函数(sum count max min)一起使用
    group by和以上的聚合函数一起使用的时候会默认在map端执行一次combiner(局部聚合:减少reducetask的数据量,这个时候reduce端接受的数据就会大大减少 一般不会出现数据倾斜
    select id,count(*) from course group by id;

  3. map join
    mapjoin reducejoin 优缺点

1.5 业务场景

1.5.1 空值产生的数据倾斜

场景描述:

user	用户信息表  userid  一个用户注册这个表就会多一条数据 userid!=null
log		日志信息表  userid  用户只要有一个行为就多一条数据  如果未登录用户操作 userid=null  这种数据数据特别多5T
  • 1
  • 2

操作:

select * from user a join log b on a.userid=b.userid;

map-key: userid
	userid 大量的null值   这些null值最终都会到一个reducetask中
	就会造成有null的这个reducetask的数据量很大
	100reducetask
	99reducetask   0.05	t   
	1reduce    5t   
	
	reducetask    99%    
	reducetask    99% 
	reducetask    99% 

解决方案:
方案一:null值不参与关联

select 
* 
from user a join 
(select * from log where userid is not null) b 
on a.userid=b.userid;
--需要null的数据
select 
* 
from user a join 
(select * from log where userid is not null) b 
on a.userid=b.userid 
union all 
select * from log where userid is null;

方案二:赋予空值新的key值

--所有的null值全部到一个reducetask中   进行关联的时候  null值分开 null---变身
--null123.hash%reduce  null456  null112
select 
* 
from user a 
join log b 
on case when b.userid is null then concat_ws(b.userid,cast(rand()*1000 as int)) else b.userid end = a.userid;

总结:
方法 2 比方法 1 效率更好,不但 IO 少了,而且作业数也少了,
方案 1 中,log 表读了两次,jobs 肯定是 2,而方案 2 是 1。
这个优化适合无效 id(比如-99,’’,null)产生的数据倾斜,把空值的 key 变成一个字符串加上一个随机数,就能把造成数据倾斜的数据分到不同的 reduce 上解决数据倾斜的问题

改变之处:
使本身为 null 的所有记录不会拥挤在同一个 reduceTask 了,会由于有替代的随机字符串值,而分散到了多个 reduceTask 中了,由于 null 值关联不上,处理后并不影响最终结果。

1.5.2 不同数据类型关联产生数据倾斜

场景说明:

--用户表中 user_id 字段为 int,log 表中 user_id 为既有 string 也有 int 的类型,
user userid  int 
log  userid  string 
-- 当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进
-- 行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中

解决方案:
把数字类型 id 转换成 string 类型的 id

select * from user a left outer join log b on b.user_id = cast(a.user_id as string)

1.5.1 大小表关联查询产生数据倾斜

  1. 大小 或 小 小 关联(小表<=23.8M)
    在hive中默认的是map端的join,小表不得超过23.8M左右

    <property>
    	<name>hive.auto.convert.join</name>
    	<value>true</value>
    	<description>Whether Hive enables the optimization about converting common join into mapjoin based on the input file size
    	指定是否启动mapjoin
    	</description>
    	</property>
    	
    <property>
    	<name>hive.mapjoin.smalltable.filesize</name>
    	<value>25000000</value>
    	<description>
    	  The threshold for the input file size of the small tables; if the file size is smaller 
    	  than this threshold, it will try to convert the common join into map join
    	  mapjoin对于小表的大小的限定  默认大小不得超过23.8M左右
    	  较小表大小不超过23.8M 执行的都是mapjoin
    	</description>
    </property>
    	
    
  2. 大* 中 (中表:超过23.8M) 放在缓存中足够的
    默认执行的是reducejoin(容易产生数据倾斜的)
    强制执行mapjoin /+mapjoin(需要放在缓存中的中表)/

    -- user  1T   log 300M
    select 
    /*+mapjoin(a)*/ 
    * 
    from log a join user b on a.userid=b.userid;
    --执行的仍然是mapjoin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. 大*大

-- user    1T   所有用户    userid
-- log    存储一天的数据    10G  userid(大量的重复数据)   一个用户10条日志信息
-- 瘦身的表  user表  根据log中的有效的userid表瘦身user表

--瘦身user表
--1. 获取log的去重之后的userid
select distinct userid from log where userid is not null;
--2. 使用user表关联上面的数据
select 
/*+mapjoin(a)*/b.* 
from (select distinct userid from log where userid is not null) a join user b on a.userid=b.userid;
-- 3. 开始真正的关联
select 
/*+mapjoin(c)*/* 
from (
select 
/*+mapjoin(a)*/b.* 
from (select distinct userid from log where userid is not null) a join user b on a.userid=b.userid
) c join log d on c.userid=d.userid;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

注意:使用map join解决小表关联大表造成的数据倾斜问题。这个方法使用的频率很高。
map join 概念:将其中做连接的小表(全量数据)分发到所有 MapTask 端进行 Join,从而避免了 reduceTask,前提要求是内存足以装下该全量数据
在这里插入图片描述

  • 以大表 a 和小表 b 为例,所有的 maptask 节点都装载小表 b 的所有数据,然后大表 a 的一个数据块数据比如说是 a1 去跟 b 全量数据做链接,就省去了 reduce 做汇总的过程。
  • 所以相对来说,在内存允许的条件下使用 map join 比直接使用 MapReduce 效率还高些,当然这只限于做 join 查询的时候。

在 hive 中,直接提供了能够在 HQL 语句指定该次查询使用 map join
map join 的用法是在查询/子查询的SELECT关键字后面添加/*+ MAPJOIN(tablelist) */提示优化器转化为map
join(早期的 Hive 版本的优化器是不能自动优化 map join 的)。其中 tablelist 可以是一个表,或以逗号连接的表的列表。tablelist 中的表将会读入内存,通常应该是将小表写在这里。

2. hive执行过程实例分析

  • Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等
  • 操作符 Operator 是 Hive 的最小处理单元
  • 每个操作符代表一个 HDFS 操作或者 MapReduce 作业
  • Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分
    布式两种模式
    在这里插入图片描述

2.1 Hive 操作符列表

在这里插入图片描述

2.2 Hive 编译器的工作职责

 Parser: 将 HQL 语句转换成抽象语法树(AST:Abstract Syntax Tree)
 Semantic Analyzer: 将抽象语法树转换成查询块
 Logic Plan Generator: 将查询块转换成逻辑查询计划
 Logic Optimizer: 重写逻辑查询计划,优化逻辑执行计划
 Physical Plan Gernerator: 将逻辑计划转化成物理计划(MapReduce Jobs)
 Physical Optimizer: 选择最佳的 Join 策略,优化物理执行计划

2.3 优化器类型

在这里插入图片描述
上表中带①符号的,优化目的都是尽量将任务合并到一个 Job 中,以减少 Job 数量,带②的优化目的是尽量减少 shuffle 数据量

2.4 hive查看执行过程

explain sql # 查看当前语句执行计算

--Operator  操作符:hive执行任务的时候的最小的执行单元
--这里的操作符1)hdfs的读写   2)mapreduce的操作 
--执行计划实质上就是hive的sql语句---转换为一个个的操作符--mapreduce任务/hdfs任务 
--
hive> explain
    > select 
    > uid,sum(cast(pcount as int)+cast(rcount as int)) totalcount
    > from weibo
    > group by uid
    > order by totalcount desc limit 10;
OK
STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-0 depends on stages: Stage-2

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: weibo
            Statistics: Num rows: 2795 Data size: 961727 Basic stats: COMPLETE Column stats: NONE
            Select Operator
              expressions: uid (type: string), (UDFToInteger(pcount) + UDFToInteger(rcount)) (type: int)
              outputColumnNames: _col0, _col1
              Statistics: Num rows: 2795 Data size: 961727 Basic stats: COMPLETE Column stats: NONE
              Group By Operator
                aggregations: sum(_col1)
                keys: _col0 (type: string)
                mode: hash
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 2795 Data size: 961727 Basic stats: COMPLETE Column stats: NONE
                Reduce Output Operator
                  key expressions: _col0 (type: string)
                  sort order: +
                  Map-reduce partition columns: _col0 (type: string)
                  Statistics: Num rows: 2795 Data size: 961727 Basic stats: COMPLETE Column stats: NONE
                  value expressions: _col1 (type: bigint)
      Reduce Operator Tree:
        Group By Operator
          aggregations: sum(VALUE._col0)
          keys: KEY._col0 (type: string)
          mode: mergepartial
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 1397 Data size: 480691 Basic stats: COMPLETE Column stats: NONE
          File Output Operator
            compressed: false
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                serde: org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe

  Stage: Stage-2
    Map Reduce
      Map Operator Tree:
          TableScan
            Reduce Output Operator
              key expressions: _col1 (type: bigint)
              sort order: -
              Statistics: Num rows: 1397 Data size: 480691 Basic stats: COMPLETE Column stats: NONE
              TopN Hash Memory Usage: 0.1
              value expressions: _col0 (type: string)
      Reduce Operator Tree:
        Select Operator
          expressions: VALUE._col0 (type: string), KEY.reducesinkkey0 (type: bigint)
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 1397 Data size: 480691 Basic stats: COMPLETE Column stats: NONE
          Limit
            Number of rows: 10
            Statistics: Num rows: 10 Data size: 3440 Basic stats: COMPLETE Column stats: NONE
            File Output Operator
              compressed: false
              Statistics: Num rows: 10 Data size: 3440 Basic stats: COMPLETE Column stats: NONE
              table:
                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                  serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: 10
      Processor Tree:
        ListSink

Time taken: 1.864 seconds, Fetched: 74 row(s)	

2.5 几个常用语句的MR转换

join

SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON pv.userid = u.userid;
实现过程:
Map:

  1. 以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合
  2. 以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在
    Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表
  3. 按照 Key 进行排序

Shuffle:

  1. 根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中

Reduce:

  1. Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据

具体实现过程:
在这里插入图片描述
在这里插入图片描述

group by

SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;
在这里插入图片描述

distinct

SELECT age, count(distinct pageid) FROM pv_users GROUP BY age;
按照 age 分组,然后统计每个分组里面的不重复的 pageid 有多少个
在这里插入图片描述
该 SQL 语句会按照 age 和 pageid 预先分组,进行 distinct 操作。然后会再按照 age 进行分组,再进行一次 distinct 操作

3. hive 优化策略

3.1 Hadoop框架计算特性

  1. 数据量大不是问题,数据倾斜是个问题
  2. Jobs 数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个 jobs,耗时很长。
    原因是 map reduce 作业初始化的时间是比较长的
  3. sum,count,max,min 等 UDAF,不怕数据倾斜问题,hadoop 在 map 端的汇总合并优化,使数据倾斜不成问题
  4. count(distinct userid),在数据量大的情况下,效率较低,如果是多 count(distinct userid,month)效率更低,因为 count(distinct)是按 group by 字段分组,按 distinct 字段排序,一般这种分布方式是很倾斜的,比如 PV 数据,淘宝一天 30 亿的 pv,如果按性别分组,分配 2 个 reduce,每个 reduce 期望处理 15 亿数据,但现实必定是男少女多

3.2 优化常用手段

  1. 好的模型设计事半功倍
  2. 解决数据倾斜问题
  3. 减少 job 数
  4. 设置合理的 MapReduce 的 task 数,能有效提升性能。(比如,10w+级别的计算,用 160个 reduce,那是相当的浪费,1 个足够)
  5. 了解数据分布,自己动手解决数据倾斜问题是个不错的选择。这是通用的算法优化,但算法优化有时不能适应特定业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据倾斜问题
  6. 数据量较大的情况下,慎用 count(distinct),group by 容易产生倾斜问题
  7. 对小文件进行合并,是行之有效的提高调度效率的方法,假如所有的作业设置合理的文件数,对作业的整体调度效率也会产生积极的正向影响
  8. 优化时把握整体,单个作业最优不如整体最优

3.3 排序选择

cluster by: 对同一字段分桶并排序,不能和 sort by 连用
distribute by + sort by: 分桶,保证同一字段值只存在一个结果文件当中,结合 sort by 保证每个 reduceTask 结果有序
sort by: 单机排序,单个 reduce 结果有序
**order by:**全局排序,缺陷是只能使用一个 reduce

一定要区分这四种排序的使用方式和适用场景

3.4 怎样做笛卡尔积

当 Hive 设定为严格模式(hive.mapred.mode=strict)时,不允许在 HQL 语句中出现笛卡尔积,
这实际说明了 Hive 对笛卡尔积支持较弱。
因为找不到 Join key,Hive 只能使用 1 个 reducer来完成笛卡尔积。

当然也可以使用 limit 的办法来减少某个表参与 join 的数据量,
但对于需要笛卡尔积语义的需求来说,经常是一个大表和一个小表的 Join 操作,
结果仍然很大(以至于无法用单机处理),这时 MapJoin 才是最好的解决办法。
MapJoin,顾名思义,会在 Map 端完成 Join 操作。
这需要将 Join 操作的一个或多个表完全读入内存。

PS:MapJoin 在子查询中可能出现未知 BUG。
在大表和小表做笛卡尔积时,规避笛卡尔积的方法是,给 Join 添加一个 Join key,
原理很简单:将小表扩充一列 join key,并将小表的条目复制数倍,join key 各不相同,将大表扩充一列 join key 为随机数。

精髓就在于复制几倍,最后就有几个 reduce 来做,
而且大表的数据是前面小表扩张 key 值范围里面随机出来的,
所以复制了几倍 n,就相当于这个随机范围就有多大 n,
那么相应的,大表的数据就被随机的分为了 n 份。
并且最后处理所用的 reduce 数量也是 n,而且也不会出现数据倾斜。

3.5 怎样写 in/exists 语句

虽然经过测验,hive1.2.1 也支持 in/exists 操作,但还是推荐使用 hive 的一个高效替代方案:
left semi join

比如说:

select a.id, a.name from a where a.id in (select b.id from b);
select a.id, a.name from a where exists (select id from b where a.id = b.id);
--应该转换成:
select a.id, a.name from a left semi join b on a.id = b.id;
  • 1
  • 2
  • 3
  • 4

3.6 设置合理的 maptask 数量

Map 数过大

  • Map 阶段输出文件太小,产生大量小文件
  • 创建 Map 的开销很大

Map 数太小

  • 文件处理或查询并发度小,Job 执行时间过长
  • 大量作业时,容易堵塞集群

在 MapReduce 的编程案例中,我们得知,一个MR Job的 MapTask 数量是由输入分片 InputSplit
决定的。而输入分片是由 FileInputFormat.getSplit()决定的。一个输入分片对应一个 MapTask,
而输入分片是由三个参数决定的:

propertyvaluedescription
dfs.blocksize128MHDFS 默认数据块大小
mapreduce.input.fileinputformat.split.minsize1最小分片大小
mapreduce.input.fileinputformat.split.maxsizeLong.MAX_VALUE最大分片大小(MR)
mapreduce.input.fileinputformat.split.maxsize256M最大处理数据量 Hive

输入分片大小的计算是这么计算出来的:
long splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
默认情况下,输入分片大小和 HDFS 集群默认数据块大小一致,也就是默认一个数据块,
启用一个 MapTask 进行处理,这样做的好处是避免了服务器节点之间的数据传输,提高 job 处理效率

两种经典的控制 MapTask 的个数方案:减少 MapTask 数或者增加 MapTask 数

  1. 减少 MapTask 数是通过合并小文件来实现,这一点主要是针对数据源
  2. 增加 MapTask 数可以通过控制上一个 job 的 reduceTask 个数

因为 Hive 语句最终要转换为一系列的 MapReduce Job 的,而每一个 MapReduce Job 是由一系列的 MapTask 和 ReduceTask 组成的,默认情况下, MapReduce 中一个 MapTask 或者一个ReduceTask 就会启动一个 JVM 进程,一个 Task 执行完毕后, JVM 进程就退出。这样如果任务花费时间很短,又要多次启动 JVM 的情况下,JVM 的启动时间会变成一个比较大的消耗,
这个时候,就可以通过重用 JVM 来解决:
set mapred.job.reuse.jvm.num.tasks=5

3.7 小文件合并

文件数目过多,会给 HDFS 带来压力,并且会影响处理效率,可以通过合并 Map 和 Reduce 的结果文件来消除这样的影响:

set hive.merge.mapfiles = true ##在 map only 的任务结束时合并小文件
set hive.merge.mapredfiles = false ## true 时在 MapReduce 的任务结束时合并小文件
set hive.merge.size.per.task = 256*1000*1000 ##合并文件的大小
set mapred.max.split.size=256000000; ##每个 Map 最大分割大小
set mapred.min.split.size.per.node=1; ##一个节点上 split 的最少值
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ##执行 Map 前进行小文件合并
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.8 设置合理的 reduceTask 的数量

Hadoop MapReduce 程序中,reducer 个数的设定极大影响执行效率,这使得 Hive 怎样决定reducer 个数成为一个关键问题。遗憾的是 Hive 的估计机制很弱,不指定 reducer 个数的情况下,Hive 会猜测确定一个 reducer 个数,基于以下两个设定:

  1. hive.exec.reducers.bytes.per.reducer(默认为 256000000)
  2. hive.exec.reducers.max(默认为 1009)
  3. mapreduce.job.reduces=-1(设置一个常量 reducetask 数量)

计算 reducer 数的公式很简单:
N=min(参数 2,总输入数据量/参数 1)
通常情况下,有必要手动指定 reducer 个数。
考虑到 map 阶段的输出数据量通常会比输入有大幅减少,因此即使不设定 reducer 个数,重设参数 2 还是必要的。
依据 Hadoop 的经验,可以将参数 2 设定为 0.95*(集群中 datanode 个数)。

3.9 合并 MapReduce 操作

Multi-group by 是 Hive 的一个非常好的特性,它使得 Hive 中利用中间结果变得非常方便。
例如:

FROM 
(SELECT a.status, b.school, b.gender FROM status_updates a JOIN profiles b ON (a.userid =
b.userid and a.ds='2009-03-20' ) ) subq1
INSERT OVERWRITE TABLE gender_summary PARTITION(ds='2009-03-20')
SELECT subq1.gender, COUNT(1) GROUP BY subq1.gender
INSERT OVERWRITE TABLE school_summary PARTITION(ds='2009-03-20')
SELECT subq1.school, COUNT(1) GROUP BY subq1.school
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述查询语句使用了 multi-group by 特性连续 group by 了 2 次数据,使用不同的 group by key。
这一特性可以减少一次 MapReduce 操作

3.10 合理利用分桶:Bucketing 和 Sampling

Bucket 是指将数据以指定列的值为 key 进行 hash,hash 到指定数目的桶中。这样就可以支持高效采样了。如下例就是以 userid 这一列为 bucket 的依据,共设置 32 个 buckets

CREATE TABLE page_view(viewTime INT, userid BIGINT,
 page_url STRING, referrer_url STRING,
 ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY '1'
 COLLECTION ITEMS TERMINATED BY '2'
 MAP KEYS TERMINATED BY '3'
 STORED AS SEQUENCEFILE;

通常情况下,Sampling 在全体数据上进行采样,这样效率自然就低,它要去访问所有数据。
而如果一个表已经对某一列制作了 bucket,就可以采样所有桶中指定序号的某个桶,这就
减少了访问量。

如下例所示就是采样了 page_view 中 32 个桶中的第三个桶的全部数据:
SELECT * FROM page_view TABLESAMPLE(BUCKET 3 OUT OF 32);
如下例所示就是采样了 page_view 中 32 个桶中的第三个桶的一半数据:
SELECT * FROM page_view TABLESAMPLE(BUCKET 3 OUT OF 64);

3.11 合理利用分区:Partition

Partition 就是分区。分区通过在创建表时启用 partitioned by 实现,用来 partition 的维度并不是实际数据的某一列,具体分区的标志是由插入内容时给定的。当要查询某一分区的内容时可以采用 where 语句,形似 where tablename.partition_column = a 来实现。
创建含分区的表

CREATE TABLE page_view(viewTime INT, userid BIGINT,
 page_url STRING, referrer_url STRING,
 ip STRING COMMENT 'IP Address of the User')
PARTITIONED BY(date STRING, country STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '1'
STORED AS TEXTFILE;
--载入内容,并指定分区标志
oad data local inpath '/home/hadoop/pv_2008-06-08_us.txt' into table page_view
partition(date='2008-06-08', country='US');
--查询指定标志的分区内容
SELECT page_views.* FROM page_views
 WHERE page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31' AND
page_views.referrer_url like '%xyz.com';

3.12 join 优化

总体原则:

  1. 优先过滤后再进行 Join 操作,最大限度的减少参与 join 的数据量
  2. 小表 join 大表,最好启动 mapjoin
  3. Join on 的条件相同的话,最好放入同一个 job,并且 join 表的排列顺序从小到大

在使用写有 Join 操作的查询语句时有一条原则:应该将条目少的表/子查询放在 Join 操作
符的左边。原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加
载进内存,将条目少的表放在左边,可以有效减少发生 OOM 错误的几率。
对于一条语句中有多个 Join 的情况,

--1.如果 Join 的条件相同,比如查询
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age FROM page_view p
JOIN user u ON (pv.userid = u.userid)
JOIN newuser x ON (u.userid = x.userid);
-- 如果 Join 的 key 相同,不管有多少个表,都会则会合并为一个 Map-Reduce 任务,而不
-- 是”n”个,在做 OUTER JOIN 的时候也是一样

--2.如果 join 的条件不相同,比如:
INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age FROM page_view p
JOIN user u ON (pv.userid = u.userid)
JOIN newuser x on (u.age = x.age);
--Map-Reduce 的任务数目和 Join 操作的数目是对应的,上述查询和以下查询是等价的
--先 page_view 表和 user 表做链接
INSERT OVERWRITE TABLE tmptable
SELECT * FROM page_view p JOIN user u ON (pv.userid = u.userid);
--然后结果表 temptable 和 newuser 表做链接
INSERT OVERWRITE TABLE pv_users
SELECT x.pageid, x.age FROM tmptable x JOIN newuser y ON (x.age = y.age); 

在编写 Join 查询语句时,如果确定是由于 join 出现的数据倾斜,那么请做如下设置:

set hive.skewjoin.key=100000; // 这个是 join 的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true; // 如果是 join 过程出现倾斜应该设置为 true
  • 1
  • 2

3.13 group by 优化

Map 端部分聚合:
并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端进行部分聚合,最后在 Reduce 端得出最终结果。
MapReduce 的 combiner 组件
参数包括:

set hive.map.aggr = true #是否在 Map 端进行聚合,默认为 True
set hive.groupby.mapaggr.checkinterval = 100000 #在 Map 端进行聚合操作的条目数目

当使用 Group By 有数据倾斜的时候进行负载均衡:
set hive.groupby.skewindata = true
当 sql 语句使用 groupby 时数据出现倾斜时,如果该变量设置为 true,那么 Hive 会自动进行负载均衡。
策略就是把 MR 任务拆分成两个:第一个先做预汇总,第二个再做最终汇总

在 MR 的第一个阶段中,Map 的输出结果集合会缓存到 maptaks 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;

第二个阶段 再根据预处理的数据结果按照 Group By Key 分布到Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

3.14 合理利用文件存储格式

创建表时,尽量使用 orc、parquet 这些列式存储格式,因为列式存储的表,每一列的数据在物理上是存储在一起的,Hive 查询时会只遍历需要列数据,大大减少处理的数据量

3.15 本地模式执行 MapReduce

Hive 在集群上查询时,默认是在集群上 N 台机器上运行, 需要多个机器进行协调运行,这个方式很好地解决了大数据量的查询问题。但是当 Hive 查询处理的数据量比较小时,其实没有必要启动分布式模式去执行,因为以分布式方式执行就涉及到跨网络传输、多节点协调等,并且消耗资源。这个时间可以只使用本地模式来执行 mapreduce job,只在一台机器上执行,速度会很快。启动本地模式涉及到三个参数:

参数名默认值备注
hive.exec.mode.local.autofalse让 hive 决定是否在本地模式自动运行
hive.exec.mode.local.auto.input.files.max4不启用本地模式的 task 最大个数
hive.exec.mode.local.auto.inputbytes.max128M不启动本地模式的最大输入文件大小

set hive.exec.mode.local.auto=true 是打开 hive 自动判断是否启动本地模式的开关,但是只是打开这个参数并不能保证启动本地模式,要当 map 任务数不超过hive.exec.mode.local.auto.input.files.max 的个数并且 map 输入文件大小不超过hive.exec.mode.local.auto.inputbytes.max 所指定的大小时,才能启动本地模式。

3.16 并行化处理

一个 hive sql 语句可能会转为多个 mapreduce Job,每一个 job 就是一个 stage,这些 job 顺序执行,这个在 cli 的运行日志中也可以看到。但是有时候这些任务之间并不是是相互依赖的,如果集群资源允许的话,可以让多个并不相互依赖 stage 并发执行,这样就节约了时间,提高了执行速度,但是如果集群资源匮乏时,启用并行化反倒是会导致各个 job 相互抢占资源而导致整体执行性能的下降。
启用并行化参数:
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8; //同一个 sql 允许并行任务的最大线程数

3.17 设置压缩存储

  1. 压缩的原因
    Hive 最终是转为 MapReduce 程序来执行的,而 MapReduce 的性能瓶颈在于网络 IO 和磁盘 IO,要解决性能瓶颈,最主要的是减少数据量,对数据进行压缩是个好的方式。压缩虽然是减少了数据量,但是压缩过程要消耗 CPU 的,但是在 Hadoop 中, 往往性能瓶颈不在于 CPU,CPU 压力并不大,所以压缩充分利用了比较空闲的 CPU

  2. 常用压缩方法对比
    在这里插入图片描述

  3. 压缩方式的选择:
    压缩比率
    压缩解压缩速度
    是否支持 Split

  4. 压缩使用:
    Job 输出文件按照 block 以 GZip 的方式进行压缩:

    set mapreduce.output.fileoutputformat.compress=true // 默认值是 false
    set mapreduce.output.fileoutputformat.compress.type=BLOCK // 默认值是 Record
    set
    mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec // 默认值是 org.apache.hadoop.io.compress.DefaultCodec
    

    Map 输出结果也以 Gzip 进行压缩:

    set mapred.map.output.compress=true
    set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec // 默认值是 org.apache.hadoop.io.compress.DefaultCodec
    
    

    对 Hive 输出结果和中间都进行压缩:

    set hive.exec.compress.output=true // 默认值是 false,不压缩
    set hive.exec.compress.intermediate=true// 默认值是 false,为 true 时 MR 设置的压缩才启用
    

4. 垃圾回收

hive的数据如果不小心误删了 ,怎么恢复?
hdfs的数据删除了, 默认没有进行配置hdfs的回收站, 立即删除
为了保证数据的安全性 ,一般情况下会进行hdfs的回收站的配置
一旦配置了回收站,删除数据 ,就会保存在回收站中 而不会立即删除

fs.trash.interval # 单位分钟 垃圾回收保存的时间
fs.trash.checkpoint.interval #检查点的时间间隔 <= fs.trash.interval

1)在core-site.xml中配置
<property>
 <name>fs.trash.interval</name>
 <value>60</value>
</property>
<property>
 <name>fs.trash.checkpoint.interval</name>
 <value>60</value>
</property>
2)远程发送其他节点
scp core-site.xml hdp01:/home/hadoop/apps/hadoop-2.7.6/etc/hadoop
scp core-site.xml hdp03:/home/hadoop/apps/hadoop-2.7.6/etc/hadoop/

3)配置完成,删除试试:
19/12/21 17:11:07 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hdp01:9000/stuin' to trash at: hdfs://hdp01:9000/user/hadoop/.Trash/Current/stuin
/user/hadoop/.Trash/Current  后面的路径就是原来的原始路径
Hive---数据倾斜的产生及解决方法 一、数据倾斜的定义 数据倾斜是指在并行进行数据处理的时候,由于单个partition的数据显著多余其他部分,分布不均匀,导致大量数据集中分布到一台或者某几台计算节点上,使得该部分的处理速度远低于平均计算速度,成为整个数据集处理的瓶颈,从而影响整体计算性能。 二、几种数据倾斜的解决方案 1、空值引发的数据倾斜 在数据采集时,判断导致数据倾斜的key是不是提前过滤掉了。在inner join,也就是使用内连接时,hive默认过滤掉了空值,但对于left join等等,会保留左边有的值... 阅读详情

相关推荐

Hive数仓性能调优与数据倾斜实战指南

数据仓库性能优化是大数据处理的核心技术挑战,其中执行计划分析与数据倾斜处理是关键突破口。通过Hive的EXPLAIN命令可以深入理解查询执行路径,诊断性能瓶颈根源。数据倾斜作为分布式计算的典型问题,需要采用两阶段聚合、随机前缀等工程方法解决。合理选择ORC/Parquet存储格式并结合分区分桶策略,能显著提升查询效率。在PB级数据处理场景下,这些优化手段可降低50%以上的资源消耗,广泛应用于用户行为分析、实时报表等大数据业务场景。

weixin_30321709的博客 307

hive数据倾斜(超详细)

说到hive的数据倾斜,可能有的小伙伴还不了解什么是数据倾斜,所以咱们这一次就从hive数据倾斜的表现、hive数据倾斜发生的原因、hive数据倾斜的解决方案这三个方面来聊一聊hive的数据倾斜。

wind96的博客 9758

(15)Hive调优——数据倾斜的解决指南

Hive调优——数据倾斜指南

爱吃辣条的博客 4413

Hive基础之:hive数据倾斜原因及解决方案

hive数据倾斜原因总结和及解决方案

weixin_43542605的博客 1万+

大数据领域Hive与Spark的集成实践

Hive作为基于Hadoop的数据仓库工具,擅长离线批处理和复杂SQL语义,但计算引擎(MapReduce)延迟高、资源利用率低Spark凭借内存计算和DAG执行引擎,在实时计算、交互式查询和机器学习场景表现优异,但缺乏成熟的数据仓库管理能力元数据统一管理机制数据存储层无缝对接计算引擎互补优化策略端到端ETL流程实战1. 背景介绍(核心价值与术语定义)2. 核心概念与联系(架构解析与交互流程)3. 核心算法原理(数据读写与执行优化)4. 数学模型与性能优化(资源分配与瓶颈分析)

AI 原生应用开发的博客 763

Ruoyi-Cloud-Plus新手必看:Gateway启动失败的两种解决方案(Nacos配置空间问题)

本文详细解析了Ruoyi-Cloud-Plus框架中Gateway启动失败的常见原因及解决方案,重点围绕Nacos配置空间问题展开。针对新手开发者,提供了两种实用方案:快速切换到public空间或规范创建dev空间并迁移配置,帮助开发者高效解决网关启动故障,确保微服务项目顺利运行。

weixin_30872499的博客 493

【Hive】hive 数据倾斜、优化策略、hive执行过程、垃圾回收

文章目录

人生所向,皆是美好 1323

HUAWEI华为荣耀MagicBook MateBook B D E X 13 14 16 笔记本MateStation台式机原装Win10出厂Windows11系统

HUAWEI华为MateBookX原装出厂系统恢复原厂系统,型号:MACHC-WAE9LP、EUL-W29P、MACHR-W19L、MACHR-W29、MACHD-WFE9、MRGF-16、MACHR-W19BL、MACHD-WFE9Q、WT-W19、Mach-W19、Mach-W29、WT-W09、WT-W19、MACH-W29等。HUAWEI华为MateBookE原装出厂系统恢复原厂系统,型号:PAK-AL09、GK-W7X、GK-G58、GK-W76、DRC-W76等。

QQ17855069的博客 17万+

Hive解决数据倾斜问题(GC overhead limit exceeded)的有效办法。

原因分析:在执行hive shell的时候map任务阶段执行到99%,而reduce节点只执行到33%人后就出现了上面的错误。 自我解释: (1)上面的情况说明,在map阶段执行结束的时候,当垃圾回收器在回收map阶段所产生的对象,因为数据倾斜的原因所导致对象过大,所以不能...

1750

告别命令行!用这个开源的Web版Kettle工具,5分钟搞定数据集成任务编排

本文介绍了一款开源的Web版Kettle工具,通过直观的拖拽界面大幅提升数据集成效率,告别复杂的命令行操作。该工具基于Kettle核心引擎,支持跨平台协作、轻量化访问和降低学习曲线,特别适合业务分析师快速上手。实测显示,使用该工具后任务配置错误率下降62%,协作效率提升40%。

weixin_30267785的博客 436

Arduino应用——PWM控制直流电机风扇

Arduino应用——PWM控制直流电机风扇PWM原理实验器件功能描述如何改变文本的样式插入链接与图片实现代码生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近在使用arduino UNO开发板完成课程小作业。其中一个要求设计一个电风扇控制系统,要求能够通过PWM调节风扇的转速。期间搜索了许多例程和方法,但受限于器件,效果不

hypecycle的博客 2万+

一条Hive SQL作业执行慢该怎么办

面对Hive SQL作业执行慢的问题,我们需要从多个角度进行分析和优化。其次,优化查询本身,选择合适的文件格式,减少不必要的列选择;你是否曾遇到过这样的情况:一条看似简单的Hive SQL查询,却拖拖拉拉地执行了几个小时,甚至一整天?这种情况下,你的耐心被消磨殆尽,项目进度也受到影响。通过系统的学习,你可以掌握更多优化Hive SQL的技巧,提高工作效率。如果你想深入了解数据分析领域的更多知识,欢迎关注CDA数据分析师,一起探索数据的魅力。有时我们会遇到非常复杂的查询,涉及多个表的多层嵌套子查询。

cda2024的博客 815

接入 deepseek 实现AI智能问诊

必须包含user角色,用于传递用户输入。system角色可选,用于设置对话背景。多轮对话需要将历史记录添加到messages中。

weixin_51326478的博客 6543

文章4323_一条Hive SQL作业执行慢 该怎么办

面对Hive SQL作业执行慢的问题,我们需要从多个角度进行分析和优化。其次,优化查询本身,选择合适的文件格式,减少不必要的列选择;你是否曾遇到过这样的情况:一条看似简单的Hive SQL查询,却拖拖拉拉地执行了几个小时,甚至一整天?这种情况下,你的耐心被消磨殆尽,项目进度也受到影响。通过系统的学习,你可以掌握更多优化Hive SQL的技巧,提高工作效率。如果你想深入了解数据分析领域的更多知识,欢迎关注CDA数据分析师,一起探索数据的魅力。有时我们会遇到非常复杂的查询,涉及多个表的多层嵌套子查询。

cda2024的博客 301

04 HCM CPI SF集成-员工集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 147

YOLOv8多传感器融合技术——摄像头阵列融合技术详解

本文详细介绍了基于YOLOv8的摄像头阵列融合技术,该技术通过多摄像头协同工作实现360度无死角环境感知。文章阐述了系统原理,包括全方位视野覆盖、冗余设计和深度感知等优势,并提供了完整的Python实现代码。关键技术涵盖多摄像头检测、立体匹配、3D投影和目标融合等模块,支持时间域融合提升稳定性。该系统可显著提高自动驾驶的环境感知能力,减少检测盲区,增强系统可靠性,是L4-L5级自动驾驶的关键技术之一。文章还展示了城市驾驶场景的实际应用,验证了该技术对复杂交通环境的适应能力。

u010117029的博客 214

大数据:深入解析Hadoop数据倾斜问题

在分布式计算领域,数据倾斜是影响Hadoop集群性能的常见瓶颈,尤其在处理海量数据时更为突出。作为资深资深Java工程师而言,理解并解决数据倾斜问题是提升分布式计算效率的核心能力。

weixin_43290370的博客 449

广义S变换在MATLAB中的仿真

广义S变换是对信号进行时频分析的一种方法,它基于短时傅里叶变换(Short-Time Fourier Transform,STFT)和小波变换(Wavelet Transform)。广义S变换将信号分解成时频平面上的一系列矩形框,每个框内的数值表示相应时刻和频率下信号的能量。本文将介绍如何使用MATLAB进行广义S变换的仿真,并提供相应的源代码。函数,我们可以方便地计算信号的广义S变换,并获取时频平面上的时域和频域信息。广义S变换在信号处理和相关领域中具有广泛的应用,可以用于分析和处理各种类型的信号。

CodeNexus的博客 1122

Hive性能调优实战:揭秘MapJoin与Sort-Merge Join在大数据场景下的高效应用

本文深入解析Hive中MapJoin与Sort-Merge Join两大核心优化策略。针对小表关联大表场景,MapJoin通过内存哈希表避免Shuffle,实现毫秒级响应;面对大表间关联,Sort-Merge Join则通过预排序与有序合并,在可控内存下高效处理,并能有效缓解数据倾斜问题。文章结合实战配置与参数调优,帮助开发者根据数据特征精准选择策略,大幅提升查询性能。

night的博客 761

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hive阶段之常用优化

1.Map执行前合并小文件 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat 说明: 在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。 2.map-reduce阶段合并小文件 hive.merge.mapfiles = true; – 默认true,在map-only任务结束时合

weixin_43690478的博客 435

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Hive中跑MapReduce Job出现OOM问题分析及解决

一、引子 今天在跑一段很复杂而且涉及数据量10多年的N个表join的长SQL时,发生了OOM的异常。 由于一个map通常配置只有64MB或者128MB,则在Map阶段出现OOM的情况很少见。所以一般发生在reduce阶段。 但是今天这个异常详细的看后,会发现既不是map阶段,也不是reduce阶段,发现不是执行过程,而是driver提交job阶段就OOM了。 Hive中XMLEncoder...

suojie的博客 3194

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Hive调优

Hive调优

马上要秃头的我 292

从校招笔试题看大数据开发:Hive、Spark、Kafka核心考点全拆解

分布式数据处理是现代数据架构的基石,从离线批处理到实时流计算,各组件协同支撑起海量数据的存储与计算。在工程实践中,Hive SQL优化直接影响数仓任务性能,Spark内存模型决定作业稳定性,Kafka消息可靠性保障实时链路不丢不重,HDFS小文件治理则关乎存储与计算效率。这些核心技术指标不仅是生产环境的关键问题,也是大数据开发岗位笔试面试的高频考点。无论是校招候选人还是转行者,掌握这些原理并具备实际排查能力,才能在真实业务场景中快速定位数据倾斜、内存溢出等难题。本文以一份校招笔试题为线索,系统拆解大数据开发

weixin_30606461的博客 618

大数据常用的面试问题笔记

1.Reducer通过Http方式得到输出文件的特定分区的数据。2.排序阶段合并map输出。然后走Reduce阶段。3.reduce执行完之后,写入到HDFS中。3.Yarn的组件1. ResourceManager主要功能是:(1)接收用户请求(2)管理调度资源(3)启动管理am(4)管理所有nm,处理nm的状态汇报,向nm下达命令。2.Container:yarn的应用都是运行在容器上的,容器包含cpu,内存等信息。

qq_42496461的博客 611
上一篇: hive数据倾斜优化策略
下一篇: Flink基于Kafka-Connector 数据流容错回放机制
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值