1.HDFS读写流程
HDFS读流程
HDFS client 调用FileSystem.open(filePath),
与NN进行【RPC】通宵,返回该文件的block列表
返回 FSDataInputStream 对象
HDFS client 调用FSDataInputStream.read方法
与第一个块最近的DN进行读取,读取完成后检查是否读取到想要的数据?
如果读取到,关闭与DN通信
如果未读取到,就从第二个节点去读取,以此类推
当block列表全部读取完成
HDFS client调用FSDataInputStream的close方法
关闭数据流
(RPC:远程过程调用)
HDFS写流程
HDFS client 调用FileSystem.create(filePath)方法
与NN进行【RPC】通信
NN会检查这个文件是否存在?是否有权限创建这个文件如果都可以,就创建一个文件
这个时候,文件是没有数据的,也不关联block
NN会再根据文件的大小,块大小,副本数等
计算要上传多少的块和对应的DN节点
最终这个信息返回给客户端【FSDataOutputStream】对象
HDFSclient调用客户端【FSDataOutputStream】对象
根据NN返回的信息,将第一个块的第一个副本写到DN1,
写完复制到DN2,再复制到DN3
当我们三个副本写完,DN3返回ack【确认字符】给DN2
DN2接收到ack,返回ack给DN1
DN1接收到ack,返回ack给【FSDataoutputStream】
告诉它第一个块的三副本写完了
以此类推
当所有的块全部都写完
HDFS client调用【FSDataoutputStream】的close方法
关闭数据流
然后调用FileSystem.complete方法,告诉NN文件写成功。
2.SQL
rows between
unbounded preceding 前面所有行
n preceding 前面n行
current row 当前行
n following 后面n行
unbounded following 后面所有行
连续登陆:
登陆日期与rank值做差,相同的值为连续登陆。
select id, max(cnt)
from (select id, login_sub, count(1) cnt
from (select id, login_data - rk login_sub
from (select id,
login_data,
row_number() over(partition by id order by login_data) rk
from login))
group by id, login_sub)
group by id
3.sql题
递归,emp表递归
empno,ename,level,tree
select t1.empno,t1.ename,t1.mgr,t2.ename mgr_name,level from emp t1
left join emp t2
on t1.mgr=t2.empno
start with t1.ename='KING'
connect by prior t1.empno=t1.mgr