项目开发|青训营笔记
这是我参与【第四届青训营-大数据场】笔记创作活动的的第1篇笔记
datanode功能开发
客户端和chunk_server通信服务开发
client -> chunk_server rpcs
- 主要思路:
- 客户端会写文件时,会向namenode请求分配chunkhandle,而客户端得到chunkhandle后,就会向datanode提出请求,此时datanode就会以chunkhandle为键,data为值,实现写数据的功能。
- 客户端读文件时,与之类似,先向namenode请求,拿到chunkhandle后,再向datanode请求,datanode会根据chunkhandle读出数据库中的数据,返回给客户端。
- 客户端和chunkserver通信的proto文件中的服务定义如下:
service Cli2ChunkServer {
rpc ReadChunk(ReadChunkRequest) returns (ReadChunkReply) {}
rpc WriteChunk(WriteChunkRequest) returns (WriteChunkReply) {}
}
- readchunk()的请求和响应结构定义如下:
- ReadChunkRequest中是客户端需要发给chunkserver的请求,主要包括:chunkhandle,offset,length。根据这三个参数,就可以指定读取该chunkhandle下存储的指定位置,指定长度的数据。
- ReadChunkReply中是chunkserver需要给客户端返回的响应,主要包括:data,bytes_read。即:返回客户端需要读取的真实的数据和读取到的数据的长度。
// cli2chunkserver: rpc ReadChunk()
message ReadChunkRequest {
int64 chunkhandle = 1;
int64 offset = 2;
int64 length = 3;
}
message ReadChunkReply {
string data = 1;
int64 bytes_read = 2;
}
- WriteChunk()的请求和响应结构定义如下:
- WriteChunkRequest中是客户端向chunkserver发送的请求,主要包括:client_id,chunkhandle,offset,length,locations,data。客户端需要传入客户端的id,需要写入的chunkhandle,写入的偏移位置,写入的长度,locations中存放的是该数据副本需要存放的多台chunkserver的ip:port,data是真正需要写入的数据。
- WriteChunkReply中是chunkserver写入数据成功后,就会将写入的数据长度bytes_read发送给客户端,以此来告知客户端数据写入成功。
message WriteChunkRequest {
int64 client_id = 1;
int64 chunkhandle = 2;
int64 offset = 3;
int64 length = 4;
repeated string locations = 5;
bytes data = 6;
}
message WriteChunkReply {
int64 bytes_read = 2;
}
以上就是我对客户端和chunkserver端进行读写通信的服务定义,采用了文件读写方式进行,后面考虑使用leveldb数据库进行持久化存储。