设为首页 收藏本站
查看: 1120|回复: 0

[经验分享] Hadoop学习二十:Hadoop-Hdfs 通信机制VersionedProtocol接口方法

[复制链接]

尚未签到

发表于 2016-12-8 10:52:35 | 显示全部楼层 |阅读模式
一. VersionedProtocol

//使用Hadoop RPC机制的所有协议的超类  
//所有子类所以自己的协议号static final long versionID
public interface VersionedProtocol {
/**  
* 返回与指定协议protocol相关的协议版本  
* @param protocol 协议接口的类名  
* @param clientVersion 客户端欲与服务器进行交互,它所使用的协议版本  
* @return 返回服务器将要与客户端进行交互,所需要使用的协议版本  
*/   
public long getProtocolVersion(String protocol,  long clientVersion) throws IOException;
}
二.ClientDatanodeProtocol

//ClientDatanodeProtocol用于Client和DataNode通信
public interface ClientDatanodeProtocol extends VersionedProtocol {
//ClientDatanodeProtocol版本号4L
public static final long versionID = 4L;

//恢复block
LocatedBlock recoverBlock(Block block, boolean keepLength,
DatanodeInfo[] targets) throws IOException;
//获得当前DataNode上的block
Block getBlockInfo(Block block) throws IOException;
//获得指定block的位置信息BlockLocalPathInfo
BlockLocalPathInfo getBlockLocalPathInfo(Block block,
Token<BlockTokenIdentifier> token) throws IOException;           
}
三. InterDatanodeProtocol

//InterDatanodeProtocol用于DataNode与DataNode通信
public interface InterDatanodeProtocol extends VersionedProtocol {
//InterDatanodeProtocol 版本号3L
public static final long versionID = 3L;
//获得指定block的元数据信息
BlockMetaDataInfo getBlockMetaDataInfo(Block block) throws IOException;
//恢复数据块
BlockRecoveryInfo startBlockRecovery(Block block) throws IOException;
//更新数据块
void updateBlock(Block oldblock, Block newblock, boolean finalize) throws IOException;
}
四. ClientProtocol

