前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >得物App万米高空WiFi拦截记

得物App万米高空WiFi拦截记

原创
作者头像
心猿意马
发布于 2023-06-01 11:44:06
发布于 2023-06-01 11:44:06
3330
举报
文章被收录于专栏:得物大前端得物大前端

1.前言

在离线数据研发中,随着业务的快速发展以及业务复杂度的不断提高,数据量的不断增长,尤其得物这种业务的高速增长,必然带来数据逻辑复杂度的提升,数据量越大,复杂度越高,对任务的性能的要求就越高,因此,任务性能的优化就成了大家必然的话题,在离线数仓招聘中,这几乎成了必考题目。

大数据领域,为了提高超大数据量的计算性能,几代人不断在努力,不断榨取着计算机的CPU、内存、磁盘每一个模块的性能,从早期的纵向扩展(提升计算机性能,如IBM、ORACLE 早期推崇的服务器到小型机到大型机的演进)到目前的大规模横向扩展(分布式集群模式),都是旨在提升大数据的性能。

本文重点从在分布式计算模式下,如何来优化任务,大家耳熟能详的常见优化如:mapjoin skewjoin distribute by 等就不多做赘述,本文主要探索技巧、策略及方法。

2.任务优化策略

2.1 优化方向

1.png
1.png

补充说明:目前得物大数据在阿里云的dataworks 环境下,集群层面做了比较多的工作,IO、网络、机架感应等暂时无需过多关注,如有自建集群时,可重点关注,我们重点关注JOIN  和REDUCE 层面,优化细节也重点基于这两个方向做细节展开。

2.2 优化手段

对于优化手段优化方法,我们大多数习惯性从技术手段出发,更多的从算子、逻辑兼容等来处理,但是在某些业务场景下,如埋点日志,数据量一般比较大,这种情况无论技术手段如何干预,都无法解决存储和计算带来的资源消耗,这时候如果要提升SLA,就得从业务场景出发,做好业务的分类分级以及核心数据分流,因此,本文的优化手段会从技术手段和业务手段两方面展开。

2.png
2.png
  • 技术手段

聚焦于技术手段来处理任务,参加上述单点任务优化方向,主要是SQL 逻辑、模型规范、算子优化及可能存在的集群优化

  • 业务手段

聚焦于业务特性、业务逻辑来进行处理,基于不同的业务特性及重要程度,从生产、采集、模型、数据消费全链路进行梳理和架构优化,同时形成一套数据链路上的通知及约束机制,避免上游变更带来的下游数据故障及恢复问题。

3.优化实践案例

优化策略中,定义好优化方向、优化手段,接下来,我们选取一些比较有效的沉淀出来的方案,展开讲讲如何来做任务优化。

前文讲述,目前的得物的数据平台特性(dataworks),我们在IO、网络、RPC 通信机制等暂时涉入不深,且对于面向业务的数据研发来言,大部分人不会过多关注底层的实现原理,暂不做过多深入探讨。

我们基于上面方向中的技术手段讲述几个日常常见的优化案例

3.1 数据重分发(Distribute &Rand)

3.1.1 数据重分发的要点

日常数据研发中,最常见的且使用较多的就是数据倾斜或数据量带来的数据重分发(打散或随机),对于数据的重分发,主要分以下几点:

  • 优化小文件
  • 数据倾斜
  • 排序&随机

小文件过多带来的MAP 端资源损耗和数据倾斜是我们日常开发过程中最为常见的性能问题,而这两点大多跟rand()随机数有一定的关系,通过数据分发和打散和规避掉大部分此场景下的问题。

数据重分发一般代码操作如下所示

代码语言:txt
AI代码解释
复制
select c1,c2... from tablename distribute by c1[,...]
select c1,c2... from tablename distribute by rand([,seed])[,...]

对于rand() 我们要注意几点,可让我们在优化任务时,知其然,更知其所以然。

  • rand() 随机数的生成规律跟数学概率有莫大的关系,尤其在算法中,会被经常性问到,给定随机生成的N个数,构造等概率事件的发生器,跑题了,继续说回在hive 或odps 场景下,rand() 函数是随机生成的0-1 的double 类型的数字。
  • rand(int seed) 函数可以根据种子参数,构造一个稳定的随机值,加上种子参数,得到的结果是相对稳定的,尤其在处理小文件过程中,这一步很重要。
  • Hive 和odps 场景中,随机函数多与pmod()、mod()、floor()、ceil() 等函数结合使用,可以根据不同的业务场景,来构造任意范围内的随机整数,比如在处理数据重分发解决数据倾斜的问题时,同时担心影响这种重分发带来过多的小文件,随机数可以这样来取  floor(rand())*N/ceil(rand())+1,取1-N 之间的整数。

