http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html ---------------------------------------------------------------------- diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html index 7d49582..01861a7 100644 --- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html +++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html @@ -980,175 +980,177 @@ <span class="sourceLineNo">972</span> FileSystem outputFs = FileSystem.get(outputRoot.toUri(), destConf);<a name="line.972"></a> <span class="sourceLineNo">973</span> LOG.debug("outputFs=" + outputFs.getUri().toString() + " outputRoot=" + outputRoot.toString());<a name="line.973"></a> <span class="sourceLineNo">974</span><a name="line.974"></a> -<span class="sourceLineNo">975</span> boolean skipTmp = conf.getBoolean(CONF_SKIP_TMP, false);<a name="line.975"></a> -<span class="sourceLineNo">976</span><a name="line.976"></a> -<span class="sourceLineNo">977</span> Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a> -<span class="sourceLineNo">978</span> Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a> -<span class="sourceLineNo">979</span> Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a> -<span class="sourceLineNo">980</span> Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a> -<span class="sourceLineNo">981</span><a name="line.981"></a> -<span class="sourceLineNo">982</span> // Find the necessary directory which need to change owner and group<a name="line.982"></a> -<span class="sourceLineNo">983</span> Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a> -<span class="sourceLineNo">984</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a> -<span class="sourceLineNo">985</span> if (skipTmp) {<a name="line.985"></a> -<span class="sourceLineNo">986</span> needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a> -<span class="sourceLineNo">987</span> } else {<a name="line.987"></a> -<span class="sourceLineNo">988</span> needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a> -<span class="sourceLineNo">989</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a> -<span class="sourceLineNo">990</span> needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a> -<span class="sourceLineNo">991</span> }<a name="line.991"></a> -<span class="sourceLineNo">992</span> }<a name="line.992"></a> -<span class="sourceLineNo">993</span> }<a name="line.993"></a> -<span class="sourceLineNo">994</span><a name="line.994"></a> -<span class="sourceLineNo">995</span> // Check if the snapshot already exists<a name="line.995"></a> -<span class="sourceLineNo">996</span> if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a> -<span class="sourceLineNo">997</span> if (overwrite) {<a name="line.997"></a> -<span class="sourceLineNo">998</span> if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a> -<span class="sourceLineNo">999</span> System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a> -<span class="sourceLineNo">1000</span> return 1;<a name="line.1000"></a> -<span class="sourceLineNo">1001</span> }<a name="line.1001"></a> -<span class="sourceLineNo">1002</span> } else {<a name="line.1002"></a> -<span class="sourceLineNo">1003</span> System.err.println("The snapshot '" + targetName +<a name="line.1003"></a> -<span class="sourceLineNo">1004</span> "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a> -<span class="sourceLineNo">1005</span> return 1;<a name="line.1005"></a> -<span class="sourceLineNo">1006</span> }<a name="line.1006"></a> -<span class="sourceLineNo">1007</span> }<a name="line.1007"></a> -<span class="sourceLineNo">1008</span><a name="line.1008"></a> -<span class="sourceLineNo">1009</span> if (!skipTmp) {<a name="line.1009"></a> -<span class="sourceLineNo">1010</span> // Check if the snapshot already in-progress<a name="line.1010"></a> -<span class="sourceLineNo">1011</span> if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a> -<span class="sourceLineNo">1012</span> if (overwrite) {<a name="line.1012"></a> -<span class="sourceLineNo">1013</span> if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a> -<span class="sourceLineNo">1014</span> System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a> -<span class="sourceLineNo">1015</span> return 1;<a name="line.1015"></a> -<span class="sourceLineNo">1016</span> }<a name="line.1016"></a> -<span class="sourceLineNo">1017</span> } else {<a name="line.1017"></a> -<span class="sourceLineNo">1018</span> System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a> -<span class="sourceLineNo">1019</span> System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a> -<span class="sourceLineNo">1020</span> System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a> -<span class="sourceLineNo">1021</span> return 1;<a name="line.1021"></a> -<span class="sourceLineNo">1022</span> }<a name="line.1022"></a> -<span class="sourceLineNo">1023</span> }<a name="line.1023"></a> -<span class="sourceLineNo">1024</span> }<a name="line.1024"></a> -<span class="sourceLineNo">1025</span><a name="line.1025"></a> -<span class="sourceLineNo">1026</span> // Step 1 - Copy fs1:/.snapshot/<snapshot> to fs2:/.snapshot/.tmp/<snapshot><a name="line.1026"></a> -<span class="sourceLineNo">1027</span> // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a> -<span class="sourceLineNo">1028</span> // will remove them because they are unreferenced.<a name="line.1028"></a> -<span class="sourceLineNo">1029</span> List<Path> travesedPaths = new ArrayList<>();<a name="line.1029"></a> -<span class="sourceLineNo">1030</span> boolean copySucceeded = false;<a name="line.1030"></a> -<span class="sourceLineNo">1031</span> try {<a name="line.1031"></a> -<span class="sourceLineNo">1032</span> LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a> -<span class="sourceLineNo">1033</span> travesedPaths =<a name="line.1033"></a> -<span class="sourceLineNo">1034</span> FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a> -<span class="sourceLineNo">1035</span> conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a> -<span class="sourceLineNo">1036</span> copySucceeded = true;<a name="line.1036"></a> -<span class="sourceLineNo">1037</span> } catch (IOException e) {<a name="line.1037"></a> -<span class="sourceLineNo">1038</span> throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a> -<span class="sourceLineNo">1039</span> snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a> -<span class="sourceLineNo">1040</span> } finally {<a name="line.1040"></a> -<span class="sourceLineNo">1041</span> if (copySucceeded) {<a name="line.1041"></a> -<span class="sourceLineNo">1042</span> if (filesUser != null || filesGroup != null) {<a name="line.1042"></a> -<span class="sourceLineNo">1043</span> LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a> -<span class="sourceLineNo">1044</span> + filesUser)<a name="line.1044"></a> -<span class="sourceLineNo">1045</span> + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a> -<span class="sourceLineNo">1046</span> + filesGroup));<a name="line.1046"></a> -<span class="sourceLineNo">1047</span> setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a> -<span class="sourceLineNo">1048</span> }<a name="line.1048"></a> -<span class="sourceLineNo">1049</span> if (filesMode > 0) {<a name="line.1049"></a> -<span class="sourceLineNo">1050</span> LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a> -<span class="sourceLineNo">1051</span> setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a> -<span class="sourceLineNo">1052</span> }<a name="line.1052"></a> -<span class="sourceLineNo">1053</span> }<a name="line.1053"></a> -<span class="sourceLineNo">1054</span> }<a name="line.1054"></a> -<span class="sourceLineNo">1055</span><a name="line.1055"></a> -<span class="sourceLineNo">1056</span> // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a> -<span class="sourceLineNo">1057</span> if (!targetName.equals(snapshotName)) {<a name="line.1057"></a> -<span class="sourceLineNo">1058</span> SnapshotDescription snapshotDesc =<a name="line.1058"></a> -<span class="sourceLineNo">1059</span> SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a> -<span class="sourceLineNo">1060</span> .toBuilder()<a name="line.1060"></a> -<span class="sourceLineNo">1061</span> .setName(targetName)<a name="line.1061"></a> -<span class="sourceLineNo">1062</span> .build();<a name="line.1062"></a> -<span class="sourceLineNo">1063</span> SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a> -<span class="sourceLineNo">1064</span> if (filesUser != null || filesGroup != null) {<a name="line.1064"></a> -<span class="sourceLineNo">1065</span> outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a> -<span class="sourceLineNo">1066</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a> -<span class="sourceLineNo">1067</span> }<a name="line.1067"></a> -<span class="sourceLineNo">1068</span> if (filesMode > 0) {<a name="line.1068"></a> -<span class="sourceLineNo">1069</span> outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a> -<span class="sourceLineNo">1070</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a> -<span class="sourceLineNo">1071</span> }<a name="line.1071"></a> -<span class="sourceLineNo">1072</span> }<a name="line.1072"></a> -<span class="sourceLineNo">1073</span><a name="line.1073"></a> -<span class="sourceLineNo">1074</span> // Step 2 - Start MR Job to copy files<a name="line.1074"></a> -<span class="sourceLineNo">1075</span> // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a> -<span class="sourceLineNo">1076</span> // by the HFileArchiver, since they have no references.<a name="line.1076"></a> -<span class="sourceLineNo">1077</span> try {<a name="line.1077"></a> -<span class="sourceLineNo">1078</span> runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a> -<span class="sourceLineNo">1079</span> filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a> -<span class="sourceLineNo">1080</span><a name="line.1080"></a> -<span class="sourceLineNo">1081</span> LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a> -<span class="sourceLineNo">1082</span> if (!skipTmp) {<a name="line.1082"></a> -<span class="sourceLineNo">1083</span> // Step 3 - Rename fs2:/.snapshot/.tmp/<snapshot> fs2:/.snapshot/<snapshot><a name="line.1083"></a> -<span class="sourceLineNo">1084</span> if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a> -<span class="sourceLineNo">1085</span> throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a> -<span class="sourceLineNo">1086</span> snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a> -<span class="sourceLineNo">1087</span> }<a name="line.1087"></a> -<span class="sourceLineNo">1088</span> }<a name="line.1088"></a> -<span class="sourceLineNo">1089</span><a name="line.1089"></a> -<span class="sourceLineNo">1090</span> // Step 4 - Verify snapshot integrity<a name="line.1090"></a> -<span class="sourceLineNo">1091</span> if (verifyTarget) {<a name="line.1091"></a> -<span class="sourceLineNo">1092</span> LOG.info("Verify snapshot integrity");<a name="line.1092"></a> -<span class="sourceLineNo">1093</span> verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a> -<span class="sourceLineNo">1094</span> }<a name="line.1094"></a> -<span class="sourceLineNo">1095</span><a name="line.1095"></a> -<span class="sourceLineNo">1096</span> LOG.info("Export Completed: " + targetName);<a name="line.1096"></a> -<span class="sourceLineNo">1097</span> return 0;<a name="line.1097"></a> -<span class="sourceLineNo">1098</span> } catch (Exception e) {<a name="line.1098"></a> -<span class="sourceLineNo">1099</span> LOG.error("Snapshot export failed", e);<a name="line.1099"></a> -<span class="sourceLineNo">1100</span> if (!skipTmp) {<a name="line.1100"></a> -<span class="sourceLineNo">1101</span> outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a> -<span class="sourceLineNo">1102</span> }<a name="line.1102"></a> -<span class="sourceLineNo">1103</span> outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a> -<span class="sourceLineNo">1104</span> return 1;<a name="line.1104"></a> -<span class="sourceLineNo">1105</span> } finally {<a name="line.1105"></a> -<span class="sourceLineNo">1106</span> IOUtils.closeStream(inputFs);<a name="line.1106"></a> -<span class="sourceLineNo">1107</span> IOUtils.closeStream(outputFs);<a name="line.1107"></a> -<span class="sourceLineNo">1108</span> }<a name="line.1108"></a> -<span class="sourceLineNo">1109</span> }<a name="line.1109"></a> -<span class="sourceLineNo">1110</span><a name="line.1110"></a> -<span class="sourceLineNo">1111</span> @Override<a name="line.1111"></a> -<span class="sourceLineNo">1112</span> protected void printUsage() {<a name="line.1112"></a> -<span class="sourceLineNo">1113</span> super.printUsage();<a name="line.1113"></a> -<span class="sourceLineNo">1114</span> System.out.println("\n"<a name="line.1114"></a> -<span class="sourceLineNo">1115</span> + "Examples:\n"<a name="line.1115"></a> -<span class="sourceLineNo">1116</span> + " hbase snapshot export \\\n"<a name="line.1116"></a> -<span class="sourceLineNo">1117</span> + " --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a> -<span class="sourceLineNo">1118</span> + " --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a> -<span class="sourceLineNo">1119</span> + "\n"<a name="line.1119"></a> -<span class="sourceLineNo">1120</span> + " hbase snapshot export \\\n"<a name="line.1120"></a> -<span class="sourceLineNo">1121</span> + " --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a> -<span class="sourceLineNo">1122</span> + " --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a> -<span class="sourceLineNo">1123</span> }<a name="line.1123"></a> -<span class="sourceLineNo">1124</span><a name="line.1124"></a> -<span class="sourceLineNo">1125</span> @Override protected void addOptions() {<a name="line.1125"></a> -<span class="sourceLineNo">1126</span> addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a> -<span class="sourceLineNo">1127</span> addOption(Options.COPY_TO);<a name="line.1127"></a> -<span class="sourceLineNo">1128</span> addOption(Options.COPY_FROM);<a name="line.1128"></a> -<span class="sourceLineNo">1129</span> addOption(Options.TARGET_NAME);<a name="line.1129"></a> -<span class="sourceLineNo">1130</span> addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a> -<span class="sourceLineNo">1131</span> addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a> -<span class="sourceLineNo">1132</span> addOption(Options.OVERWRITE);<a name="line.1132"></a> -<span class="sourceLineNo">1133</span> addOption(Options.CHUSER);<a name="line.1133"></a> -<span class="sourceLineNo">1134</span> addOption(Options.CHGROUP);<a name="line.1134"></a> -<span class="sourceLineNo">1135</span> addOption(Options.CHMOD);<a name="line.1135"></a> -<span class="sourceLineNo">1136</span> addOption(Options.MAPPERS);<a name="line.1136"></a> -<span class="sourceLineNo">1137</span> addOption(Options.BANDWIDTH);<a name="line.1137"></a> -<span class="sourceLineNo">1138</span> }<a name="line.1138"></a> -<span class="sourceLineNo">1139</span><a name="line.1139"></a> -<span class="sourceLineNo">1140</span> public static void main(String[] args) {<a name="line.1140"></a> -<span class="sourceLineNo">1141</span> new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a> -<span class="sourceLineNo">1142</span> }<a name="line.1142"></a> -<span class="sourceLineNo">1143</span>}<a name="line.1143"></a> +<span class="sourceLineNo">975</span> boolean skipTmp = conf.getBoolean(CONF_SKIP_TMP, false) ||<a name="line.975"></a> +<span class="sourceLineNo">976</span> conf.get(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR) != null;<a name="line.976"></a> +<span class="sourceLineNo">977</span><a name="line.977"></a> +<span class="sourceLineNo">978</span> Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.978"></a> +<span class="sourceLineNo">979</span> Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot,<a name="line.979"></a> +<span class="sourceLineNo">980</span> destConf);<a name="line.980"></a> +<span class="sourceLineNo">981</span> Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.981"></a> +<span class="sourceLineNo">982</span> Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.982"></a> +<span class="sourceLineNo">983</span><a name="line.983"></a> +<span class="sourceLineNo">984</span> // Find the necessary directory which need to change owner and group<a name="line.984"></a> +<span class="sourceLineNo">985</span> Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.985"></a> +<span class="sourceLineNo">986</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.986"></a> +<span class="sourceLineNo">987</span> if (skipTmp) {<a name="line.987"></a> +<span class="sourceLineNo">988</span> needSetOwnerDir = outputSnapshotDir;<a name="line.988"></a> +<span class="sourceLineNo">989</span> } else {<a name="line.989"></a> +<span class="sourceLineNo">990</span> needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot, destConf);<a name="line.990"></a> +<span class="sourceLineNo">991</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.991"></a> +<span class="sourceLineNo">992</span> needSetOwnerDir = snapshotTmpDir;<a name="line.992"></a> +<span class="sourceLineNo">993</span> }<a name="line.993"></a> +<span class="sourceLineNo">994</span> }<a name="line.994"></a> +<span class="sourceLineNo">995</span> }<a name="line.995"></a> +<span class="sourceLineNo">996</span><a name="line.996"></a> +<span class="sourceLineNo">997</span> // Check if the snapshot already exists<a name="line.997"></a> +<span class="sourceLineNo">998</span> if (outputFs.exists(outputSnapshotDir)) {<a name="line.998"></a> +<span class="sourceLineNo">999</span> if (overwrite) {<a name="line.999"></a> +<span class="sourceLineNo">1000</span> if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.1000"></a> +<span class="sourceLineNo">1001</span> System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.1001"></a> +<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a> +<span class="sourceLineNo">1003</span> }<a name="line.1003"></a> +<span class="sourceLineNo">1004</span> } else {<a name="line.1004"></a> +<span class="sourceLineNo">1005</span> System.err.println("The snapshot '" + targetName +<a name="line.1005"></a> +<span class="sourceLineNo">1006</span> "' already exists in the destination: " + outputSnapshotDir);<a name="line.1006"></a> +<span class="sourceLineNo">1007</span> return 1;<a name="line.1007"></a> +<span class="sourceLineNo">1008</span> }<a name="line.1008"></a> +<span class="sourceLineNo">1009</span> }<a name="line.1009"></a> +<span class="sourceLineNo">1010</span><a name="line.1010"></a> +<span class="sourceLineNo">1011</span> if (!skipTmp) {<a name="line.1011"></a> +<span class="sourceLineNo">1012</span> // Check if the snapshot already in-progress<a name="line.1012"></a> +<span class="sourceLineNo">1013</span> if (outputFs.exists(snapshotTmpDir)) {<a name="line.1013"></a> +<span class="sourceLineNo">1014</span> if (overwrite) {<a name="line.1014"></a> +<span class="sourceLineNo">1015</span> if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1015"></a> +<span class="sourceLineNo">1016</span> System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1016"></a> +<span class="sourceLineNo">1017</span> return 1;<a name="line.1017"></a> +<span class="sourceLineNo">1018</span> }<a name="line.1018"></a> +<span class="sourceLineNo">1019</span> } else {<a name="line.1019"></a> +<span class="sourceLineNo">1020</span> System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1020"></a> +<span class="sourceLineNo">1021</span> System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1021"></a> +<span class="sourceLineNo">1022</span> System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1022"></a> +<span class="sourceLineNo">1023</span> return 1;<a name="line.1023"></a> +<span class="sourceLineNo">1024</span> }<a name="line.1024"></a> +<span class="sourceLineNo">1025</span> }<a name="line.1025"></a> +<span class="sourceLineNo">1026</span> }<a name="line.1026"></a> +<span class="sourceLineNo">1027</span><a name="line.1027"></a> +<span class="sourceLineNo">1028</span> // Step 1 - Copy fs1:/.snapshot/<snapshot> to fs2:/.snapshot/.tmp/<snapshot><a name="line.1028"></a> +<span class="sourceLineNo">1029</span> // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1029"></a> +<span class="sourceLineNo">1030</span> // will remove them because they are unreferenced.<a name="line.1030"></a> +<span class="sourceLineNo">1031</span> List<Path> travesedPaths = new ArrayList<>();<a name="line.1031"></a> +<span class="sourceLineNo">1032</span> boolean copySucceeded = false;<a name="line.1032"></a> +<span class="sourceLineNo">1033</span> try {<a name="line.1033"></a> +<span class="sourceLineNo">1034</span> LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1034"></a> +<span class="sourceLineNo">1035</span> travesedPaths =<a name="line.1035"></a> +<span class="sourceLineNo">1036</span> FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1036"></a> +<span class="sourceLineNo">1037</span> conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1037"></a> +<span class="sourceLineNo">1038</span> copySucceeded = true;<a name="line.1038"></a> +<span class="sourceLineNo">1039</span> } catch (IOException e) {<a name="line.1039"></a> +<span class="sourceLineNo">1040</span> throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1040"></a> +<span class="sourceLineNo">1041</span> snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1041"></a> +<span class="sourceLineNo">1042</span> } finally {<a name="line.1042"></a> +<span class="sourceLineNo">1043</span> if (copySucceeded) {<a name="line.1043"></a> +<span class="sourceLineNo">1044</span> if (filesUser != null || filesGroup != null) {<a name="line.1044"></a> +<span class="sourceLineNo">1045</span> LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1045"></a> +<span class="sourceLineNo">1046</span> + filesUser)<a name="line.1046"></a> +<span class="sourceLineNo">1047</span> + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1047"></a> +<span class="sourceLineNo">1048</span> + filesGroup));<a name="line.1048"></a> +<span class="sourceLineNo">1049</span> setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1049"></a> +<span class="sourceLineNo">1050</span> }<a name="line.1050"></a> +<span class="sourceLineNo">1051</span> if (filesMode > 0) {<a name="line.1051"></a> +<span class="sourceLineNo">1052</span> LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1052"></a> +<span class="sourceLineNo">1053</span> setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1053"></a> +<span class="sourceLineNo">1054</span> }<a name="line.1054"></a> +<span class="sourceLineNo">1055</span> }<a name="line.1055"></a> +<span class="sourceLineNo">1056</span> }<a name="line.1056"></a> +<span class="sourceLineNo">1057</span><a name="line.1057"></a> +<span class="sourceLineNo">1058</span> // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1058"></a> +<span class="sourceLineNo">1059</span> if (!targetName.equals(snapshotName)) {<a name="line.1059"></a> +<span class="sourceLineNo">1060</span> SnapshotDescription snapshotDesc =<a name="line.1060"></a> +<span class="sourceLineNo">1061</span> SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1061"></a> +<span class="sourceLineNo">1062</span> .toBuilder()<a name="line.1062"></a> +<span class="sourceLineNo">1063</span> .setName(targetName)<a name="line.1063"></a> +<span class="sourceLineNo">1064</span> .build();<a name="line.1064"></a> +<span class="sourceLineNo">1065</span> SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1065"></a> +<span class="sourceLineNo">1066</span> if (filesUser != null || filesGroup != null) {<a name="line.1066"></a> +<span class="sourceLineNo">1067</span> outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1067"></a> +<span class="sourceLineNo">1068</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1068"></a> +<span class="sourceLineNo">1069</span> }<a name="line.1069"></a> +<span class="sourceLineNo">1070</span> if (filesMode > 0) {<a name="line.1070"></a> +<span class="sourceLineNo">1071</span> outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1071"></a> +<span class="sourceLineNo">1072</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1072"></a> +<span class="sourceLineNo">1073</span> }<a name="line.1073"></a> +<span class="sourceLineNo">1074</span> }<a name="line.1074"></a> +<span class="sourceLineNo">1075</span><a name="line.1075"></a> +<span class="sourceLineNo">1076</span> // Step 2 - Start MR Job to copy files<a name="line.1076"></a> +<span class="sourceLineNo">1077</span> // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1077"></a> +<span class="sourceLineNo">1078</span> // by the HFileArchiver, since they have no references.<a name="line.1078"></a> +<span class="sourceLineNo">1079</span> try {<a name="line.1079"></a> +<span class="sourceLineNo">1080</span> runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1080"></a> +<span class="sourceLineNo">1081</span> filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1081"></a> +<span class="sourceLineNo">1082</span><a name="line.1082"></a> +<span class="sourceLineNo">1083</span> LOG.info("Finalize the Snapshot Export");<a name="line.1083"></a> +<span class="sourceLineNo">1084</span> if (!skipTmp) {<a name="line.1084"></a> +<span class="sourceLineNo">1085</span> // Step 3 - Rename fs2:/.snapshot/.tmp/<snapshot> fs2:/.snapshot/<snapshot><a name="line.1085"></a> +<span class="sourceLineNo">1086</span> if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1086"></a> +<span class="sourceLineNo">1087</span> throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1087"></a> +<span class="sourceLineNo">1088</span> snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1088"></a> +<span class="sourceLineNo">1089</span> }<a name="line.1089"></a> +<span class="sourceLineNo">1090</span> }<a name="line.1090"></a> +<span class="sourceLineNo">1091</span><a name="line.1091"></a> +<span class="sourceLineNo">1092</span> // Step 4 - Verify snapshot integrity<a name="line.1092"></a> +<span class="sourceLineNo">1093</span> if (verifyTarget) {<a name="line.1093"></a> +<span class="sourceLineNo">1094</span> LOG.info("Verify snapshot integrity");<a name="line.1094"></a> +<span class="sourceLineNo">1095</span> verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1095"></a> +<span class="sourceLineNo">1096</span> }<a name="line.1096"></a> +<span class="sourceLineNo">1097</span><a name="line.1097"></a> +<span class="sourceLineNo">1098</span> LOG.info("Export Completed: " + targetName);<a name="line.1098"></a> +<span class="sourceLineNo">1099</span> return 0;<a name="line.1099"></a> +<span class="sourceLineNo">1100</span> } catch (Exception e) {<a name="line.1100"></a> +<span class="sourceLineNo">1101</span> LOG.error("Snapshot export failed", e);<a name="line.1101"></a> +<span class="sourceLineNo">1102</span> if (!skipTmp) {<a name="line.1102"></a> +<span class="sourceLineNo">1103</span> outputFs.delete(snapshotTmpDir, true);<a name="line.1103"></a> +<span class="sourceLineNo">1104</span> }<a name="line.1104"></a> +<span class="sourceLineNo">1105</span> outputFs.delete(outputSnapshotDir, true);<a name="line.1105"></a> +<span class="sourceLineNo">1106</span> return 1;<a name="line.1106"></a> +<span class="sourceLineNo">1107</span> } finally {<a name="line.1107"></a> +<span class="sourceLineNo">1108</span> IOUtils.closeStream(inputFs);<a name="line.1108"></a> +<span class="sourceLineNo">1109</span> IOUtils.closeStream(outputFs);<a name="line.1109"></a> +<span class="sourceLineNo">1110</span> }<a name="line.1110"></a> +<span class="sourceLineNo">1111</span> }<a name="line.1111"></a> +<span class="sourceLineNo">1112</span><a name="line.1112"></a> +<span class="sourceLineNo">1113</span> @Override<a name="line.1113"></a> +<span class="sourceLineNo">1114</span> protected void printUsage() {<a name="line.1114"></a> +<span class="sourceLineNo">1115</span> super.printUsage();<a name="line.1115"></a> +<span class="sourceLineNo">1116</span> System.out.println("\n"<a name="line.1116"></a> +<span class="sourceLineNo">1117</span> + "Examples:\n"<a name="line.1117"></a> +<span class="sourceLineNo">1118</span> + " hbase snapshot export \\\n"<a name="line.1118"></a> +<span class="sourceLineNo">1119</span> + " --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1119"></a> +<span class="sourceLineNo">1120</span> + " --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1120"></a> +<span class="sourceLineNo">1121</span> + "\n"<a name="line.1121"></a> +<span class="sourceLineNo">1122</span> + " hbase snapshot export \\\n"<a name="line.1122"></a> +<span class="sourceLineNo">1123</span> + " --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1123"></a> +<span class="sourceLineNo">1124</span> + " --copy-to hdfs://srv1:50070/hbase");<a name="line.1124"></a> +<span class="sourceLineNo">1125</span> }<a name="line.1125"></a> +<span class="sourceLineNo">1126</span><a name="line.1126"></a> +<span class="sourceLineNo">1127</span> @Override protected void addOptions() {<a name="line.1127"></a> +<span class="sourceLineNo">1128</span> addRequiredOption(Options.SNAPSHOT);<a name="line.1128"></a> +<span class="sourceLineNo">1129</span> addOption(Options.COPY_TO);<a name="line.1129"></a> +<span class="sourceLineNo">1130</span> addOption(Options.COPY_FROM);<a name="line.1130"></a> +<span class="sourceLineNo">1131</span> addOption(Options.TARGET_NAME);<a name="line.1131"></a> +<span class="sourceLineNo">1132</span> addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1132"></a> +<span class="sourceLineNo">1133</span> addOption(Options.NO_TARGET_VERIFY);<a name="line.1133"></a> +<span class="sourceLineNo">1134</span> addOption(Options.OVERWRITE);<a name="line.1134"></a> +<span class="sourceLineNo">1135</span> addOption(Options.CHUSER);<a name="line.1135"></a> +<span class="sourceLineNo">1136</span> addOption(Options.CHGROUP);<a name="line.1136"></a> +<span class="sourceLineNo">1137</span> addOption(Options.CHMOD);<a name="line.1137"></a> +<span class="sourceLineNo">1138</span> addOption(Options.MAPPERS);<a name="line.1138"></a> +<span class="sourceLineNo">1139</span> addOption(Options.BANDWIDTH);<a name="line.1139"></a> +<span class="sourceLineNo">1140</span> }<a name="line.1140"></a> +<span class="sourceLineNo">1141</span><a name="line.1141"></a> +<span class="sourceLineNo">1142</span> public static void main(String[] args) {<a name="line.1142"></a> +<span class="sourceLineNo">1143</span> new ExportSnapshot().doStaticMain(args);<a name="line.1143"></a> +<span class="sourceLineNo">1144</span> }<a name="line.1144"></a> +<span class="sourceLineNo">1145</span>}<a name="line.1145"></a>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html ---------------------------------------------------------------------- diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html index 7d49582..01861a7 100644 --- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html +++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html @@ -980,175 +980,177 @@ <span class="sourceLineNo">972</span> FileSystem outputFs = FileSystem.get(outputRoot.toUri(), destConf);<a name="line.972"></a> <span class="sourceLineNo">973</span> LOG.debug("outputFs=" + outputFs.getUri().toString() + " outputRoot=" + outputRoot.toString());<a name="line.973"></a> <span class="sourceLineNo">974</span><a name="line.974"></a> -<span class="sourceLineNo">975</span> boolean skipTmp = conf.getBoolean(CONF_SKIP_TMP, false);<a name="line.975"></a> -<span class="sourceLineNo">976</span><a name="line.976"></a> -<span class="sourceLineNo">977</span> Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a> -<span class="sourceLineNo">978</span> Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a> -<span class="sourceLineNo">979</span> Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a> -<span class="sourceLineNo">980</span> Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a> -<span class="sourceLineNo">981</span><a name="line.981"></a> -<span class="sourceLineNo">982</span> // Find the necessary directory which need to change owner and group<a name="line.982"></a> -<span class="sourceLineNo">983</span> Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a> -<span class="sourceLineNo">984</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a> -<span class="sourceLineNo">985</span> if (skipTmp) {<a name="line.985"></a> -<span class="sourceLineNo">986</span> needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a> -<span class="sourceLineNo">987</span> } else {<a name="line.987"></a> -<span class="sourceLineNo">988</span> needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a> -<span class="sourceLineNo">989</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a> -<span class="sourceLineNo">990</span> needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a> -<span class="sourceLineNo">991</span> }<a name="line.991"></a> -<span class="sourceLineNo">992</span> }<a name="line.992"></a> -<span class="sourceLineNo">993</span> }<a name="line.993"></a> -<span class="sourceLineNo">994</span><a name="line.994"></a> -<span class="sourceLineNo">995</span> // Check if the snapshot already exists<a name="line.995"></a> -<span class="sourceLineNo">996</span> if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a> -<span class="sourceLineNo">997</span> if (overwrite) {<a name="line.997"></a> -<span class="sourceLineNo">998</span> if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a> -<span class="sourceLineNo">999</span> System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a> -<span class="sourceLineNo">1000</span> return 1;<a name="line.1000"></a> -<span class="sourceLineNo">1001</span> }<a name="line.1001"></a> -<span class="sourceLineNo">1002</span> } else {<a name="line.1002"></a> -<span class="sourceLineNo">1003</span> System.err.println("The snapshot '" + targetName +<a name="line.1003"></a> -<span class="sourceLineNo">1004</span> "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a> -<span class="sourceLineNo">1005</span> return 1;<a name="line.1005"></a> -<span class="sourceLineNo">1006</span> }<a name="line.1006"></a> -<span class="sourceLineNo">1007</span> }<a name="line.1007"></a> -<span class="sourceLineNo">1008</span><a name="line.1008"></a> -<span class="sourceLineNo">1009</span> if (!skipTmp) {<a name="line.1009"></a> -<span class="sourceLineNo">1010</span> // Check if the snapshot already in-progress<a name="line.1010"></a> -<span class="sourceLineNo">1011</span> if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a> -<span class="sourceLineNo">1012</span> if (overwrite) {<a name="line.1012"></a> -<span class="sourceLineNo">1013</span> if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a> -<span class="sourceLineNo">1014</span> System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a> -<span class="sourceLineNo">1015</span> return 1;<a name="line.1015"></a> -<span class="sourceLineNo">1016</span> }<a name="line.1016"></a> -<span class="sourceLineNo">1017</span> } else {<a name="line.1017"></a> -<span class="sourceLineNo">1018</span> System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a> -<span class="sourceLineNo">1019</span> System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a> -<span class="sourceLineNo">1020</span> System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a> -<span class="sourceLineNo">1021</span> return 1;<a name="line.1021"></a> -<span class="sourceLineNo">1022</span> }<a name="line.1022"></a> -<span class="sourceLineNo">1023</span> }<a name="line.1023"></a> -<span class="sourceLineNo">1024</span> }<a name="line.1024"></a> -<span class="sourceLineNo">1025</span><a name="line.1025"></a> -<span class="sourceLineNo">1026</span> // Step 1 - Copy fs1:/.snapshot/<snapshot> to fs2:/.snapshot/.tmp/<snapshot><a name="line.1026"></a> -<span class="sourceLineNo">1027</span> // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a> -<span class="sourceLineNo">1028</span> // will remove them because they are unreferenced.<a name="line.1028"></a> -<span class="sourceLineNo">1029</span> List<Path> travesedPaths = new ArrayList<>();<a name="line.1029"></a> -<span class="sourceLineNo">1030</span> boolean copySucceeded = false;<a name="line.1030"></a> -<span class="sourceLineNo">1031</span> try {<a name="line.1031"></a> -<span class="sourceLineNo">1032</span> LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a> -<span class="sourceLineNo">1033</span> travesedPaths =<a name="line.1033"></a> -<span class="sourceLineNo">1034</span> FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a> -<span class="sourceLineNo">1035</span> conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a> -<span class="sourceLineNo">1036</span> copySucceeded = true;<a name="line.1036"></a> -<span class="sourceLineNo">1037</span> } catch (IOException e) {<a name="line.1037"></a> -<span class="sourceLineNo">1038</span> throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a> -<span class="sourceLineNo">1039</span> snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a> -<span class="sourceLineNo">1040</span> } finally {<a name="line.1040"></a> -<span class="sourceLineNo">1041</span> if (copySucceeded) {<a name="line.1041"></a> -<span class="sourceLineNo">1042</span> if (filesUser != null || filesGroup != null) {<a name="line.1042"></a> -<span class="sourceLineNo">1043</span> LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a> -<span class="sourceLineNo">1044</span> + filesUser)<a name="line.1044"></a> -<span class="sourceLineNo">1045</span> + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a> -<span class="sourceLineNo">1046</span> + filesGroup));<a name="line.1046"></a> -<span class="sourceLineNo">1047</span> setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a> -<span class="sourceLineNo">1048</span> }<a name="line.1048"></a> -<span class="sourceLineNo">1049</span> if (filesMode > 0) {<a name="line.1049"></a> -<span class="sourceLineNo">1050</span> LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a> -<span class="sourceLineNo">1051</span> setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a> -<span class="sourceLineNo">1052</span> }<a name="line.1052"></a> -<span class="sourceLineNo">1053</span> }<a name="line.1053"></a> -<span class="sourceLineNo">1054</span> }<a name="line.1054"></a> -<span class="sourceLineNo">1055</span><a name="line.1055"></a> -<span class="sourceLineNo">1056</span> // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a> -<span class="sourceLineNo">1057</span> if (!targetName.equals(snapshotName)) {<a name="line.1057"></a> -<span class="sourceLineNo">1058</span> SnapshotDescription snapshotDesc =<a name="line.1058"></a> -<span class="sourceLineNo">1059</span> SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a> -<span class="sourceLineNo">1060</span> .toBuilder()<a name="line.1060"></a> -<span class="sourceLineNo">1061</span> .setName(targetName)<a name="line.1061"></a> -<span class="sourceLineNo">1062</span> .build();<a name="line.1062"></a> -<span class="sourceLineNo">1063</span> SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a> -<span class="sourceLineNo">1064</span> if (filesUser != null || filesGroup != null) {<a name="line.1064"></a> -<span class="sourceLineNo">1065</span> outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a> -<span class="sourceLineNo">1066</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a> -<span class="sourceLineNo">1067</span> }<a name="line.1067"></a> -<span class="sourceLineNo">1068</span> if (filesMode > 0) {<a name="line.1068"></a> -<span class="sourceLineNo">1069</span> outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a> -<span class="sourceLineNo">1070</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a> -<span class="sourceLineNo">1071</span> }<a name="line.1071"></a> -<span class="sourceLineNo">1072</span> }<a name="line.1072"></a> -<span class="sourceLineNo">1073</span><a name="line.1073"></a> -<span class="sourceLineNo">1074</span> // Step 2 - Start MR Job to copy files<a name="line.1074"></a> -<span class="sourceLineNo">1075</span> // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a> -<span class="sourceLineNo">1076</span> // by the HFileArchiver, since they have no references.<a name="line.1076"></a> -<span class="sourceLineNo">1077</span> try {<a name="line.1077"></a> -<span class="sourceLineNo">1078</span> runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a> -<span class="sourceLineNo">1079</span> filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a> -<span class="sourceLineNo">1080</span><a name="line.1080"></a> -<span class="sourceLineNo">1081</span> LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a> -<span class="sourceLineNo">1082</span> if (!skipTmp) {<a name="line.1082"></a> -<span class="sourceLineNo">1083</span> // Step 3 - Rename fs2:/.snapshot/.tmp/<snapshot> fs2:/.snapshot/<snapshot><a name="line.1083"></a> -<span class="sourceLineNo">1084</span> if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a> -<span class="sourceLineNo">1085</span> throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a> -<span class="sourceLineNo">1086</span> snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a> -<span class="sourceLineNo">1087</span> }<a name="line.1087"></a> -<span class="sourceLineNo">1088</span> }<a name="line.1088"></a> -<span class="sourceLineNo">1089</span><a name="line.1089"></a> -<span class="sourceLineNo">1090</span> // Step 4 - Verify snapshot integrity<a name="line.1090"></a> -<span class="sourceLineNo">1091</span> if (verifyTarget) {<a name="line.1091"></a> -<span class="sourceLineNo">1092</span> LOG.info("Verify snapshot integrity");<a name="line.1092"></a> -<span class="sourceLineNo">1093</span> verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a> -<span class="sourceLineNo">1094</span> }<a name="line.1094"></a> -<span class="sourceLineNo">1095</span><a name="line.1095"></a> -<span class="sourceLineNo">1096</span> LOG.info("Export Completed: " + targetName);<a name="line.1096"></a> -<span class="sourceLineNo">1097</span> return 0;<a name="line.1097"></a> -<span class="sourceLineNo">1098</span> } catch (Exception e) {<a name="line.1098"></a> -<span class="sourceLineNo">1099</span> LOG.error("Snapshot export failed", e);<a name="line.1099"></a> -<span class="sourceLineNo">1100</span> if (!skipTmp) {<a name="line.1100"></a> -<span class="sourceLineNo">1101</span> outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a> -<span class="sourceLineNo">1102</span> }<a name="line.1102"></a> -<span class="sourceLineNo">1103</span> outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a> -<span class="sourceLineNo">1104</span> return 1;<a name="line.1104"></a> -<span class="sourceLineNo">1105</span> } finally {<a name="line.1105"></a> -<span class="sourceLineNo">1106</span> IOUtils.closeStream(inputFs);<a name="line.1106"></a> -<span class="sourceLineNo">1107</span> IOUtils.closeStream(outputFs);<a name="line.1107"></a> -<span class="sourceLineNo">1108</span> }<a name="line.1108"></a> -<span class="sourceLineNo">1109</span> }<a name="line.1109"></a> -<span class="sourceLineNo">1110</span><a name="line.1110"></a> -<span class="sourceLineNo">1111</span> @Override<a name="line.1111"></a> -<span class="sourceLineNo">1112</span> protected void printUsage() {<a name="line.1112"></a> -<span class="sourceLineNo">1113</span> super.printUsage();<a name="line.1113"></a> -<span class="sourceLineNo">1114</span> System.out.println("\n"<a name="line.1114"></a> -<span class="sourceLineNo">1115</span> + "Examples:\n"<a name="line.1115"></a> -<span class="sourceLineNo">1116</span> + " hbase snapshot export \\\n"<a name="line.1116"></a> -<span class="sourceLineNo">1117</span> + " --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a> -<span class="sourceLineNo">1118</span> + " --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a> -<span class="sourceLineNo">1119</span> + "\n"<a name="line.1119"></a> -<span class="sourceLineNo">1120</span> + " hbase snapshot export \\\n"<a name="line.1120"></a> -<span class="sourceLineNo">1121</span> + " --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a> -<span class="sourceLineNo">1122</span> + " --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a> -<span class="sourceLineNo">1123</span> }<a name="line.1123"></a> -<span class="sourceLineNo">1124</span><a name="line.1124"></a> -<span class="sourceLineNo">1125</span> @Override protected void addOptions() {<a name="line.1125"></a> -<span class="sourceLineNo">1126</span> addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a> -<span class="sourceLineNo">1127</span> addOption(Options.COPY_TO);<a name="line.1127"></a> -<span class="sourceLineNo">1128</span> addOption(Options.COPY_FROM);<a name="line.1128"></a> -<span class="sourceLineNo">1129</span> addOption(Options.TARGET_NAME);<a name="line.1129"></a> -<span class="sourceLineNo">1130</span> addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a> -<span class="sourceLineNo">1131</span> addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a> -<span class="sourceLineNo">1132</span> addOption(Options.OVERWRITE);<a name="line.1132"></a> -<span class="sourceLineNo">1133</span> addOption(Options.CHUSER);<a name="line.1133"></a> -<span class="sourceLineNo">1134</span> addOption(Options.CHGROUP);<a name="line.1134"></a> -<span class="sourceLineNo">1135</span> addOption(Options.CHMOD);<a name="line.1135"></a> -<span class="sourceLineNo">1136</span> addOption(Options.MAPPERS);<a name="line.1136"></a> -<span class="sourceLineNo">1137</span> addOption(Options.BANDWIDTH);<a name="line.1137"></a> -<span class="sourceLineNo">1138</span> }<a name="line.1138"></a> -<span class="sourceLineNo">1139</span><a name="line.1139"></a> -<span class="sourceLineNo">1140</span> public static void main(String[] args) {<a name="line.1140"></a> -<span class="sourceLineNo">1141</span> new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a> -<span class="sourceLineNo">1142</span> }<a name="line.1142"></a> -<span class="sourceLineNo">1143</span>}<a name="line.1143"></a> +<span class="sourceLineNo">975</span> boolean skipTmp = conf.getBoolean(CONF_SKIP_TMP, false) ||<a name="line.975"></a> +<span class="sourceLineNo">976</span> conf.get(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR) != null;<a name="line.976"></a> +<span class="sourceLineNo">977</span><a name="line.977"></a> +<span class="sourceLineNo">978</span> Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.978"></a> +<span class="sourceLineNo">979</span> Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot,<a name="line.979"></a> +<span class="sourceLineNo">980</span> destConf);<a name="line.980"></a> +<span class="sourceLineNo">981</span> Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.981"></a> +<span class="sourceLineNo">982</span> Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.982"></a> +<span class="sourceLineNo">983</span><a name="line.983"></a> +<span class="sourceLineNo">984</span> // Find the necessary directory which need to change owner and group<a name="line.984"></a> +<span class="sourceLineNo">985</span> Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.985"></a> +<span class="sourceLineNo">986</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.986"></a> +<span class="sourceLineNo">987</span> if (skipTmp) {<a name="line.987"></a> +<span class="sourceLineNo">988</span> needSetOwnerDir = outputSnapshotDir;<a name="line.988"></a> +<span class="sourceLineNo">989</span> } else {<a name="line.989"></a> +<span class="sourceLineNo">990</span> needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot, destConf);<a name="line.990"></a> +<span class="sourceLineNo">991</span> if (outputFs.exists(needSetOwnerDir)) {<a name="line.991"></a> +<span class="sourceLineNo">992</span> needSetOwnerDir = snapshotTmpDir;<a name="line.992"></a> +<span class="sourceLineNo">993</span> }<a name="line.993"></a> +<span class="sourceLineNo">994</span> }<a name="line.994"></a> +<span class="sourceLineNo">995</span> }<a name="line.995"></a> +<span class="sourceLineNo">996</span><a name="line.996"></a> +<span class="sourceLineNo">997</span> // Check if the snapshot already exists<a name="line.997"></a> +<span class="sourceLineNo">998</span> if (outputFs.exists(outputSnapshotDir)) {<a name="line.998"></a> +<span class="sourceLineNo">999</span> if (overwrite) {<a name="line.999"></a> +<span class="sourceLineNo">1000</span> if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.1000"></a> +<span class="sourceLineNo">1001</span> System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.1001"></a> +<span class="sourceLineNo">1002</span> return 1;<a name="line.1002"></a> +<span class="sourceLineNo">1003</span> }<a name="line.1003"></a> +<span class="sourceLineNo">1004</span> } else {<a name="line.1004"></a> +<span class="sourceLineNo">1005</span> System.err.println("The snapshot '" + targetName +<a name="line.1005"></a> +<span class="sourceLineNo">1006</span> "' already exists in the destination: " + outputSnapshotDir);<a name="line.1006"></a> +<span class="sourceLineNo">1007</span> return 1;<a name="line.1007"></a> +<span class="sourceLineNo">1008</span> }<a name="line.1008"></a> +<span class="sourceLineNo">1009</span> }<a name="line.1009"></a> +<span class="sourceLineNo">1010</span><a name="line.1010"></a> +<span class="sourceLineNo">1011</span> if (!skipTmp) {<a name="line.1011"></a> +<span class="sourceLineNo">1012</span> // Check if the snapshot already in-progress<a name="line.1012"></a> +<span class="sourceLineNo">1013</span> if (outputFs.exists(snapshotTmpDir)) {<a name="line.1013"></a> +<span class="sourceLineNo">1014</span> if (overwrite) {<a name="line.1014"></a> +<span class="sourceLineNo">1015</span> if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1015"></a> +<span class="sourceLineNo">1016</span> System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1016"></a> +<span class="sourceLineNo">1017</span> return 1;<a name="line.1017"></a> +<span class="sourceLineNo">1018</span> }<a name="line.1018"></a> +<span class="sourceLineNo">1019</span> } else {<a name="line.1019"></a> +<span class="sourceLineNo">1020</span> System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1020"></a> +<span class="sourceLineNo">1021</span> System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1021"></a> +<span class="sourceLineNo">1022</span> System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1022"></a> +<span class="sourceLineNo">1023</span> return 1;<a name="line.1023"></a> +<span class="sourceLineNo">1024</span> }<a name="line.1024"></a> +<span class="sourceLineNo">1025</span> }<a name="line.1025"></a> +<span class="sourceLineNo">1026</span> }<a name="line.1026"></a> +<span class="sourceLineNo">1027</span><a name="line.1027"></a> +<span class="sourceLineNo">1028</span> // Step 1 - Copy fs1:/.snapshot/<snapshot> to fs2:/.snapshot/.tmp/<snapshot><a name="line.1028"></a> +<span class="sourceLineNo">1029</span> // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1029"></a> +<span class="sourceLineNo">1030</span> // will remove them because they are unreferenced.<a name="line.1030"></a> +<span class="sourceLineNo">1031</span> List<Path> travesedPaths = new ArrayList<>();<a name="line.1031"></a> +<span class="sourceLineNo">1032</span> boolean copySucceeded = false;<a name="line.1032"></a> +<span class="sourceLineNo">1033</span> try {<a name="line.1033"></a> +<span class="sourceLineNo">1034</span> LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1034"></a> +<span class="sourceLineNo">1035</span> travesedPaths =<a name="line.1035"></a> +<span class="sourceLineNo">1036</span> FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1036"></a> +<span class="sourceLineNo">1037</span> conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1037"></a> +<span class="sourceLineNo">1038</span> copySucceeded = true;<a name="line.1038"></a> +<span class="sourceLineNo">1039</span> } catch (IOException e) {<a name="line.1039"></a> +<span class="sourceLineNo">1040</span> throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1040"></a> +<span class="sourceLineNo">1041</span> snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1041"></a> +<span class="sourceLineNo">1042</span> } finally {<a name="line.1042"></a> +<span class="sourceLineNo">1043</span> if (copySucceeded) {<a name="line.1043"></a> +<span class="sourceLineNo">1044</span> if (filesUser != null || filesGroup != null) {<a name="line.1044"></a> +<span class="sourceLineNo">1045</span> LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1045"></a> +<span class="sourceLineNo">1046</span> + filesUser)<a name="line.1046"></a> +<span class="sourceLineNo">1047</span> + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1047"></a> +<span class="sourceLineNo">1048</span> + filesGroup));<a name="line.1048"></a> +<span class="sourceLineNo">1049</span> setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1049"></a> +<span class="sourceLineNo">1050</span> }<a name="line.1050"></a> +<span class="sourceLineNo">1051</span> if (filesMode > 0) {<a name="line.1051"></a> +<span class="sourceLineNo">1052</span> LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1052"></a> +<span class="sourceLineNo">1053</span> setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1053"></a> +<span class="sourceLineNo">1054</span> }<a name="line.1054"></a> +<span class="sourceLineNo">1055</span> }<a name="line.1055"></a> +<span class="sourceLineNo">1056</span> }<a name="line.1056"></a> +<span class="sourceLineNo">1057</span><a name="line.1057"></a> +<span class="sourceLineNo">1058</span> // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1058"></a> +<span class="sourceLineNo">1059</span> if (!targetName.equals(snapshotName)) {<a name="line.1059"></a> +<span class="sourceLineNo">1060</span> SnapshotDescription snapshotDesc =<a name="line.1060"></a> +<span class="sourceLineNo">1061</span> SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1061"></a> +<span class="sourceLineNo">1062</span> .toBuilder()<a name="line.1062"></a> +<span class="sourceLineNo">1063</span> .setName(targetName)<a name="line.1063"></a> +<span class="sourceLineNo">1064</span> .build();<a name="line.1064"></a> +<span class="sourceLineNo">1065</span> SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1065"></a> +<span class="sourceLineNo">1066</span> if (filesUser != null || filesGroup != null) {<a name="line.1066"></a> +<span class="sourceLineNo">1067</span> outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1067"></a> +<span class="sourceLineNo">1068</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1068"></a> +<span class="sourceLineNo">1069</span> }<a name="line.1069"></a> +<span class="sourceLineNo">1070</span> if (filesMode > 0) {<a name="line.1070"></a> +<span class="sourceLineNo">1071</span> outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1071"></a> +<span class="sourceLineNo">1072</span> SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1072"></a> +<span class="sourceLineNo">1073</span> }<a name="line.1073"></a> +<span class="sourceLineNo">1074</span> }<a name="line.1074"></a> +<span class="sourceLineNo">1075</span><a name="line.1075"></a> +<span class="sourceLineNo">1076</span> // Step 2 - Start MR Job to copy files<a name="line.1076"></a> +<span class="sourceLineNo">1077</span> // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1077"></a> +<span class="sourceLineNo">1078</span> // by the HFileArchiver, since they have no references.<a name="line.1078"></a> +<span class="sourceLineNo">1079</span> try {<a name="line.1079"></a> +<span class="sourceLineNo">1080</span> runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1080"></a> +<span class="sourceLineNo">1081</span> filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1081"></a> +<span class="sourceLineNo">1082</span><a name="line.1082"></a> +<span class="sourceLineNo">1083</span> LOG.info("Finalize the Snapshot Export");<a name="line.1083"></a> +<span class="sourceLineNo">1084</span> if (!skipTmp) {<a name="line.1084"></a> +<span class="sourceLineNo">1085</span> // Step 3 - Rename fs2:/.snapshot/.tmp/<snapshot> fs2:/.snapshot/<snapshot><a name="line.1085"></a> +<span class="sourceLineNo">1086</span> if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1086"></a> +<span class="sourceLineNo">1087</span> throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1087"></a> +<span class="sourceLineNo">1088</span> snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1088"></a> +<span class="sourceLineNo">1089</span> }<a name="line.1089"></a> +<span class="sourceLineNo">1090</span> }<a name="line.1090"></a> +<span class="sourceLineNo">1091</span><a name="line.1091"></a> +<span class="sourceLineNo">1092</span> // Step 4 - Verify snapshot integrity<a name="line.1092"></a> +<span class="sourceLineNo">1093</span> if (verifyTarget) {<a name="line.1093"></a> +<span class="sourceLineNo">1094</span> LOG.info("Verify snapshot integrity");<a name="line.1094"></a> +<span class="sourceLineNo">1095</span> verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1095"></a> +<span class="sourceLineNo">1096</span> }<a name="line.1096"></a> +<span class="sourceLineNo">1097</span><a name="line.1097"></a> +<span class="sourceLineNo">1098</span> LOG.info("Export Completed: " + targetName);<a name="line.1098"></a> +<span class="sourceLineNo">1099</span> return 0;<a name="line.1099"></a> +<span class="sourceLineNo">1100</span> } catch (Exception e) {<a name="line.1100"></a> +<span class="sourceLineNo">1101</span> LOG.error("Snapshot export failed", e);<a name="line.1101"></a> +<span class="sourceLineNo">1102</span> if (!skipTmp) {<a name="line.1102"></a> +<span class="sourceLineNo">1103</span> outputFs.delete(snapshotTmpDir, true);<a name="line.1103"></a> +<span class="sourceLineNo">1104</span> }<a name="line.1104"></a> +<span class="sourceLineNo">1105</span> outputFs.delete(outputSnapshotDir, true);<a name="line.1105"></a> +<span class="sourceLineNo">1106</span> return 1;<a name="line.1106"></a> +<span class="sourceLineNo">1107</span> } finally {<a name="line.1107"></a> +<span class="sourceLineNo">1108</span> IOUtils.closeStream(inputFs);<a name="line.1108"></a> +<span class="sourceLineNo">1109</span> IOUtils.closeStream(outputFs);<a name="line.1109"></a> +<span class="sourceLineNo">1110</span> }<a name="line.1110"></a> +<span class="sourceLineNo">1111</span> }<a name="line.1111"></a> +<span class="sourceLineNo">1112</span><a name="line.1112"></a> +<span class="sourceLineNo">1113</span> @Override<a name="line.1113"></a> +<span class="sourceLineNo">1114</span> protected void printUsage() {<a name="line.1114"></a> +<span class="sourceLineNo">1115</span> super.printUsage();<a name="line.1115"></a> +<span class="sourceLineNo">1116</span> System.out.println("\n"<a name="line.1116"></a> +<span class="sourceLineNo">1117</span> + "Examples:\n"<a name="line.1117"></a> +<span class="sourceLineNo">1118</span> + " hbase snapshot export \\\n"<a name="line.1118"></a> +<span class="sourceLineNo">1119</span> + " --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1119"></a> +<span class="sourceLineNo">1120</span> + " --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1120"></a> +<span class="sourceLineNo">1121</span> + "\n"<a name="line.1121"></a> +<span class="sourceLineNo">1122</span> + " hbase snapshot export \\\n"<a name="line.1122"></a> +<span class="sourceLineNo">1123</span> + " --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1123"></a> +<span class="sourceLineNo">1124</span> + " --copy-to hdfs://srv1:50070/hbase");<a name="line.1124"></a> +<span class="sourceLineNo">1125</span> }<a name="line.1125"></a> +<span class="sourceLineNo">1126</span><a name="line.1126"></a> +<span class="sourceLineNo">1127</span> @Override protected void addOptions() {<a name="line.1127"></a> +<span class="sourceLineNo">1128</span> addRequiredOption(Options.SNAPSHOT);<a name="line.1128"></a> +<span class="sourceLineNo">1129</span> addOption(Options.COPY_TO);<a name="line.1129"></a> +<span class="sourceLineNo">1130</span> addOption(Options.COPY_FROM);<a name="line.1130"></a> +<span class="sourceLineNo">1131</span> addOption(Options.TARGET_NAME);<a name="line.1131"></a> +<span class="sourceLineNo">1132</span> addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1132"></a> +<span class="sourceLineNo">1133</span> addOption(Options.NO_TARGET_VERIFY);<a name="line.1133"></a> +<span class="sourceLineNo">1134</span> addOption(Options.OVERWRITE);<a name="line.1134"></a> +<span class="sourceLineNo">1135</span> addOption(Options.CHUSER);<a name="line.1135"></a> +<span class="sourceLineNo">1136</span> addOption(Options.CHGROUP);<a name="line.1136"></a> +<span class="sourceLineNo">1137</span> addOption(Options.CHMOD);<a name="line.1137"></a> +<span class="sourceLineNo">1138</span> addOption(Options.MAPPERS);<a name="line.1138"></a> +<span class="sourceLineNo">1139</span> addOption(Options.BANDWIDTH);<a name="line.1139"></a> +<span class="sourceLineNo">1140</span> }<a name="line.1140"></a> +<span class="sourceLineNo">1141</span><a name="line.1141"></a> +<span class="sourceLineNo">1142</span> public static void main(String[] args) {<a name="line.1142"></a> +<span class="sourceLineNo">1143</span> new ExportSnapshot().doStaticMain(args);<a name="line.1143"></a> +<span class="sourceLineNo">1144</span> }<a name="line.1144"></a> +<span class="sourceLineNo">1145</span>}<a name="line.1145"></a>