Published site at d5aaeee88b331e064830a2774f4fed238631457c.
[hbase-site.git] / devapidocs / src-html / org / apache / hadoop / hbase / backup / HBackupFileSystem.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2 <html lang="en">
3 <head>
4 <title>Source code</title>
5 <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
6 </head>
7 <body>
8 <div class="sourceContainer">
9 <pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
10 <span class="sourceLineNo">002</span> *<a name="line.2"></a>
11 <span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
12 <span class="sourceLineNo">004</span> * or more contributor license agreements. See the NOTICE file<a name="line.4"></a>
13 <span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
14 <span class="sourceLineNo">006</span> * regarding copyright ownership. The ASF licenses this file<a name="line.6"></a>
15 <span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
16 <span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
17 <span class="sourceLineNo">009</span> * with the License. You may obtain a copy of the License at<a name="line.9"></a>
18 <span class="sourceLineNo">010</span> *<a name="line.10"></a>
19 <span class="sourceLineNo">011</span> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
20 <span class="sourceLineNo">012</span> *<a name="line.12"></a>
21 <span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
22 <span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
23 <span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
24 <span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
25 <span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
26 <span class="sourceLineNo">018</span> */<a name="line.18"></a>
27 <span class="sourceLineNo">019</span><a name="line.19"></a>
28 <span class="sourceLineNo">020</span>package org.apache.hadoop.hbase.backup;<a name="line.20"></a>
29 <span class="sourceLineNo">021</span><a name="line.21"></a>
30 <span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
31 <span class="sourceLineNo">023</span>import java.util.HashMap;<a name="line.23"></a>
32 <span class="sourceLineNo">024</span><a name="line.24"></a>
33 <span class="sourceLineNo">025</span>import org.apache.hadoop.conf.Configuration;<a name="line.25"></a>
34 <span class="sourceLineNo">026</span>import org.apache.hadoop.fs.FileSystem;<a name="line.26"></a>
35 <span class="sourceLineNo">027</span>import org.apache.hadoop.fs.Path;<a name="line.27"></a>
36 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HConstants;<a name="line.28"></a>
37 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.TableName;<a name="line.29"></a>
38 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.backup.impl.BackupManifest;<a name="line.30"></a>
39 <span class="sourceLineNo">031</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.31"></a>
40 <span class="sourceLineNo">032</span>import org.slf4j.Logger;<a name="line.32"></a>
41 <span class="sourceLineNo">033</span>import org.slf4j.LoggerFactory;<a name="line.33"></a>
42 <span class="sourceLineNo">034</span><a name="line.34"></a>
43 <span class="sourceLineNo">035</span>/**<a name="line.35"></a>
44 <span class="sourceLineNo">036</span> * View to an on-disk Backup Image FileSytem Provides the set of methods necessary to interact with<a name="line.36"></a>
45 <span class="sourceLineNo">037</span> * the on-disk Backup Image data.<a name="line.37"></a>
46 <span class="sourceLineNo">038</span> */<a name="line.38"></a>
47 <span class="sourceLineNo">039</span>@InterfaceAudience.Private<a name="line.39"></a>
48 <span class="sourceLineNo">040</span>public final class HBackupFileSystem {<a name="line.40"></a>
49 <span class="sourceLineNo">041</span> public static final Logger LOG = LoggerFactory.getLogger(HBackupFileSystem.class);<a name="line.41"></a>
50 <span class="sourceLineNo">042</span><a name="line.42"></a>
51 <span class="sourceLineNo">043</span> /**<a name="line.43"></a>
52 <span class="sourceLineNo">044</span> * This is utility class.<a name="line.44"></a>
53 <span class="sourceLineNo">045</span> */<a name="line.45"></a>
54 <span class="sourceLineNo">046</span> private HBackupFileSystem() {<a name="line.46"></a>
55 <span class="sourceLineNo">047</span> }<a name="line.47"></a>
56 <span class="sourceLineNo">048</span><a name="line.48"></a>
57 <span class="sourceLineNo">049</span> /**<a name="line.49"></a>
58 <span class="sourceLineNo">050</span> * Given the backup root dir, backup id and the table name, return the backup image location,<a name="line.50"></a>
59 <span class="sourceLineNo">051</span> * which is also where the backup manifest file is. return value look like:<a name="line.51"></a>
60 <span class="sourceLineNo">052</span> * "hdfs://backup.hbase.org:9000/user/biadmin/backup/backup_1396650096738/default/t1_dn/", where<a name="line.52"></a>
61 <span class="sourceLineNo">053</span> * "hdfs://backup.hbase.org:9000/user/biadmin/backup" is a backup root directory<a name="line.53"></a>
62 <span class="sourceLineNo">054</span> * @param backupRootDir backup root directory<a name="line.54"></a>
63 <span class="sourceLineNo">055</span> * @param backupId backup id<a name="line.55"></a>
64 <span class="sourceLineNo">056</span> * @param tableName table name<a name="line.56"></a>
65 <span class="sourceLineNo">057</span> * @return backupPath String for the particular table<a name="line.57"></a>
66 <span class="sourceLineNo">058</span> */<a name="line.58"></a>
67 <span class="sourceLineNo">059</span> public static String<a name="line.59"></a>
68 <span class="sourceLineNo">060</span> getTableBackupDir(String backupRootDir, String backupId, TableName tableName) {<a name="line.60"></a>
69 <span class="sourceLineNo">061</span> return backupRootDir + Path.SEPARATOR + backupId + Path.SEPARATOR<a name="line.61"></a>
70 <span class="sourceLineNo">062</span> + tableName.getNamespaceAsString() + Path.SEPARATOR + tableName.getQualifierAsString()<a name="line.62"></a>
71 <span class="sourceLineNo">063</span> + Path.SEPARATOR;<a name="line.63"></a>
72 <span class="sourceLineNo">064</span> }<a name="line.64"></a>
73 <span class="sourceLineNo">065</span><a name="line.65"></a>
74 <span class="sourceLineNo">066</span> /**<a name="line.66"></a>
75 <span class="sourceLineNo">067</span> * Get backup temporary directory<a name="line.67"></a>
76 <span class="sourceLineNo">068</span> * @param backupRootDir backup root<a name="line.68"></a>
77 <span class="sourceLineNo">069</span> * @return backup tmp directory path<a name="line.69"></a>
78 <span class="sourceLineNo">070</span> */<a name="line.70"></a>
79 <span class="sourceLineNo">071</span> public static Path getBackupTmpDirPath(String backupRootDir) {<a name="line.71"></a>
80 <span class="sourceLineNo">072</span> return new Path(backupRootDir, ".tmp");<a name="line.72"></a>
81 <span class="sourceLineNo">073</span> }<a name="line.73"></a>
82 <span class="sourceLineNo">074</span><a name="line.74"></a>
83 <span class="sourceLineNo">075</span> /**<a name="line.75"></a>
84 <span class="sourceLineNo">076</span> * Get backup tmp directory for backupId<a name="line.76"></a>
85 <span class="sourceLineNo">077</span> * @param backupRoot backup root<a name="line.77"></a>
86 <span class="sourceLineNo">078</span> * @param backupId backup id<a name="line.78"></a>
87 <span class="sourceLineNo">079</span> * @return backup tmp directory path<a name="line.79"></a>
88 <span class="sourceLineNo">080</span> */<a name="line.80"></a>
89 <span class="sourceLineNo">081</span> public static Path getBackupTmpDirPathForBackupId(String backupRoot, String backupId) {<a name="line.81"></a>
90 <span class="sourceLineNo">082</span> return new Path(getBackupTmpDirPath(backupRoot), backupId);<a name="line.82"></a>
91 <span class="sourceLineNo">083</span> }<a name="line.83"></a>
92 <span class="sourceLineNo">084</span><a name="line.84"></a>
93 <span class="sourceLineNo">085</span> public static String getTableBackupDataDir(String backupRootDir, String backupId,<a name="line.85"></a>
94 <span class="sourceLineNo">086</span> TableName tableName) {<a name="line.86"></a>
95 <span class="sourceLineNo">087</span> return getTableBackupDir(backupRootDir, backupId, tableName) + Path.SEPARATOR + "data";<a name="line.87"></a>
96 <span class="sourceLineNo">088</span> }<a name="line.88"></a>
97 <span class="sourceLineNo">089</span><a name="line.89"></a>
98 <span class="sourceLineNo">090</span> public static Path getBackupPath(String backupRootDir, String backupId) {<a name="line.90"></a>
99 <span class="sourceLineNo">091</span> return new Path(backupRootDir + Path.SEPARATOR + backupId);<a name="line.91"></a>
100 <span class="sourceLineNo">092</span> }<a name="line.92"></a>
101 <span class="sourceLineNo">093</span><a name="line.93"></a>
102 <span class="sourceLineNo">094</span> /**<a name="line.94"></a>
103 <span class="sourceLineNo">095</span> * Given the backup root dir, backup id and the table name, return the backup image location,<a name="line.95"></a>
104 <span class="sourceLineNo">096</span> * which is also where the backup manifest file is. return value look like:<a name="line.96"></a>
105 <span class="sourceLineNo">097</span> * "hdfs://backup.hbase.org:9000/user/biadmin/backup/backup_1396650096738/default/t1_dn/", where<a name="line.97"></a>
106 <span class="sourceLineNo">098</span> * "hdfs://backup.hbase.org:9000/user/biadmin/backup" is a backup root directory<a name="line.98"></a>
107 <span class="sourceLineNo">099</span> * @param backupRootPath backup root path<a name="line.99"></a>
108 <span class="sourceLineNo">100</span> * @param tableName table name<a name="line.100"></a>
109 <span class="sourceLineNo">101</span> * @param backupId backup Id<a name="line.101"></a>
110 <span class="sourceLineNo">102</span> * @return backupPath for the particular table<a name="line.102"></a>
111 <span class="sourceLineNo">103</span> */<a name="line.103"></a>
112 <span class="sourceLineNo">104</span> public static Path getTableBackupPath(TableName tableName, Path backupRootPath, String backupId) {<a name="line.104"></a>
113 <span class="sourceLineNo">105</span> return new Path(getTableBackupDir(backupRootPath.toString(), backupId, tableName));<a name="line.105"></a>
114 <span class="sourceLineNo">106</span> }<a name="line.106"></a>
115 <span class="sourceLineNo">107</span><a name="line.107"></a>
116 <span class="sourceLineNo">108</span> /**<a name="line.108"></a>
117 <span class="sourceLineNo">109</span> * Given the backup root dir and the backup id, return the log file location for an incremental<a name="line.109"></a>
118 <span class="sourceLineNo">110</span> * backup.<a name="line.110"></a>
119 <span class="sourceLineNo">111</span> * @param backupRootDir backup root directory<a name="line.111"></a>
120 <span class="sourceLineNo">112</span> * @param backupId backup id<a name="line.112"></a>
121 <span class="sourceLineNo">113</span> * @return logBackupDir: ".../user/biadmin/backup/WALs/backup_1396650096738"<a name="line.113"></a>
122 <span class="sourceLineNo">114</span> */<a name="line.114"></a>
123 <span class="sourceLineNo">115</span> public static String getLogBackupDir(String backupRootDir, String backupId) {<a name="line.115"></a>
124 <span class="sourceLineNo">116</span> return backupRootDir + Path.SEPARATOR + backupId + Path.SEPARATOR<a name="line.116"></a>
125 <span class="sourceLineNo">117</span> + HConstants.HREGION_LOGDIR_NAME;<a name="line.117"></a>
126 <span class="sourceLineNo">118</span> }<a name="line.118"></a>
127 <span class="sourceLineNo">119</span><a name="line.119"></a>
128 <span class="sourceLineNo">120</span> public static Path getLogBackupPath(String backupRootDir, String backupId) {<a name="line.120"></a>
129 <span class="sourceLineNo">121</span> return new Path(getLogBackupDir(backupRootDir, backupId));<a name="line.121"></a>
130 <span class="sourceLineNo">122</span> }<a name="line.122"></a>
131 <span class="sourceLineNo">123</span><a name="line.123"></a>
132 <span class="sourceLineNo">124</span> // TODO we do not keep WAL files anymore<a name="line.124"></a>
133 <span class="sourceLineNo">125</span> // Move manifest file to other place<a name="line.125"></a>
134 <span class="sourceLineNo">126</span> private static Path getManifestPath(Configuration conf, Path backupRootPath, String backupId)<a name="line.126"></a>
135 <span class="sourceLineNo">127</span> throws IOException {<a name="line.127"></a>
136 <span class="sourceLineNo">128</span> FileSystem fs = backupRootPath.getFileSystem(conf);<a name="line.128"></a>
137 <span class="sourceLineNo">129</span> Path manifestPath =<a name="line.129"></a>
138 <span class="sourceLineNo">130</span> new Path(getBackupPath(backupRootPath.toString(), backupId) + Path.SEPARATOR<a name="line.130"></a>
139 <span class="sourceLineNo">131</span> + BackupManifest.MANIFEST_FILE_NAME);<a name="line.131"></a>
140 <span class="sourceLineNo">132</span> if (!fs.exists(manifestPath)) {<a name="line.132"></a>
141 <span class="sourceLineNo">133</span> String errorMsg =<a name="line.133"></a>
142 <span class="sourceLineNo">134</span> "Could not find backup manifest " + BackupManifest.MANIFEST_FILE_NAME + " for "<a name="line.134"></a>
143 <span class="sourceLineNo">135</span> + backupId + ". File " + manifestPath + " does not exists. Did " + backupId<a name="line.135"></a>
144 <span class="sourceLineNo">136</span> + " correspond to previously taken backup ?";<a name="line.136"></a>
145 <span class="sourceLineNo">137</span> throw new IOException(errorMsg);<a name="line.137"></a>
146 <span class="sourceLineNo">138</span> }<a name="line.138"></a>
147 <span class="sourceLineNo">139</span> return manifestPath;<a name="line.139"></a>
148 <span class="sourceLineNo">140</span> }<a name="line.140"></a>
149 <span class="sourceLineNo">141</span><a name="line.141"></a>
150 <span class="sourceLineNo">142</span> public static BackupManifest<a name="line.142"></a>
151 <span class="sourceLineNo">143</span> getManifest(Configuration conf, Path backupRootPath, String backupId) throws IOException {<a name="line.143"></a>
152 <span class="sourceLineNo">144</span> BackupManifest manifest =<a name="line.144"></a>
153 <span class="sourceLineNo">145</span> new BackupManifest(conf, getManifestPath(conf, backupRootPath, backupId));<a name="line.145"></a>
154 <span class="sourceLineNo">146</span> return manifest;<a name="line.146"></a>
155 <span class="sourceLineNo">147</span> }<a name="line.147"></a>
156 <span class="sourceLineNo">148</span><a name="line.148"></a>
157 <span class="sourceLineNo">149</span> /**<a name="line.149"></a>
158 <span class="sourceLineNo">150</span> * Check whether the backup image path and there is manifest file in the path.<a name="line.150"></a>
159 <span class="sourceLineNo">151</span> * @param backupManifestMap If all the manifests are found, then they are put into this map<a name="line.151"></a>
160 <span class="sourceLineNo">152</span> * @param tableArray the tables involved<a name="line.152"></a>
161 <span class="sourceLineNo">153</span> * @throws IOException exception<a name="line.153"></a>
162 <span class="sourceLineNo">154</span> */<a name="line.154"></a>
163 <span class="sourceLineNo">155</span> public static void checkImageManifestExist(HashMap&lt;TableName, BackupManifest&gt; backupManifestMap,<a name="line.155"></a>
164 <span class="sourceLineNo">156</span> TableName[] tableArray, Configuration conf, Path backupRootPath, String backupId)<a name="line.156"></a>
165 <span class="sourceLineNo">157</span> throws IOException {<a name="line.157"></a>
166 <span class="sourceLineNo">158</span> for (TableName tableName : tableArray) {<a name="line.158"></a>
167 <span class="sourceLineNo">159</span> BackupManifest manifest = getManifest(conf, backupRootPath, backupId);<a name="line.159"></a>
168 <span class="sourceLineNo">160</span> backupManifestMap.put(tableName, manifest);<a name="line.160"></a>
169 <span class="sourceLineNo">161</span> }<a name="line.161"></a>
170 <span class="sourceLineNo">162</span> }<a name="line.162"></a>
171 <span class="sourceLineNo">163</span>}<a name="line.163"></a>
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232 </pre>
233 </div>
234 </body>
235 </html>