比如在流量数据里面,因为大量空值时,结合rand函数,解决数据倾斜问题:

代码语言:txt
AI代码解释
复制
select * 
from  a 
left join b on a.order_id = nvl(b.order_id ,concat('hive',rand()))
--b中的order_id 存在大量空值 的时候
3.1.2 数据重分发的作用

对于数据重分发,我们主要是用来对处理数据结果进行小文件合并以及对数据处理中的倾斜问题进行优化。在大多数的处理中,我们习惯于使用Distribute by Rand() *N 的方式,其实这个方式可能存在问题,在处理类似问题时候,我们可以选择基于seed种子的Rand函数,来维持随机数的稳定性。这里需要知晓,distribute by 实际上做了一次shuffle的分发,默认是按照给定key进行的hash操作(可以理解为一次repartion重新分区),这里面是可以进行定制分区逻辑的,可以通过重写hive当中partition的接口,实现不同策略的重分发。

  • 处理小文件合并

使用方式一:指定固定分发列,做一次shuffle的merge操作,DEMO如下:

代码语言:txt
AI代码解释
复制
SELECT column1, column2,column.... FROM TABLEX WHERE ds = '${bizdate}'DISTRIBUTE BY '${bizdate}',columns1....

使用方式二:指定给定的文件数,这里要用到rand()函数了,一般有两种写法:第一种写法(上文讨论过,这种写法在一定情况下会出现数据问题):

代码语言:txt
AI代码解释
复制
SELECT column1, column2,column.... FROM TABLEX WHERE ds = '${bizdate}'DISTRIBUTE BY FLOOR(RAND()*N)/CEIL(RAND()*N)

第二种写法(加随机种子,产生稳定的随机序列):

代码语言:txt
AI代码解释
复制
SELECT column1,column2,column.... FROM (    SELECT column1, column2,column...., FLOOR(RAND(seed)*N) AS rep_partion FROM      TABLEX      WHERE ds = '${bizdate}')DISTRIBUTE BY rep_partion
  • 处理JOIN中的倾斜: 与上述逻辑同理,主要是借助一次分发,使得需要shuffle的数据能在一个节点进行数据处理。

3.2 数据膨胀(Explode)

在join过程中,我们之前提到了一种基于BLOOMFILTER算法的优化方法。在某些情况下,当join的表中出现一个表的量级很大,另外一个表无法mapjoin切热键key在概率分布上呈现随机性,这个时候就可以在一定程度上,对较小表中的join key进行一定程度的膨胀,由于join的发生是在reduce阶段,因此可以构造出稳定的多条主键,在不同的reduce中对数据进行jion操作,进而一定程度上解决join倾斜带来的问题。基本原理如下图所示:

3.jpeg
3.jpeg

一个小例子,当研发使用数组形式存储数据(sku_ids)时,数仓想要拿到数组中每一个sku_id,使用 lateral view EXPLODE。代码如下:

代码语言:txt
AI代码解释
复制
select order_id 
from a 
lateral view explode(split(order_ids,',')) v1 as order_id 
group by order_id 

结果展示:

代码语言:txt
AI代码解释
复制
order_ids  order_id 
101,102,103 101
101,102,103 102
101,102,103 103
104,105 104
104,105 105

目前,膨胀函数已经有开发出来有现成的UDTF函数来支持,可以支撑任意膨胀量级的数据进行膨胀。只需要构造膨胀区间对应的随机函数即可,还是需要用到Rand()函数来实现。

数据膨胀方式带来的问题:

在解决了数据倾斜重新打散的问题之后,在计算层面会增加一定的数据计算量。此外,如果能基于分桶进行二次索引分片,也可以在引擎侧考虑基于该方向的自适应倾斜优化。

3.3 数据分桶(Bucket)

在数据量比较大的情况下,单表数据做分区会存在下游使用效率上的限制,而数据在某些列上(或者构造业务列)存在高度聚集,或者存在可以优化提升的巨大空间,在此时,我们就可以对列进行散列分桶,在分区的基础上进行桶表的设计,桶上可以对应索引向量,将极大的提升数据使用上的效率。

