[ 
https://issues.apache.org/jira/browse/HDFS-8946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14718222#comment-14718222
 ] 

Masatake Iwasaki commented on HDFS-8946:
----------------------------------------

Thanks for working on this, [~Hitliuyi]. I read the code of 
BlockPlacementPolicyDefault for HDFS-8945 recently and comment here while my 
memory is fresh:-)

bq. Besides, no need to shuffle the storages, since we only need to check 
according to the storage type on the datanode once.

Here is my understanding of this. Please correct me if I'm wrong:
   
{{LocatedBlock}} returned by {{ClientProtocol#addBlock}}, 
{{ClientProtocol#getAdditionalDatanode}} and 
{{ClientProtocol#updateBlockForPipeline}} contains storageIDs given by 
{{BlockPlacementPolicy#chooseTarget}} but the user of these APIs (which is only 
DataStreamer) does not uses storageIDs. DataStreamer just send storage type to 
DataNode and the DataNode decides which volume to use on its own by using 
{{VolumeChoosingPolicy}}.


> Improve choosing datanode storage for block placement
> -----------------------------------------------------
>
>                 Key: HDFS-8946
>                 URL: https://issues.apache.org/jira/browse/HDFS-8946
>             Project: Hadoop HDFS
>          Issue Type: Improvement
>          Components: namenode
>            Reporter: Yi Liu
>            Assignee: Yi Liu
>         Attachments: HDFS-8946.001.patch, HDFS-8946.002.patch
>
>
> This JIRA is to:
> Improve chooseing datanode storage for block placement:
> In {{BlockPlacementPolicyDefault}} ({{chooseLocalStorage}}, 
> {{chooseRandom}}), we have following logic to choose datanode storage to 
> place block.
> For given storage type, we iterate storages of the datanode. But for 
> datanode, it only cares about the storage type. In the loop, we check 
> according to Storage type and return the first storage if the storages of the 
> type on the datanode fit in requirement. So we can remove the iteration of 
> storages, and just need to do once to find a good storage of given type, it's 
> efficient if the storages of the type on the datanode don't fit in 
> requirement since we don't need to loop all storages and do the same check.
> Besides, no need to shuffle the storages, since we only need to check 
> according to the storage type on the datanode once.
> This also improves the logic and make it more clear.
> {code}
>       if (excludedNodes.add(localMachine) // was not in the excluded list
>           && isGoodDatanode(localDatanode, maxNodesPerRack, false,
>               results, avoidStaleNodes)) {
>         for (Iterator<Map.Entry<StorageType, Integer>> iter = storageTypes
>             .entrySet().iterator(); iter.hasNext(); ) {
>           Map.Entry<StorageType, Integer> entry = iter.next();
>           for (DatanodeStorageInfo localStorage : DFSUtil.shuffle(
>               localDatanode.getStorageInfos())) {
>             StorageType type = entry.getKey();
>             if (addIfIsGoodTarget(localStorage, excludedNodes, blocksize,
>                 results, type) >= 0) {
>               int num = entry.getValue();
>               ...
> {code}
> (current logic above)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to