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

Demai Ni commented on HBASE-8663:
---------------------------------

[~ctrezzo]  about your first point on multiple masters. I am thinking about two 
approaches, both involve leveraging existing replication_scope(and 
prerequisites HBASE-8771 , which will ensure only 0 and 1 be used as 
replication_scope) 
A simple approach is: set replication scope to -1 if the table/columnfam is on 
slave-side. In that case the shell command can be used as below:
{code}
hbase(main):001:0> list_replicated_tables
 TABLE      COLUMNFAMILY       CLUSTER
 scores      course            MASTER: global
 t3_dn       cf1               MASTER: global
 usertable   family            MASTER: global
 t1_dn       cf1               SLAVE
 t2_dn       cf2               SLAVE
{code}


A complex/tricky approach is to change the replication_scope dramatically, and 
or just invent a new attribute 'replication_peers', an array of ID. We can use 
positive ID for target-cluster, and negative ID for source-cluster, for example 
{code}
hbase(main):004:0> list_peers
 PEER_ID CLUSTER_KEY STATE
 1 Slave_A.hbase.com:2181:/hbase ENABLED
 2 Slave_B.hbase.com:2181:/hbase ENABLED
 3 Slave_Master_C.hbase.com:2181:/hbase ENABLED
-1 Master_A.hbase.com:2181:/hbase ENABLED
-2 Master_B.hbase.com:2181:/hbase ENABLED
-3 Slave_Master_C.hbase.com:2181:/hbase ENABLED
>describe table
't1_dn', {NAME => 'cf1', REPLICATION_PEERS => '1,2,3', ..}
't2_dn', {NAME => 'cf1', REPLICATION_PEERS => '-1,-2',..}
't3_dn', {NAME => 'cf1', REPLICATION_PEERS => '3,-3',..}

t1_dn#cf1 is replicated from this cluster, and its slave clusters are 
Slave_A,Slave_B and Slave_Master_C
t2_dn#cf1 is replicated to this cluster, and its master clusters are Master_A 
and Master_B
t3_dn#cf1 is setup as Master_Slave replication, with 
Slave_Master_C.hbase.com(while don't have to be the same cluster) 
{code}   

                
> a HBase Shell command to list the tables replicated (from or to) current 
> cluster
> --------------------------------------------------------------------------------
>
>                 Key: HBASE-8663
>                 URL: https://issues.apache.org/jira/browse/HBASE-8663
>             Project: HBase
>          Issue Type: New Feature
>          Components: Replication, shell
>         Environment: clusters setup as Master and Slave for replication of 
> tables 
>            Reporter: Demai Ni
>            Assignee: Demai Ni
>            Priority: Critical
>         Attachments: HBASE-8663.PATCH, HBASE-8663-trunk-v0.patch, 
> HBASE-8663-v2.PATCH
>
>
> This jira is to provide a hbase shell command which can give user can 
> overview of the tables/columnfamilies currently being replicated. The 
> information will help system administrator for design and planning, and also 
> help application programmer to know which tables/columns should be 
> watchout(for example, not to modify a replicated columnfamily on the slave 
> cluster)
> Currently there is no easy way to tell which table(s)/columnfamily(ies) 
> replicated from or to a particular cluster. 
>       
> On Master Cluster, an indirect method can be used by combining two steps: 1) 
> $describe 'usertable'  and 2)  $list_peers to map the REPLICATION_SCOPE to 
> target(aka slave) cluster   
>       
> On slave cluster, this is no existing API/methods to list all the tables 
> replicated to this cluster.    
> Here is an example, and prototype for Master cluster
> {code: title=hbase shell command:list_replicated_tables |borderStyle=solid}
> hbase(main):001:0> list_replicated_tables
>  TABLE      COLUMNFAMILY       TARGET_CLUSTER
>  scores      course            hdtest017.svl.ibm.com:2181:/hbase
>  t3_dn       cf1               hdtest017.svl.ibm.com:2181:/hbase
>  usertable   family            hdtest017.svl.ibm.com:2181:/hbase
> 3 row(s) in 0.3380 seconds
> {code}
> {code: title=method to return all columnfamilies replicated from this cluster 
> |borderStyle=solid}
> /** 
>  * ReplicationAdmin.listRepllicated
>    * @return List of the replicated columnfamilies of this cluster for 
> display. 
>    * @throws IOException 
> */
> public List<String[]> listReplicated() throws IOException {
>     List<String[]> replicatedColFams = new ArrayList<String[]>();  
>     
>     HTableDescriptor[] tables;
>     
>     tables= this.connection.listTables();
>     
>     Map<String, String> peers = listPeers();
>     
>     for (HTableDescriptor table:tables) {
>       HColumnDescriptor[] columns = table.getColumnFamilies();
>       String tableName = table.getNameAsString();
>       for (HColumnDescriptor column: columns) {
>         int scope = column.getScope();
>                 
>         if (scope!=0) {
>           String[] replicatedEntry = new String[3]; 
>           replicatedEntry[0] = tableName;
>           replicatedEntry[1] = column.getNameAsString();
>           replicatedEntry[2] = peers.get(Integer.toString(scope));
>           replicatedColFams.add(replicatedEntry);
>         }
>       }
>     }
>     
>     return replicatedColFams;
>   }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to