在数据随机抽样、JOIN场景中,也会极大的提升整个数据的计算性能和效率。在hive中,该功能默认是关闭的,需要set hive.enforce.bucketing=true打开支持,odps 下可能无需特别关注,需要注意一般而言,桶的个数将与一次作业中对应的reduce数量一致。

其实,基于分桶的逻辑,在引擎侧可以做更多的优化(比如引擎侧可以优化分桶存储的策略)。在join中,根据索引进行join层面的动态优化,在超大数据join过程中,基于桶进行单位数据的本地优化等等都是可以做非常多的优化操作的,由于在目前的业务场景中,较少用到数据分桶,因此这里不做更深入的拓展,详细的可以自行百度,查看关于桶表的使用,更进一步,合理分桶,加上排序后的索引,能高效优化单表查询使用的效率。

3.4 并发与并行控制

在计算机入门的时候,我们就经常听到并发与并行,线程与进程等概念。而在数据研发中,我们发现,其实对于整个作业来说,同样遵循类似的调优规则。一般的,一个作业最大的map数是9999,reduce数最大是1000。虽然可以提高单个任务吞吐量,但是会消耗更长的时间和资源调度上的等待。另一方面,当完成一个同类作业,往往需要多个任务进行,如果任务下面可以多个作业并行处理,单个作业也能够并发执行,那么就能够更大程度地榨取整个集群的资源,从而达到突破计算瓶颈和上线的目的。目前在开源HADOOP体系中,我们没有脚本模式来支持灵活的任务自动分配和调度,但是可以采用SHELL/PYTHON脚本+SQL的方式来实现这一目的,其实借助猛犸调度在一定范围内也能达到同样的效果。

3.5 多路输出与物化(Read Once Output More)

这个部分我们主要谈谈HIVE(spark)的CTE写法(WITH...AS...)以及From语法的应用。这两个语法,在日常开发稍微复杂的任务时候,可以大大清晰整个复杂SQL的逻辑,同时,在多路读写中,通过物化的方式还能在一定程度上加速作业的运行。

  • CTE(with.... as ...)使用
    • 基本使用非常简单,cte的语法主要是为了提高代码的可读性,虽然在整个性能的优化上未必达到很好的效果,但是在一定程度上,能大大提高任务的逻辑清晰度。很多时候,我们在多个逻辑过程中,通过临时表的方式进行任务的串行,使用with...as...能达到类似的效果。同时with...as...可以深层嵌套,因此是比较好的一种选择方式。无论是线上任务还是视图,都可以使用CTE的写法——目前比较遗憾的是HIVE的CTE目前不支持递归。

代码示例(可以使用多个with,抽出代码片段):

代码语言:txt
AI代码解释
复制
with a as (
    select * from test1
    where xxx = xxx
)
,
b as (
    select * from a
)
select * from b limit 100;
  • 物化设置

由于with...as...等同于一个SQL片段,下文中会多次引用该片段的别名,相当于视图的味道。所以,这里面使用是一个虚拟的概念,实际上只是逻辑生效,实际运行是则是翻译成实际的MR逻辑去执行,如果下游引用该SQL片段较多,这时候MR执行会多次扫描原始数据,执行多次相同的MR操作逻辑,此时,就可以在第一次执行中来物化CTE写法中定义的SQL片段,从而达到优化的目的。在hive之前的版本中,该功能是默认关闭的,可以通过下面参数来开启,在新的hive版本中,该功能是默认开启,但是默认引用次数是3次。

社区版hive 如下所示,我们的ODPS 下,大家无需太多关注,这部分做技术扩展和了解即可。

4.png
4.png
5.png
5.png
  • FROM使用(一读多写)
    • FROM也是本人在实际研发中遇到多路输出时采用比较多的一种手段之一。当有多个不同的分区,或者多个不同的目标输出,或者有多个不同的子逻辑的过程中,可以将主逻辑全部开发完成,然后再进行多路输出。多路输出操作的使用限制如下:
    • 单条 multi insert语句中最多可以写255路输出。超过255路,会上报语法错误。
    • 单条 multi insert语句中,对于分区表,同一个目标分区不允许出现多次。
    • 单条 multi insert语句中,对于非分区表,该表不能出现多次。

比如在流量业务场景时,需要写动态分区,就可以使用from,一个代码小例子:

代码语言:txt
AI代码解释
复制
from (
   select aa,bb,pt,sec_pt from test
)
insert OVERWRITE table du_temp.temp_01 partition (pt = 'xx',sec_pt = 'test1' )
select aa,bb where sec_pt = 'test1'
insert OVERWRITE table du_temp.temp_01 partition (pt = 'xx',sec_pt = 'test2' )
select aa,bb where sec_pt = 'test2'

