<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fly_sky333的博客]]></title><description><![CDATA[网络笔记本]]></description><link>https://blog.youkuaiyun.com/fly_sky333</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fly_sky333]]></copyright><item><title><![CDATA[JVM内存模型]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/123775677</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/123775677</guid><author>fly_sky333</author><pubDate>Sun, 27 Mar 2022 17:53:32 +0800</pubDate><description><![CDATA[jvm内存模型]]></description><category></category></item><item><title><![CDATA[UDF函数开发中的坑]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/123682174</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/123682174</guid><author>fly_sky333</author><pubDate>Wed, 23 Mar 2022 14:18:44 +0800</pubDate><description><![CDATA[hive中udf函数遇到的问题和处理方式]]></description><category></category></item><item><title><![CDATA[管报数仓规则匹配任务优化]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/119807711</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/119807711</guid><author>fly_sky333</author><pubDate>Thu, 19 Aug 2021 17:49:18 +0800</pubDate><description><![CDATA[优化前：sql逻辑不复杂，只是中间用到了一个udtf函数，函数处理逻辑非常复杂，先付一张sql图



这里涉及到大表join小表，所以采用了mapjoin，去掉reduce过程，然后重新定义文件数量，让多个map去并行。关键点在于udtf函数逻辑过于复杂，而且传入的拼接字段，每个月会有4万左右数据，拼接后的字符串相同，这样就会导致这些数据进了同一个map，同时由于udtf逻辑复杂，所以这两个map会一直跑，由此出现了map端的数据倾斜。运行时长在90分总以上，由于等不了，就停了，没有具体看过多久执行完

]]></description><category></category></item><item><title><![CDATA[管报报表优化]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/119807648</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/119807648</guid><author>fly_sky333</author><pubDate>Thu, 19 Aug 2021 17:46:42 +0800</pubDate><description><![CDATA[优化前：代驾管报分为代驾，新桔，代物流和代保养这几块内容。sql第一阶段先把三块日报数据放到表中，第二阶段依赖第一阶段结果作出符合指标，依次insert into进去，第三阶段将三部分统一作出钆差放到表中。在这个场景下，随着复合指标越来越多，insert into部分达到近50个，jvm频繁开启，导致任务运行时长过长，最后运行时间短的话80分钟，长的话120分钟。



优化方式：这种场景下，无关乎数据倾斜，文件数等因素，所以参数优化已然不适用，所以采用sql逻辑优化，因为这个里面分为三部分，所以将三部分内]]></description><category></category></item><item><title><![CDATA[打标签任务优化]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/119807608</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/119807608</guid><author>fly_sky333</author><pubDate>Thu, 19 Aug 2021 17:44:01 +0800</pubDate><description><![CDATA[优化前：sql比较简单，表中数据是700万左右，就是查出某个表的数据，放到另一个表，但是中间用到了一个udtf函数，关键在于函数逻辑复杂。之前由于没有做优化，所以硬跑下来，耗时85分钟左右，日志没有数据倾斜现象。时间过去太久，运行图已经覆盖没有了，这里就不放了优化方式：因为数据量不是很大，也没有数据倾斜，而且从运行日志中可以看出没有reduce过程，所以就关注了map，发现只开启了2个map，然后怀疑是因为map太少了，处理数据条数太多，所以就把参数设置的小一点，从而使map数增加到了15，相当于15个并行]]></description><category></category></item><item><title><![CDATA[发送邮件任务优化]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/119807516</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/119807516</guid><author>fly_sky333</author><pubDate>Thu, 19 Aug 2021 17:42:04 +0800</pubDate><description><![CDATA[优化前：通过一个任务来发送，遍历邮件id，顺序执行，一共发送40封左右的邮件，总耗时160～200分钟左右



优化方式：在shell脚本中将发邮件任务做多线程并发处理，让每封邮件并发去执行，等到所有邮件发送完成，该任务返回成功，但是由于平台单个任务默认内存最大为4G，所以需要将邮件拆成3个任务来完成，否则会出现内存不足的情况

优化后：通过三个任务并发处理，无序执行，总耗时30分钟之内




...]]></description><category></category></item><item><title><![CDATA[mapjoin]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/119807442</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/119807442</guid><author>fly_sky333</author><pubDate>Thu, 19 Aug 2021 17:37:15 +0800</pubDate><description><![CDATA[背景：有一段sql，A left join B，查出的结果再 left join C，A表5亿条数据，B表2条,C表16条
现象：用spark直接跑发生数据倾斜，55分钟没有跑出来，就把任务停了
解决过程：由于确定是数据倾斜引起的，然后这三个表的数据量有个大概了解，所以直接采取mapjoin，先切换成hive，然后加入mapjoin的参数，小表阈值设置为20兆，结果运行时间缩短至10分钟。






...]]></description><category></category></item><item><title><![CDATA[检查重复数据shell公共脚本]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/109384985</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/109384985</guid><author>fly_sky333</author><pubDate>Fri, 30 Oct 2020 14:43:23 +0800</pubDate><description><![CDATA[#!/bin/bash
cd $(cd $(dirname $0); pwd)
set -e
source ~/env.sh
runday=$(date -d "-1 days" +"%Y-%m-%d")
table_name=""
check_partition=""
check_partition2=""
table_name_tmp=$1
check_partition_tmp=$2
check_partition_tmp2=$3
#获取要检查的表名
if [[ "${table_name_tmp:.]]></description><category></category></item><item><title><![CDATA[hadoop相关知识简单介绍]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106872968</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106872968</guid><author>fly_sky333</author><pubDate>Sun, 21 Jun 2020 19:38:20 +0800</pubDate><description><![CDATA[一、背景：

Google首先遇到的大数据存储、计算、搜索问题，在解决这些问题的过程中，发表了GFS、Map-Reduce、Bigtable三篇论文。为后来的大数据提供参考和思想。

二、hadoop组件构成

hdfs：分布式文件存储系统

MapReduce：分布式计算处理框架

yarn：资源调度

三、hadoop2.0时期架构图



四、各个组件部分介绍（这里只介绍hdfs，MapReduce，yarn，至于其他相关组件，详细可以参考我的其他针对模块）

1.HDFS：

简述：分布式文件存储系]]></description><category></category></item><item><title><![CDATA[MapReduce原理及shuffle机制]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106885673</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106885673</guid><author>fly_sky333</author><pubDate>Sun, 21 Jun 2020 19:38:07 +0800</pubDate><description><![CDATA[一、环形缓冲区

1.数据在环形缓冲区以KV的形式存在，索引和数据同向增长，当增长到缓冲区大小（默认128M）的80%时（只是80%左右，不是必须80%）开始溢写

2.索引占用四个int长度，以一个四元组的形式存在：value的起始位置，key的起始位置，partition值，value的长度。每进一条数据，指针每次向下跳动4个格子，然后补齐上面的值

3.发生在环形缓冲区的排序是对索引的排序，再具体是对partition值和key进行排序，将相同的partition放到一起，同一个partition内按]]></description><category></category></item><item><title><![CDATA[HDFS读写流程及涉及的原理]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106874396</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106874396</guid><author>fly_sky333</author><pubDate>Sun, 21 Jun 2020 16:46:40 +0800</pubDate><description><![CDATA[一、HDFS的读数据流程



流程概述：

1.客户端会先创建distributedfilesystem向namenode发出下载文件的请求

2.namenode返回目标文件的元数据信息

3.客户端通过FSDataInputStream向DataNode1和DataNode2读取数据

4.数据回传。5和6过程同3和4。然后客户端关闭流

注：客户端读取数据由于带宽所限，采取就近原则。本地DataNode，距离最近&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;如果没有，取同机]]></description><category></category></item><item><title><![CDATA[hive相关综合知识点汇总]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106747151</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106747151</guid><author>fly_sky333</author><pubDate>Sun, 14 Jun 2020 17:25:01 +0800</pubDate><description><![CDATA[一、视图：

视图中保留有原表的元数据信息，但是不会保留数据，当我们查询视图的数据的时候，可以查到，但是当我们查询真正数据的时候，这是后才会去执行建立视图的时候的SQL语句。例如：

表A为

执行建立视图语句：create view A_view as select * from A where dt = 2020/6/13

那么当我们执行descA_view的时候，会看到id，name这两列，当我们去执行select * fromA_view 的时候，才会真正去执行select * fromA ...]]></description><category></category></item><item><title><![CDATA[hivesql相关优化]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106746295</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106746295</guid><author>fly_sky333</author><pubDate>Sun, 14 Jun 2020 15:25:24 +0800</pubDate><description><![CDATA[1.需要做去重后count 的操作，尽量使用group by代替distinct，distinct 是去重，会将所有的key都放到一个reducer里面去做处理，所以如果数据量大，不合理。group by 是分组操作，会将不同的key去进行分组，然后进入多个reducer里面去执行，最后再count，所以效率会更高，且能达到去重的效果

2.在条件允许的情况下尽量使用limit来限制查询的条数，如果是在服务器或者是web查询时，诗句量过大会直接导致heap不足而报错

3.尽量减少一个表多次查询，小表放前，]]></description><category></category></item><item><title><![CDATA[hive中的数据倾斜及解决方案]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106744667</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106744667</guid><author>fly_sky333</author><pubDate>Sun, 14 Jun 2020 14:24:08 +0800</pubDate><description><![CDATA[一、原因：

1.key的null和空值数量过多，这些都被分到一个reduce中去处理，导致某一个或几个reduce的任务要远大于平均值

2.key的值分布不均匀，某一个或者多个key相同的数据量过大（有些情况是由业务本身的特性决定的）

3.SQL语句不合理

二、现象：

在运行日志里面可以明显看出，任务执行进度一直维持在99%，由于某一个或几个reduce处理的数据量过大且资源无法平均，所以会大大拖慢查询速度。

三、解决方法：

1.开启预聚合MR

hive.map.aggr = true

h]]></description><category></category></item><item><title><![CDATA[hive CLI、hwi、beeline、hiveserver、hiveserver2之间的关系]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106604434</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106604434</guid><author>fly_sky333</author><pubDate>Sun, 14 Jun 2020 12:26:58 +0800</pubDate><description><![CDATA[一、hiveserver和hiveserver2

概述：这两个都是hive的一个服务，为了给外部的应用提供一个访问hive的通道。hiveserver2是hiveserver的一个升级版，由于hiveserver不能处理多于一个客户端的并发请求，并且无法通过修改hiveserver源码来实现，所以在0.11版本上，做了hiverserver2,更有利于开放API客户端，如JDBC更友好的支持

二、hiveCLI

概述：这个是客户端操作，直接在安装hive的节点上执行命令，bin/hive，hive -]]></description><category></category></item><item><title><![CDATA[hive相关知识简单介绍]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106564388</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106564388</guid><author>fly_sky333</author><pubDate>Sun, 07 Jun 2020 16:56:51 +0800</pubDate><description><![CDATA[一、hive概述

hive基于Hadoop，本质就是MR，数据以结构化的方式存储在hdfs上，通过hive以表的形式来展示数据，通过hivesql来对数据进行查询分析

二、
]]></description><category></category></item><item><title><![CDATA[hive参数配置列表]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/106603198</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/106603198</guid><author>fly_sky333</author><pubDate>Sun, 07 Jun 2020 16:49:03 +0800</pubDate><description><![CDATA[注：该列表很多都用不到，如想查看作用，直接搜索即可。

hive.exec.mode.local.auto=true
决定 Hive 是否应该自动地根据输入文件大小，在本地运行（在GateWay运行）
cal.auto.inputbytes.max=134217728L
如果 hive.exec.mode.local.auto 为 true，当输入文件大小小于此阈值时可以自动在本地模式运行，默认是 128兆。
hive.exec.mode.local.auto.tasks.max=4
如果 hive.exe]]></description><category></category></item><item><title><![CDATA[HashMap集合源码以及底层结构解析（何时数组+单项链表变为数组+红黑二叉树）]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/79588400</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/79588400</guid><author>fly_sky333</author><pubDate>Sat, 17 Mar 2018 00:20:05 +0800</pubDate><description><![CDATA[当开始创建集合时，调用构造器，此时会对加载因子初始化当首次调用put方法添加元素时*注意：这里的hash值不是原始值返回的，而是算出key的hash值后和0无符号右移16位后的值进行异或运算*然后进入resize方法到这里resize方法就对table进行了初始化，容量16，临界值12在后面的添加过程中，可能会用到下面else里面的添加方法，这里就不细说了，可以简单看下，然后记住后面的小结部分内容...]]></description><category></category></item><item><title><![CDATA[ArrayList集合底层源代码展示以及结构解析，扩容机制]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/79575723</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/79575723</guid><author>fly_sky333</author><pubDate>Thu, 15 Mar 2018 23:31:16 +0800</pubDate><description><![CDATA[ArrayList初始长度为0（这里以jdk1.8为例），是一个Object类型的空数组，如下当第一次调用add后，长度变为10当数组首次扩容的10个空间用完需要扩容后，会第二次走grow方法来扩容...]]></description><category></category></item><item><title><![CDATA[MySQL主从复制配置流程（win7环境，Linux虚拟机结合简单测试演示）]]></title><link>https://blog.youkuaiyun.com/fly_sky333/article/details/79575625</link><guid>https://blog.youkuaiyun.com/fly_sky333/article/details/79575625</guid><author>fly_sky333</author><pubDate>Thu, 15 Mar 2018 23:16:29 +0800</pubDate><description><![CDATA[先说一下，这篇文章只是利用虚拟机做的一个小测试演练，一般初入职场的新人基本不会碰到到，但是有个别新人问到我了，就简单来做个例子：准备：条件有限，以windows和linux虚拟机为例，让Windows下的MySQL作为主机，Linux下的MySQL作为从机，两个MySQL的版本要一致，配置内容都放在【mysqld】节点下。第一步：在Windows下找到MySQL里面的my.ini文件，修改里面的参...]]></description><category></category></item></channel></rss>