赞
踩
自从6月的暑假到现在,我已经换了第三份实习了,可叹又可悲。可叹的是费劲千辛万苦终于找到了一家满意的实习单位。可悲的是今年的就业行情和我今年的实习经历一样捉摸不定——实习跳了好几家,一家比一家好,但是要么我看不上人家单位,要么就是我看得上的,转正机会却渺茫。秋招虽然有几个offer,但各方面完全满意的并没有。不仅我是这样,周围的小伙伴们也是如此。
下面我就来讲讲今年的实习经历吧。
毋庸置疑,航天五院是中国顶尖的航天研究院,是伟大的科学家钱学森曾经供职的地方。是历经风霜,有着浓厚的历史感和国防背景的科研院所,也是国有独资的中央企业。它创造出来的产品也是家喻户晓,有东方红一号卫星,有东风导弹、还有长征运载火箭等。我当时在503的卫星通信事业部实习,主要从事军用网管系统和卫星可视化系统的开发,都与国产星链相关。
我先来讲讲自己的实习感受吧。单位有食堂,我们实习生吃饭是免费的,还有员工宿舍也一样免费。只是员工宿舍比较陈旧,宿舍的位置是在友谊路和北清路的交界处,是最老的那一批家属楼。单位负一楼有健身房,8点上班5点下班,是央企。航天院所出差都比较多,工资的话询问了下,转正大概开到18万,提供北京户口但是工资略少。之前在中国资源卫星出差的时候,询问过一起工作的一个501所的同事,他工作两年,工资是一年28万,也没问是总包还是到手。但是问了学历是清华博毕业,这个薪水基本是五院给应届生开的天花板了吧,我们这种硕士应该是拿不到这么多的。总之,和其他研究所比算高的了,和互联网企业比基本是比不过的,但理论上较为稳定,但是base北京,物价房价高企,到底咋样见仁见智。
项目是传统的B/S的前后端开发,军用网管系统基本就是一个上位机系统,用来控制各种通信设备。流程是前端提交->后端计算逻辑->后端发送指令给设备->设备接收到指令并执行->设备反馈执行结果到前端。而卫星可视化系统故名思义就是将卫星状态等可视化展示到前端的项目。
这段实习从2022年的7月上下到今年的6月,大概有10个月左右,接着我回家开始“享受”暑假。
这个公司是做PaaS的,之前就在高铁上见过我司的广告,但一直对PaaS这个概念不甚了解。那什么是PaaS?这是百度百科提供的定义:
PaaS是(Platform as a Service)的缩写,是指平台即服务。 把服务器平台作为一种服务提供的商业模式,通过网络进行程序提供的服务称之为SaaS(Software as a Service),是云计算三种服务模式之一,而云计算时代相应的服务器平台或者开发环境作为服务进行提供就成为了PaaS。
说到PaaS,不得不提到另外两个相关的概念IaaS和SaaS,这里我援引了这篇博文:IaaS、SaaS和PaaS 的区别理解https://baijiahao.baidu.com/s?id=1763683356053056296&wfr=spider&for=pc以下是三者的概念和辨析:
IaaS(Infrastructure as a service – 基础设施即服务):用户可以在云服务提供商提供的基础设施上部署和运行任何软件,包括操作系统和应用软件。用户没有权限管理和访问底层的基础设施,如服务器、交换机、硬盘等,但是有权管理操作系统、存储内容,可以安装管理应用程序,甚至是有权管理网络组件。简单的说用户使用IaaS,有权管理操作系统之上的一切功能。我们常见的IaaS服务有虚拟机、虚拟网络、以及存储。
PaaS(Platform as a service – 平台即服务):PaaS给用户提供的能力是使用由云服务提供商支持的编程语言、库、服务以及开发工具来创建、开发应用程序并部署在相关的基础设施上。用户无需管理底层的基础设施,包括网络、服务器,操作系统或者存储。他们只能控制部署在基础设施中操作系统上的应用程序,配置应用程序所托管的环境的可配置参数。常见的PaaS服务有数据库服务、web应用以及容器服务。成熟的PaaS服务会简化开发人员,提供完备的PC端和移动端软件开发套件(SDK),拥有丰富的开发环境(Inteli、Eclipse、VS等),完全可托管的数据库服务,可配置式的应用程序构建,支持多语言的开发,面向应用市场。
SaaS(Software as a Service – 软件即服务):SaaS给用户提供的能力是使用在云基础架构上运行的云服务提供商的应用程序。可以通过轻量的客户端接口(诸如web浏览器(例如,基于web的电子邮件))或程序接口从各种客户端设备访问应用程序。用户无需管理或控制底层云基础架构,包括网络,服务器,操作系统,存储甚至单独的应用程序功能,可能的例外是有限的用户特定应用程序配置设置。类似的服务有:各类的网盘(Dropbox、百度网盘等),JIRA,GitLab等服务。而这些应用的提供者不仅仅是云服务提供商,还有众多的第三方提供商(ISV: independent software provider)。
可以看到,大数据开发基本都属于「IaaS(Infrastructure as a service – 基础设施即服务)」这个范畴。而分享销客的PaaS基本就是提供了一个软件的框架——用户可以更具自己的需要去添加自定义的逻辑,我实习的时候主要做的是Groovy组件和Java组件的开发,实现一些基本的模块的功能。
纷享销客给的还算可以,250一天,一个月还有240的交通补助,也提供转正,而且转正概率很大。但是,这个岗位与我的预期和求职方向还是有出入的,所以最后还是离开了这个公司。
离开了纷享销客后,下一站就是亚信安全,岗位是大数据运维,主要就是写SQL报表和负责一些已有系统的维护,base依然是上海,实习工资5000一个月。我负责的系统是中国移动4A系统,4A系统是一个集成了权限管理和安全管理的系统,在上海移动研发中心驻场运维。除此之外还有中国电信的一个审计系统需要维护。组里的氛围挺养老的,一点不卷,是理想的生活,奈何我不想干运维想干开发哈哈哈。
很开心能在莉莉丝游戏实习,实习薪资300一天也已经是挺高的价格了。莉莉丝游戏位于上海漕河泾开发区的华鑫慧享城,这里还有微软中国上海分公司。第一天到的时候令我吃惊的是莉莉丝在华鑫一共有5栋办公楼,之前对莉莉丝游戏不是很了解,但是入职了一段时间后个人感觉还是挺nice的。每天下午有免费的水果,每个月底还会请大家吃蛋糕,如下图所示
除此之外吧台还有零食饮料不限量供应,这里展示下吧台和我吃小零食的日常:
而且还有公司专用的接驳车!
Q3团建也是吃吃吃!!!这次是吃海鲜!
总而言之,福利待遇都是不错的。讲完了这些我来讲讲工作相关的内容,我的岗位是数据开发,属于数据分析和挖掘组,主要负责数仓以及各大游戏通用报表的的建设和维护。
莉莉丝的数据加工链路分为离线和实时两个部分,具体如下图所示:
实时部分使用到了阿里云的sls日志采集服务器,原本使用的是公有云,现在逐步迁往私有云。使用flink加工数据,然后送至数据仓库。这是一个精简的图,完整的技术架构图如下所示:
实时这里会遇到一些常见的问题排查,就比如其他组的小伙伴反应自己的数据没有出现在数仓中,那我们首先排查的就是实时部分。我们先排查raw_logs层是否从服务器采集到了数据?常见的问题一般如下所示:
以上就是实时部分的介绍,接着是离线部分的介绍。离线部分采用了经典的onedata的数据分层,分为dwd,dws,ads层,用于报表的展示,这一部分也是主要的工作内容。比如说我曾做过一段花费计算的SQL,用于计算游戏的流水,其来源主要是facebook账号登录的用户:
- SELECT SUM(ad_cost) money, dt
- FROM (
- SELECT
- ad_packages.pkg_id AS pkg,
- if(media_src.name = 'Facebook', '', campaign.name) as campaign,
- if(media_src.name = 'Facebook', '', adgroup.name) as adgroup,
- if(media_src.name = 'Facebook', '', ads.name) as ad,
- upper(if(country = '', 'undefined', country)) as country,
- if(channel = '', 'self-lilith-0.7', channel) as channel,
- CASE
- WHEN f.store_id = 1 THEN 'ios'
- WHEN f.store_id = 2 THEN 'android'
- WHEN f.store_id = 3 THEN 'pc'
- END AS os,
- media_src.name AS media_src,
- date_format(from_unixtime(cost_time), '%Y-%m-%d') AS dt,
- cost_total as ad_cost
- FROM
- finance.finance_cost_country f
- LEFT JOIN dap.ad_spreaders ad_spreader ON f.spreader_id = ad_spreader.id
- LEFT JOIN dap.ad_media_src media_src ON media_src.id = ad_spreader.media_src_id
- LEFT JOIN dap.ad_campaigns campaign ON campaign.id = f.campaign_id
- LEFT JOIN dap.ad_adgroups adgroup ON adgroup.id = f.ad_group_id
- LEFT JOIN dap.ad_ads ads ON ads.id = f.ad_id
- LEFT JOIN dap.ad_packages ad_packages ON ad_packages.app_id = f.app_id
- WHERE
- from_unixtime(cost_time) IN (
- SELECT
- from_unixtime(cost_time)
- FROM
- finance.finance_cost_country cost
- WHERE
- updated_at >= UNIX_TIMESTAMP ('2021-01-01')
- AND cost.game_id = 10057
- GROUP BY from_unixtime(cost_time)
- )
- AND f.game_id = 10057
- AND cost_total > 0
- -- AND pkg IN ({pkg_list})
- group by
- ad_packages.pkg_id,
- if(media_src.name = 'Facebook', '', campaign.name),
- if(media_src.name = 'Facebook', '', adgroup.name),
- if(media_src.name = 'Facebook', '', ads.name),
- upper(if(country = '', 'undefined', country)),
- if(channel = '', 'self-lilith-0.7', channel),
- f.store_id,
- media_src.name,
- from_unixtime(cost_time),
- cost_total
- UNION ALL
- SELECT
- ad_packages.pkg_id AS pkg,
- if(media_src.name = 'Facebook', '', campaign.name) as campaign,
- if(media_src.name = 'Facebook', '', adgroup.name) as adgroup,
- if(media_src.name = 'Facebook', '', ads.name) as ad,
- upper(if(country = '', 'undefined', country)) as country,
- if(channel = '', 'self-lilith-0.7', channel) as channel,
- CASE
- WHEN f.store_id = 1 THEN 'ios'
- WHEN f.store_id = 2 THEN 'android'
- WHEN f.store_id = 3 THEN 'pc'
- END AS os,
- media_src.name AS media_src,
- date_format(from_unixtime(cost_time), '%Y-%m-%d') AS dt,
- cost_total as ad_cost
- FROM
- finance.finance_cost_country f
- LEFT JOIN dap.ad_spreaders ad_spreader ON f.spreader_id = ad_spreader.id
- LEFT JOIN dap.ad_media_src media_src ON media_src.id = ad_spreader.media_src_id
- LEFT JOIN dap.ad_campaigns campaign ON campaign.id = f.campaign_id
- LEFT JOIN dap.ad_adgroups adgroup ON adgroup.id = f.ad_group_id
- LEFT JOIN dap.ad_ads ads ON ads.id = f.ad_id
- LEFT JOIN dap.ad_packages ad_packages ON ad_packages.app_id = f.app_id
- WHERE
- from_unixtime(cost_time) IN (
- SELECT
- from_unixtime(cost_time)
- FROM
- finance.finance_cost_country cost
- WHERE
- updated_at >= UNIX_TIMESTAMP ('2021-01-01')
- and cost.game_id = 10057
- )
- AND f.game_id = 10057
- AND cost_total > 0
- -- AND pkg IN ({pkg_list})
- )
- GROUP BY dt
- ORDER BY dt;
他们使用了一个平台来提交SQL代码,而不像亚信安全,还有星环的那一次,是直接通过navicat连接数据库进行操作的。
回到正题,什么是「花费」?
花费是购买玩家的花费,包含“广告花费”和“品牌花费”。
广告花费的玩家,渠道会标记属于玩家来源,即玩家是看了投放的哪一个广告后下载的游戏。
品牌花费的玩家,渠道会将玩家标记为自然量(organic),即玩家未看广告,自行搜索并下载游戏(苹果商店的排行榜属于organic渠道)。
接着我们来看离线计算部分。离线计算部分的数据仓库分为应用层、汇总层、明细层和原始层。分别对应OneData体系中的ads层、dws层、dwd层和ods层。架构关系图如下所示:
应用层分为报表服务、机器学习服务和用户画像服务。我的工作主要的是报表服务这部分,新版通用报表按照分类可以分为四个模块:总览表、留存报表、LTV和ROI指标报表和付费报表。
按照tableau的存放目录分类,又可以得到如下的树状图:
ROI指标是什么?ROI是投入产出比,也叫投资回报率,也就是收入流水和广告买量的花费的比值(个人理解,如有错误可以指出)。根据ROI,能够衡量用户质量。结合渠道来源,则能够衡量渠道质量。
LTV全称是Life Time Value,指用户生命周期的总价值。通俗的说,是获客至流失所得的收益总和,它的作用在于辅助决策,如:计算回报周期、验证盈利模式等。
计算公式如下:
其中,ARPU(average revenue per user)是“平均每用户收入”,ARPU 值=总收入 / 用户数。Churn是流失用户数
留存则是算30日的。从2-15的留存是连续的,然后跳到30日。有些游戏还要算45、60、90日的留存,但绝大多数是算到30日的。
总览表是一个实时的报表,用的kudu来加速数据的读写。kudu是什么?这里推荐一篇文章。
1、Apache Kudu介绍及架构、工作原理、两种部署方式、使用限制详解 - 知乎Apache Kudu 系列文章 1、Apache Kudu介绍及架构、工作原理、两种部署方式、使用限制详解 2、Apache Kudu-java api操作kudu详细示例以及kudu的三种实现示例 3、Apache Kudu集成impala(shell和java操作)的详细操作…https://zhuanlan.zhihu.com/p/640153281总而言之,Apache Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力。它是一个融合HDFS和HBase的功能的新组件,具备介于两者之间的新存储组件。 Kudu支持水平扩展,并且与Cloudera Impala和Apache Spark等当前流行的大数据查询和分析工具结合紧密。适用于如下的场景:
数仓的主题域被划分成5部分:活跃、交易、资产、风控和社交。
我的工作基本只涉及到了活跃和交易两个部分。一致性纬度主要分为三个部分,投放维度、地理纬度和其他维度,这是三个大类。投放纬度有包名、市场(国际、国内)、渠道(Facebook、organic)和团队(东南亚区、多语种区和英语区)。
而地理纬度有洲(大洋洲、美洲、欧洲和亚洲)国家梯度(第一梯队国家,第二梯队国家,第三梯队国家),创号国家和地区。
还有就是其他维度,如操作系统和风控标记。
ODS层中是数仓采集到的所有未经加工过的数据,主要来源有两个:服务器或客户端上报的原始数据和研发服务器cdc的原始数据。cdc的含义可以看这篇博文
CDC(变化数据捕获)同步技术详解_change data capture-CSDN博客一、CDC(ChangeDataCapture)变化数据捕获概念1、变化数据捕获简称CDC,抽取处理需要重点考虑增量抽取,假设一个数据仓库系统,在每天夜里的业务低峰时间从操作型源系统抽取数据,那么增量抽取只需要过去24小时内发生变化的数据。注意:当你能够识别并获得最近发生变化的数据时,抽取及其后面的转换、装载操作显然都会变得更高效,因为这样需要处理的数据量就会少很多。二、CDC(..._change data capturehttps://blog.csdn.net/qq30211478/article/details/100690948DWD层中主要对原始日志进行清洗并形成纬度扩展后的业务明细数据。数据粒度与ODS层是一致的。
DWS层中,对DWD层的数据按照业务需求进行聚合形成新的数据。还按照业务实体设计标签表,用于用户画像的分析。
ADS层中是各类临时数据分报告用的数据,以及各类业务报表的数据。
DIM层存放通用维表,如汇率,商店价格档位映射。还有就是项目组特定的维度表,如礼包信息和装备信息。数据来源有项目组cdc的原始数据,也有手动上传的维表。
在莉莉丝,我第一次接触到了apache kudu和apache iceberg还有Trino。这里给出了两个链接,方便以后的学习。
1、Apache Kudu介绍及架构、工作原理、两种部署方式、使用限制详解 - 知乎Apache Kudu 系列文章 1、Apache Kudu介绍及架构、工作原理、两种部署方式、使用限制详解 2、Apache Kudu-java api操作kudu详细示例以及kudu的三种实现示例 3、Apache Kudu集成impala(shell和java操作)的详细操作…https://zhuanlan.zhihu.com/p/640153281数据湖:Apache Iceberg在腾讯的探索和实践 - 知乎摘要:今天分享的是Apache Iceberg在腾讯内部的探索和实践。本文结合腾讯大数据技术分享内容和2020全球软件开发大会分享内容进行整理,主要内容包括: 1、数据湖技术概述 2、Apache Iceberg的简介 3、腾讯为什么选…https://zhuanlan.zhihu.com/p/398516173大数据开发都值得拥有一个Trino——Connect everything - 知乎引言 AdHoc —— Connect Everything,是我给 Trino 的一个中肯的评价。 也希望通过它,让大家能够对Trino这样一个无比优秀的、而且又有故事的MPP引擎印象深刻。本篇,不讲概念、也不讲原理,只想告诉大家,有一个…https://zhuanlan.zhihu.com/p/397704152(未完待续)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。