4.思考&总结

在数据研发领域,数据的技术手段无论多么丰富,平台发展何等完善,都不能说能解决业务的所有问题。一定是先有业务,才会有对应的问题。在面对大数据量,高时效性,高复杂计算的场景,我们需要结合业务的特性,模型的改造,链路的设计,甚至打破常规等方式来产出不同的方案。在另一个方面,数据研发的工作也远远不是单点问题的解决和兜底,相反需要各方的配合与共同的智慧。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Kali Linux没有IPv4地址解决方法
我的kali是烧录在U盘的 运行环境为U盘 kali能够检测到网卡 但是没有ipv4地址解决方法
菜菜有点菜
2022/03/16
5.3K2
Kali Linux没有IPv4地址解决方法
如何在 Linux 中配置 IPv4 和 IPv6 地址?
IPv4和IPv6是Internet上常用的两种IP地址协议。在Linux系统中,您可以通过配置网络接口来设置IPv4和IPv6地址。本文将详细介绍如何在Linux中配置IPv4和IPv6地址。
网络技术联盟站
2023/06/20
3.3K0
如何在 Linux 中配置 IPv4 和 IPv6 地址?
Kali-Security渗透系统配置记录
描述:Kail 是基于Debian的Linux发行版它的前身是BackTrack并且由Offensive Security Ltd维护和资助,设计用于渗透测试与取证的系统,系统里面集成了超过300个渗透测试工具复,受到广大的网络安全从业者与爱好者的追捧;
全栈工程师修炼指南
2020/10/26
1.1K0
linux中10个有用的IP命令配置静态IP路由
ip 命令是一个新的网络命令行实用程序,用于在 Linux 系统上为网络接口分配 IP 地址或配置/更新网络配置。 它是 iproute2 软件包的一部分,并提供多项网络管理任务,例如打开或关闭网络接口、分配和删除 IP 地址和路由、管理 ARP 缓存等等。 ip命令与旧的ifconfig 命令非常相似,但它的功能要强大得多,添加了更多的功能和能力。 如何配置静态 IP 地址 Internet 协议 (IPv4) 要在 Linux 中配置静态 IP 地址, 你需要更新或编辑网络配置文件以将静态 IP 地址分
入门笔记
2022/06/02
3.9K0
kali2020 永久性网络配置
查看ip:ip address(ip a) (kali2020 不支持ifconfig查看ip)
宸寰客
2020/07/13
2.7K0
kali2020 永久性网络配置
ubuntu 常用问题解决方法ubuntu11.04升级到11.10 启动不起来(booting system without full network configuration)
sudo vim /etc/NetworkManager/NetworkManager.conf 将 managed=false
sinnoo
2021/07/27
1.9K0
检查 centos 系统上的网络连接
Linux 上有许多可用于查看网络设置和连接的命令。在今天的文章中,我们将会通过一些非常方便的命令来看看它们是如何工作的。
用户1685462
2021/09/13
2.2K0
ubuntu网络的设置方式
ubuntu系统进行网络配置有的时候用图形界面不起作用,这种情况下可以直接修改某些启动脚本或配置文件 Ubuntu系统进行网络配置涉及到几个配置文件1./etc/network/interfaces 2./etc/resolv.conf 操纵步骤: 1.打开ubuntu的/etc/network/interfaces文件默认的内容如下: auto lo iface lo inet loopback 动态获取的配置方法: auto eth0 iface eth0 inet dhcp 静态分配的配置方法: auto eth0 iface eth0 inet static address 192.168.0.1 netmask 255.255.255.0 gateway 192.168.0.1 根据配置要求(是动态分配还是自动获取)修改该配置文件保存。
零式的天空
2022/03/02
2.6K0
ubuntu网络的设置方式
kali基础教程第二篇(kali下的相关配置)
1.修改用户配置文件/etc/shadow 将第二栏设置为*,如下。那么该用户就无法登录。但是使用这种方式会导致该用户的密码丢失,也就是当你再次允许他登录的时候,你还得让他重新设置密码。[再次启用这个帐号的方法是把*去掉就可以了
逍遥子大表哥
2021/12/19
1.1K0
kali基础教程第二篇(kali下的相关配置)
Linux实践|设置静态 IP 地址
如果您是 Linux 系统管理员,那么您将需要在系统上配置网络。与可以使用动态 IP 地址的台式机不同,在服务器基础设施上,您需要设置静态 IP 地址(至少在大多数情况下)。
数据科学工厂
2024/12/30
5150
Linux实践|设置静态 IP 地址
虚拟机中的kali linux没有了eth0,只有lo接口了怎么办
用户1423082
2024/12/31
1380
Linux配置IP地址的方法
注:虚拟机系统通过克隆方式得到其他系统后,在同一网络中无法上网,很可能由于其网卡的UUID相同造成冲突引起的。 解决方案:
全栈程序员站长
2022/06/26
8.8K0
《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?
今天,作为猫头虎博主,我将指导大家在不同操作系统中配置IPv6地址。我们将覆盖从静态到动态的地址配置,以及在Windows、Linux、macOS、Android以及国产操作系统中的具体配置步骤。本文包含丰富的技术词条,如IPv6配置、操作系统IPv6设置、网络配置技巧,确保每位读者都能轻松理解并应用这些知识。
猫头虎
2024/04/09
2.3K0
《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?
ubuntu虚拟机ip地址设置_网络虚拟ip地址怎么弄
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
全栈程序员站长
2022/11/01
1.7K0
ubuntu虚拟机ip地址设置_网络虚拟ip地址怎么弄
Debian中如何设置静态IP地址 网关 DNS
新安装的Debian系统,默认一般使用DHCP获取IP地址,除非在安装过程中,使用了指定的IP地址。本文将介绍如何在Debian系统中,配置使用静态IP地址,配置网关,以及设置DNS服务器。
Debian中国
2018/12/20
9.8K0
ubuntu14.04如何设置静态IP的方法
注意:重启Ubuntu后发现不能上网,问题出现在/etc/resolv.conf。重启后,此文件配置的dns又被自动修改为默认值。所以需要永久性修改DNS。方法为
yaohong
2019/09/11
1.1K0
网络空间安全之一个WH的超前沿全栈技术深入学习之路(六:保姆级教会你如何对Kali本地网络配置、 sshd 服务并使用 xshell 连接:就怕你学成黑客啦!)作者——LJS
盛透侧视攻城狮
2024/10/24
1030
网络空间安全之一个WH的超前沿全栈技术深入学习之路(六:保姆级教会你如何对Kali本地网络配置、 sshd 服务并使用 xshell 连接:就怕你学成黑客啦!)作者——LJS
Linux环境下查看IP不显示IPv4地址
这篇文章记录一下,当我在虚拟机下运行Ubuntu时,想在我的windows下通过putty连接到Linux系统,但发现连接不上,之后在Ubuntu下查看ip,发现显示的内容里没有我想要的IP地址。 现在来记录一下解决办法。
跋扈洋
2022/03/29
5.2K0
Linux环境下查看IP不显示IPv4地址
超详细kali linux 设置固定IP地址步骤
打开VMware Workstation,在已经创建好的虚拟机“TEST 虚拟机创建”上面编辑虚拟机设置,点击“网络适配器”,弹出窗口在网络连接中选择“桥接模式(B)直接连接物理网络”。(不要选择:“复制物理网络连接状态”!)
全栈程序员站长
2022/08/25
10.7K0
超详细kali linux 设置固定IP地址步骤
玩玩树莓派之自动连接无线路由器
前言:啥都没有,还是说说自己的心声,还是啥都没有,嘿嘿,又一段时间没有玩过树莓派了,连连接无线路由器都忘记啦,所以我是来记录记录此过程的。 ---- Step-One:手机安装Fing软件 安装此软件的目的是扫描局同一段域网的IP,想要ssh到树莓派必须知道IP的啦 ---- Step-Two:ssh到树莓派主机,既然都知道了树莓派IP那就ssh上去 ssh pi@172.16.168.125 #默认用户名为pi 密码为raspberry ---- Step-Three:修改网络配置文件/etc
AlicFeng
2018/06/08
6950
推荐阅读
相关推荐
Kali Linux没有IPv4地址解决方法
更多 >
LV.4
无业游民全栈
目录
  • 1.前言
  • 2.任务优化策略
    • 2.1 优化方向
    • 2.2 优化手段
  • 3.优化实践案例
    • 3.1 数据重分发(Distribute &Rand)
      • 3.1.1 数据重分发的要点
      • 3.1.2 数据重分发的作用
    • 3.2 数据膨胀(Explode)
    • 3.3 数据分桶(Bucket)
    • 3.4 并发与并行控制
    • 3.5 多路输出与物化(Read Once Output More)
  • 4.思考&总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档