/**
* ClientProtocol用于用户通过DistributedFileSystem访问NameNode
* Client可以操作namespace目录,打开/关闭文件流等等
* 以下所有方法发起方都是Client,接收方都是NameNode
*/
public interface ClientProtocol extends VersionedProtocol {
//ClientProtocol 协议号61L
public static final long versionID = 61L;
///////////////////////////////////////
// File contents
///////////////////////////////////////
//获得一个文件对应的list<块,块的位置<list<位置>>信息
public LocatedBlocks  getBlockLocations(String src,
long offset,
long length) throws IOException;
//在命名空间中创建一个文件入口。该方法将创建一个由src路径指定的空文件
//该路径src应该反映了从root目录开始的一个完整路径名称
//从客户端的角度,Namenode并没有“当前”目录的概念。一旦文件创建成功,该文件就是可见的,并可以被其它客户端来执行读操作。
//但是,其它客户端不能够对该文件进行删除、重命名、重写,而这些操作只有在该文件被完全或明确指定为租约到期,才可以执行。
//每个块都具有最大长度限制,如果客户端想要创建多个块,可以调用addBlock(String, String)方法来实现。
public void create(String src,
FsPermission masked,
String clientName,
boolean overwrite,
boolean createParent,
short replication,
long blockSize
) throws IOException;
public void create(String src,
FsPermission masked,
String clientName,
boolean overwrite,
short replication,
long blockSize
) throws IOException;
//向文件src中追加写入内容,返回一个org.apache.hadoop.hdfs.protocol.LocatedBlock对象
//该对象封装了 块,块的位置<list<位置>的对应关系,通过追加写操作后的返回信息,可以定位到追加写入最后部分块的信息。
public LocatedBlock append(String src, String clientName) throws IOException;

//开始恢复租约
public boolean recoverLease(String src, String clientName) throws IOException;

//设置已经存在的文件的复制因子
//Namenode会为指定文件设置副本因子,但是,不期望在调用该方法的过程修改实际块的副本因子,而是由后台块维护进程来执行:
//如果当前副本因子小于设置的新副本因子,需要增加一些块副本,如果当前副本因子大于设置的新副本因子,就会删除一些块副本。
public boolean setReplication(String src,
short replication
) throws IOException;

//为已经存在的目录或者文件,设置给定的操作权限  
public void setPermission(String src, FsPermission permission
) throws IOException;

//设置文件或目录属主  
public void setOwner(String src, String username, String groupname
) throws IOException;

//客户端放弃对指定块的操作
public void abandonBlock(Block b, String src, String holder
) throws IOException;

public LocatedBlock addBlock(String src, String clientName) throws IOException;

//客户端向一个当前为写操作打开的文件写入数据块  
public LocatedBlock addBlock(String src, String clientName,
DatanodeInfo[] excludedNodes) throws IOException;
//客户端完成对指定文件的写操作,并期望能够写完
//在写完以后关闭文件,返回是否成功关闭;如果返回false,调用者应该再次发送请求
//该方法只有在所有文件的文件块全部达到最小复制因子时才返回true
public boolean complete(String src, String clientName) throws IOException;
//客户端报告corrupted块的信息
public void reportBadBlocks(LocatedBlock[] blocks) throws IOException;
///////////////////////////////////////
// Namespace management
///////////////////////////////////////
//重命名文件系统里的一个文件或目录   
public boolean rename(String src, String dst) throws IOException;
public boolean delete(String src) throws IOException;

//删除文件系统里的一个文件或目录 ,recursive 是否递归删除子目录
public boolean delete(String src, boolean recursive) throws IOException;

//创建指定权限的目录
public boolean mkdirs(String src, FsPermission masked) throws IOException;

//获取指定目录的目录/文件列表
public DirectoryListing getListing(String src, byte[] startAfter)
throws IOException;
///////////////////////////////////////
// System issues and management
///////////////////////////////////////

//一个client操作某个文件时,为了防止其它clinet同时操作此文件,该client获取了一些列锁
//如果此时该client突然意外死亡,Namenode会销毁这个锁并认为此client已经死亡
//如果此client发送renewLease请求,告诉Namenode我没死;如果一段时间不发送,NameNode认为此client彻底死亡
public void renewLease(String clientName) throws IOException;

//获取文件系统现有的状态信息
/**  
* 返回一组标识文件系统不同信息的索引数组:  
* <ul>  
* <li> [0] 包含文件系统总存储容量(按字节计算)</li>  
* <li> [1] 包含文件系统已使用空间(按字节计算)</li>  
* <li> [2] 包含文件系统可使用空间(按字节计算)</li>  
* <li> [3] 包含文件系统中不满足副本因子数量的块的数量</li>  
* <li> [4] 包含corrupt副本的块的数量 </li>  
* <li> [5] 包含没有任何可以用的块副本的块的数量</li>  
* </ul>  
*/   
public long[] getStats() throws IOException;

//获得当前DataNodes的状态信息
public DatanodeInfo[] getDatanodeReport(FSConstants.DatanodeReportType type)
throws IOException;
//获得指定文件的block size
public long getPreferredBlockSize(String filename) throws IOException;

//进入 离开 获取安全模式
public boolean setSafeMode(FSConstants.SafeModeAction action) throws IOException;
//保存命名空间映像
//保存当前namespace到storage directories,然后进行checkpoint操作
public void saveNamespace() throws IOException;
//告诉NameNode重读hosts文件
public void refreshNodes() throws IOException;
//完成升级
public void finalizeUpgrade() throws IOException;
//获得升级过程中的当前状态
public UpgradeStatusReport distributedUpgradeProgress(UpgradeAction action)
throws IOException;
//将Namenode结点上的数据结构写入到指定的文件中,如果指定文件已经存在,则追加到该文件中,就是checkpoint过程  
public void metaSave(String filename) throws IOException;

//重新为所有DataNode设置带宽
public void setBalancerBandwidth(long bandwidth) throws IOException;

//获得指定文件或目录的状态信息
public HdfsFileStatus getFileInfo(String src) throws IOException;

//获得指定目录的容量
public ContentSummary getContentSummary(String path) throws IOException;

//设置指定目录的配额
public void setQuota(String path, long namespaceQuota, long diskspaceQuota)
throws IOException;

//设置给定文件的修改时间
public void setTimes(String src, long mtime, long atime) throws IOException;

//获得令牌
public Token<DelegationTokenIdentifier> getDelegationToken(Text renewer) throws IOException;

//重新创建令牌
public long renewDelegationToken(Token<DelegationTokenIdentifier> token)
throws IOException;
//取消已经存在的令牌
public void cancelDelegationToken(Token<DelegationTokenIdentifier> token)
throws IOException;
五. DatanodeProtocol

//DatanodeProtocol用于Datanode与NameNode的通信
//上报心跳 等
//NameNode与DataNode通信的唯一方式是 DataNode----->NameNode时带回返回值
public interface DatanodeProtocol extends VersionedProtocol {
//DatanodeProtocol版本号26L
public static final long versionID = 26L;

/**  
* 当接收到Datanode的命令的时候,根据下述状态码确定Datanode应该执行何种操作,   
*/   
final static int DNA_UNKNOWN = 0;    // 未知      
final static int DNA_TRANSFER = 1;   // 将数据块从一个Datanode转移到另一个Datanode   
final static int DNA_INVALIDATE = 2; // 未验证数据块   
final static int DNA_SHUTDOWN = 3;   // 关闭Datanode   
final static int DNA_REGISTER = 4;   // 重新注册   
final static int DNA_FINALIZE = 5;   // 完成先前执行的升级操作   
final static int DNA_RECOVERBLOCK = 6;  // 数据块恢复操作请求
final static int DNA_ACCESSKEYUPDATE = 7;  // 更新 access key
final static int DNA_BALANCERBANDWIDTHUPDATE = 8; // 更改带宽
//注册一个Datanode
public DatanodeRegistration register(DatanodeRegistration registration
) throws IOException;
//发送心跳,带回返回值
//心跳告诉NameNode此DataNode的存活状态和其它状态信息
//返回值告诉DataNode移除或拷贝某些block
public DatanodeCommand[] sendHeartbeat(DatanodeRegistration registration,
long capacity,
long dfsUsed, long remaining,
int xmitsInProgress,
int xceiverCount) throws IOException;
//发送block report 告诉NameNode此DataNode上的block信息
//NameNode返回DatanodeCommand 告诉DataNode孤立block和应该删除的block
public DatanodeCommand blockReport(DatanodeRegistration registration,
long[] blocks) throws IOException;

//告诉NameNode blocks-being-written信息
public void blocksBeingWrittenReport(DatanodeRegistration registration,
long[] blocks) throws IOException;

//Datanode向Namenode报告最近接收到的数据块、删除的多余块副本  
public void blockReceived(DatanodeRegistration registration,
Block blocks[],
String[] delHints) throws IOException;
//向Namenode报告错误信息  
public void errorReport(DatanodeRegistration registration,
int errorCode,
String msg) throws IOException;
public NamespaceInfo versionRequest() throws IOException;

//向Namenode发送一个升级命令  
UpgradeCommand processUpgradeCommand(UpgradeCommand comm) throws IOException;

//向Namenode报告Bad Blocks  
public void reportBadBlocks(LocatedBlock[] blocks) throws IOException;

//为数据块生成新的时间戳   
public long nextGenerationStamp(Block block, boolean fromNN) throws IOException;
//在恢复数据块期间,提交事务:数据块同步
public void commitBlockSynchronization(Block block,
long newgenerationstamp, long newlength,
boolean closeFile, boolean deleteblock, DatanodeID[] newtargets
) throws IOException;
}

六. NamenodeProtocol

//NamenodeProtocol用于Secondary NameNode与NameNode的通信
public interface NamenodeProtocol extends VersionedProtocol {
//NamenodeProtocol版本号3L
public static final long versionID = 3L;

//获得指定DataNode上的所有blocks
public BlocksWithLocations getBlocks(DatanodeInfo datanode, long size)
throws IOException;

//获得当前block keys
public ExportedBlockKeys getBlockKeys() throws IOException;

//获得editlog文件大小
public long getEditLogSize() throws IOException;

//参考第2步 http://zy19982004.iyunv.com/blog/1870624
public CheckpointSignature rollEditLog() throws IOException;

//参考第456步 http://zy19982004.iyunv.com/blog/1870624
public void rollFsImage() throws IOException;
}
七. RefreshAuthorizationPolicyProtocol

/**
* Protocol which is used to refresh the authorization policy in use currently.
*/
public interface RefreshAuthorizationPolicyProtocol extends VersionedProtocol {
public static final long versionID = 1L;
/**
* Refresh the service-level authorization policy in-effect.
* @throws IOException
*/
void refreshServiceAcl() throws IOException;
}
八. RefreshUserMappingsProtocol

public interface RefreshUserMappingsProtocol extends VersionedProtocol {
public static final long versionID = 1L;
public void refreshUserToGroupsMappings() throws IOException;
public void refreshSuperUserGroupsConfiguration()
throws IOException;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-311425-1-1.html 上篇帖子: hadoop中的排序(转) 下篇帖子: hadoop 1.x 2.x 配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表