编程套路
关注的点:
1.技术的起源
2.技术的设计思路
JDBC程序的编写复杂么?
1、注册驱动类
Class.forName("com.jdbc.mysql.Driver")
2、获取连接
Connection conn = DriverManager.getConnection()
3、获取Statement
Statement stat = conn.createStatement()
4、执行SQL语句
stat.executeQuery(sql)
5、解析结果
MyBatis程序的编写套路:
1、加载配置文件sqlMapConfig.xml
2、创建一个SessionFactory
3、通过SessionFactory获取一个SQLSession
4、通过SQLSession执行增删改查
5、处理结果
mapreduce的编写套路:
1、编写mapper
public void map(T key, S value, Context context){
//业务逻辑实现
}
2、编写reducer
public void reduce(T key, Iterale<S> values, Context context){
// 聚合逻辑
}
3、编写Driver
job
job.setXXX
job.setXXx
job.waitForCompetition()
job.submit()
4、打包提交到集群运行
hadoop jar xx.jar com.aura.wc.WordCount /input/ /output/
学习新知识的套路:进入官网 1.get started / quick start 快速开始
2.查看详细文档
1、布隆过滤器
2、Hash散列
3、BitMap: 降低内存的使用量。 操作复杂度有所上升的。
位图
找出100G的数据中,出现次数为2次的元素 并且给定的内存有限
要求出出现次数为3次的 怎么做?
简化:
有一批数据,是从1-10000, 请给我找出不存在的元素 并且给定的内存有限
排序: 计数排序
存在不存在用1位
0
1
1次 2次用2位
00
01
10
11
3次 4次 5次 6次 用3位
000
001
010
011
100
101
110
111
4、堆
HDFS
hbase 布隆过滤器
es
kafka
mysql 的索引: B+树
5、双层桶划分
桶
hive的分区:手动建立, 数据不一定是完美的分区的
hive的分桶:经过算法严格校验
6、数据库索引
索引:提高查询效率的
B+树 二分查找
7、倒排索引
瓷器 2394832479 https://baijiahao.baidu.com/s?id=1576691292237237771&wfr=spider&for=pc
瓷器 20340238 https://www.douban.com/group/topic/116057022/?type=like
根据ID 找文档 很容易
根据身份证编号找人 容易
根据姓名找人 身份证里面
现在有10本书
请找出编号为3的书
1 hadoop权威指南
2 算法导论
3 编程珠玑
.....
请找出书中有讨论hadoop的书
实现的复杂度很高
hadoop权威指南 hadoop(233) spark(44) flink(5)
算法导论 HDFS mapreduce hadoop(66)
编程珠玑 java hdfs
html1 key1 key2 key3 ...
html2 key2 key4 kye7
......
key1 html1
key2 html1 html2
HDFS 编程珠玑 算法导论
hadoop hadoop权威指南(233) 算法导论(66) abc(20)
spark hadoop权威指南
flink hadoop权威指南
mapreduce 算法导论
java 编程珠玑
PageRank算法
大数据 从谷歌来的 hadoop 三篇论文
nutch
lucene
es
hbase
hdfs
mapreduce
提高计算和存储效率
storm
mahout
ambari
sqoop
....
8、外排序
重点 排序掌握:timsort
归并排序
两个效果:
1、合并
2、排序
本质原理:
把两个有序数组 合并一个
把两个有序文件合并成一个文件
9、Trie树
字典树
10、分布式解决方案:MapReduce或者Spark
通用解决方案
求TopN
求交集
判断元素存在不存在
求元素出现不出现
求元素出现几次
.....
程序:
数据结构 + 算法
分布式场景中,最复杂的就是优化
十个题目:
题目1: 怎么实现hive不支持的a.id > b.id ?
1、select a.id,a.name, b.id, b.age from a join b on a.id = b.id;
MR去实现: ReduceJoin MapJoin
2、select a.id,a.name, b.id, b.age from a join b on a.id > b.id;
当前这个SQL语句不能执行。! hive不支持非等值链接。!!
hive不支持这种语法。!!! hive -e "select a.id,a.name, b.id, b.age from a join b on a.id > b.id"
怎么做?
1、in exists 0.8以前不支持。 semi join
select a.* from a where a.id in(select b.id from b);
2、on a.id > b.id; 理论 和 宏观上 MR了!!! 怎么实现?
3、笛卡尔积
student
id,name,sex,age,department
select age,count(*) as total from student group by age;
select department, max(age) as maxage from student group by department;
mapper阶段:
key: department
value: age
把一条记录编程(department,age)的一个key-value
map ======映射=====> record ---> key-value
reducer阶段:
每一组就是一个部门
求出这个部门中的所有年龄中的最大值
context.write(department, maxage);
max
min
avg
sum
count
distinct
WordCount : sum count
in/exists
select department, count(*) as total from student where id in (17,18,19,20) group by department;
mapper阶段:
key: department
value: 1或者0
if(id in(17,18,19,20)){
context.write(department, 1)
}else{
// 不做输出,没有也可
}
join
a(id, name) b(id, age)
select a.*, b.* from a join b on a.id = b.id;
reducejoin
是一种通用的join实现方式,最大的缺点就是有可能会有数据倾斜
mapjoin
最大的优势,就是用来避免数据倾斜.
但是只能适用大小表关联
select a.*, b.* from a join b on a.id > b.id;
hive不支持这种语法!!!!!
但是如果非要实现类似的业务逻辑效果,请问如何适用maprecuce去实现?
a(100000000, 1) b(10000000, 1)
请思考如何去做?
题目2: 网银支付的原理!!
网银支付
本地安装数字证书
拿到银行给你的网银盾
输入这个网银盾生成的随机密码
再输入密码
支付成功
微信 + 支付宝
分期 + 白条
SSH 配置免密登陆的原理
一种加密算法
RSA: 非对称加密算法
这种算法会生成一堆秘钥:公钥和私钥
id_rsa 私钥
id_rsa.pub 公钥(网银支付中的数字证书)
如果使用这一对功秘钥中的任意一个加密一个字符串
只有另外一个秘钥能够解密,其他都不能
String miwen = id_rsa(mingwen)
String mingwen = id_rsa.pub(miwen)
密文 明文
root
root 84321832-4812358oj2u34pu10329841324j
明文 密文
种子 身份校验
其实网银盾: 按照某种套路,生成一个固定长度的随机数值
银行内部也有相同的计算逻辑
题目3: 秒杀的实现思路
秒杀:
点杀 秒杀 瞬间干死
假如现在有1000个镶砖石的iphone纪念版手机
2020-11-11 2:00:00 准时开发购买
准备在这个时刻,服务器会接收暴涨的流量(请求)
1000W人在抢1000部手机
你如何设计?
层层过滤
1、点击购买(js就把你拒绝了, 相当于你的请求压根就没发送)
可以过滤绝大部分请求。
余下来的可以发送给服务器
2、服务器接收到的请求是不是应该刚好是1000个呢?
因为有些请求的处理会失败
任务队列,把每个请求放置在任务队列中
处理的时候每次从任务队列中取出一个请求
进行处理
处理成功
1000 - 1
在js把你过滤掉和服务器把你过滤掉。 有区别么?
对用户来说没区别
但是对于服务器来说
区别可大了
LOL IG 思聪: 从转发他的微薄用户中抽取113位用户。每人发红包10000
爆出了 微博抽奖的 逻辑
他的规则:
微博用户的活跃度
原生/原创微博的量
用户的购买消费行为等等都有关系 蓝V 大V
抽奖的权重
100
10
113位: 112位是女生 1位是男生
合理之处:只要是水军,绝对不会中奖
题目4: 百度网盘 都下了 原因是什么?
百度网盘 迅雷 飞秋
原因?
有时候你下一部电影:10m/s
1m/s
A同学的硬盘中存储了一步电影:txwz.avi
B同学和A同学在一个局域网中
B同学要去下载一步电影:天下无贼.avi
B同学下载电影从哪里下载会使用户体验比较友好呢?
1、从服务器下载
2、从A同学下载
题目5: MD5的破解
把用户名和密码存储在数据库的表中:
id username password
1 root root
xxxxxx
id username password
1 root md5("root")
一个算法可以破解,都是因为找到了逆向运行算法
y = f(x) = 3x + 5
x = 5 , y = 20
y1 = f(x) = (x - 5) / 3
x = 20, y = 5
md5压根就没有逆向运行算法,但是还是可以破解。
原理呢?
md5("root") = jldsfjlajdsfa209384013241j341l4
md5("root") = jldsfjlajdsfa209384013241j341l4
幂等性
f(x, y) = x * y
全部都算一遍,然后存起来
字典表!!!!!
jldsfjlajdsfa209384013241j341l4 root
2038409234sdfsdajp32u4123080834 123456
现在编写一个程序,所有各种能作为密码字符的所有字符放在一起,
生成长度小于10的所有的密码
生成这些密码的所有的密文作为key, 对应的密码作为value存储起来
以后只要拿到了密文,直接从数据库中进行匹配即可
密码的复杂度:
尽量包含大小写字母
必须包含一个特殊字符
长度尽量长一些
尽量不要使用常用的密码
root
123456
99999
拉杆箱
机械锁: 3 4
3 : 1000
4: 10000
题目6: 红包算法
微信的红包算法
完全随机算法
1、发一个红包100块钱 10个红包
第一个抢的人从:100中产生一个随机数45,发给他45,剩下55
第二个抢的人从:55中产生一个随机数20发给他,剩下35
....
2、直接一口气生成10个随机数,刚好总和是100
有一定的合理性,但是不是完全合理
3、概率论
正态分布
人类的身高就是一个正态分布
松树的高度就是一个正太分布
人类的寿命也是一个正态分布
所有的值,基本都集中在某个范围内,越往两边走,数量越少
165 175
捷豹
当着全公司所有员工的面,CTO直接就在台上进行codereivew
题目7: 网络秒传功能 怎么实现?
百度网盘:秒传功能
信息摘要生成算法
txwz.avi 1.54G
天下无贼.avi 1.54G
使用一个信息摘要生成算法:
hash
md5
md5(txwz.avi) = 32位长度的一个字符串a
md5(天下无贼.avi) = 32位长度的一个字符串b
如果这两个电影的内容一模一样,那么a和b的结果就是一样的。
题目8: SVN的实现原理? 论文查重!!
Git/SVN 论文是如何实现查重的?
abcdefghijklmnaaaabbbbb
abcdeoofghioojklmnaaaabbbbb
计算两个字符串的重合度
出两个题目:
1、计算两个字符串的最长公共子串
abcdefghijklmnaaaabbbbb
abcdeoofghioojklmnaaaabbbbb
2、计算两个字符串的最长公共子序列
abcdefghijklmn(a ab abc bc ac .... ca)
abccdeffghaijkzlmnnnnnn
3、数据压缩算法
aaaaabbbccddddddee
a5b3c2d6e2
abcdefghijknmllq3uoaljdf
大数据场景中: snappy
题目9: http://www.ip.cn/ 这个网站的 手机归属地查询 IP查询等等是怎么实现的?
是这个站点自己做的?还是怎么做的?
天气怎么实现的?
服务包装