1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.mapreduce;
20
21 import com.google.common.annotations.VisibleForTesting;
22
23 import org.apache.hadoop.fs.Path;
24 import org.apache.hadoop.hbase.HRegionInfo;
25 import org.apache.hadoop.hbase.HTableDescriptor;
26 import org.apache.hadoop.hbase.classification.InterfaceAudience;
27 import org.apache.hadoop.hbase.classification.InterfaceStability;
28 import org.apache.hadoop.hbase.client.Result;
29 import org.apache.hadoop.hbase.client.Scan;
30 import org.apache.hadoop.hbase.client.metrics.ScanMetrics;
31 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
32 import org.apache.hadoop.io.Writable;
33 import org.apache.hadoop.mapreduce.InputFormat;
34 import org.apache.hadoop.mapreduce.InputSplit;
35 import org.apache.hadoop.mapreduce.Job;
36 import org.apache.hadoop.mapreduce.JobContext;
37 import org.apache.hadoop.mapreduce.RecordReader;
38 import org.apache.hadoop.mapreduce.TaskAttemptContext;
39
40 import java.io.DataInput;
41 import java.io.DataOutput;
42 import java.io.IOException;
43 import java.lang.reflect.Method;
44 import java.util.ArrayList;
45 import java.util.List;
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 @InterfaceAudience.Public
86 @InterfaceStability.Evolving
87 public class TableSnapshotInputFormat extends InputFormat<ImmutableBytesWritable, Result> {
88
89 public static class TableSnapshotRegionSplit extends InputSplit implements Writable {
90 private TableSnapshotInputFormatImpl.InputSplit delegate;
91
92 public TableSnapshotRegionSplit() {
93 this.delegate = new TableSnapshotInputFormatImpl.InputSplit();
94 }
95
96 public TableSnapshotRegionSplit(TableSnapshotInputFormatImpl.InputSplit delegate) {
97 this.delegate = delegate;
98 }
99
100 public TableSnapshotRegionSplit(HTableDescriptor htd, HRegionInfo regionInfo,
101 List<String> locations, Scan scan, Path restoreDir) {
102 this.delegate =
103 new TableSnapshotInputFormatImpl.InputSplit(htd, regionInfo, locations, scan, restoreDir);
104 }
105
106 @Override
107 public long getLength() throws IOException, InterruptedException {
108 return delegate.getLength();
109 }
110
111 @Override
112 public String[] getLocations() throws IOException, InterruptedException {
113 return delegate.getLocations();
114 }
115
116 @Override
117 public void write(DataOutput out) throws IOException {
118 delegate.write(out);
119 }
120
121 @Override
122 public void readFields(DataInput in) throws IOException {
123 delegate.readFields(in);
124 }
125 }
126
127 @VisibleForTesting
128 static class TableSnapshotRegionRecordReader extends RecordReader<ImmutableBytesWritable, Result> {
129 private TableSnapshotInputFormatImpl.RecordReader delegate =
130 new TableSnapshotInputFormatImpl.RecordReader();
131 private TaskAttemptContext context;
132 private Method getCounter;
133
134 @Override
135 public void initialize(InputSplit split, TaskAttemptContext context) throws IOException,
136 InterruptedException {
137 this.context = context;
138 getCounter = TableRecordReaderImpl.retrieveGetCounterWithStringsParams(context);
139 delegate.initialize(
140 ((TableSnapshotRegionSplit) split).delegate,
141 context.getConfiguration());
142 }
143
144 @Override
145 public boolean nextKeyValue() throws IOException, InterruptedException {
146 boolean result = delegate.nextKeyValue();
147 if (result) {
148 ScanMetrics scanMetrics = delegate.getScanner().getScanMetrics();
149 if (scanMetrics != null && context != null) {
150 TableRecordReaderImpl.updateCounters(scanMetrics, 0, getCounter, context);
151 }
152 }
153
154 return result;
155 }
156
157 @Override
158 public ImmutableBytesWritable getCurrentKey() throws IOException, InterruptedException {
159 return delegate.getCurrentKey();
160 }
161
162 @Override
163 public Result getCurrentValue() throws IOException, InterruptedException {
164 return delegate.getCurrentValue();
165 }
166
167 @Override
168 public float getProgress() throws IOException, InterruptedException {
169 return delegate.getProgress();
170 }
171
172 @Override
173 public void close() throws IOException {
174 delegate.close();
175 }
176 }
177
178 @Override
179 public RecordReader<ImmutableBytesWritable, Result> createRecordReader(
180 InputSplit split, TaskAttemptContext context) throws IOException {
181 return new TableSnapshotRegionRecordReader();
182 }
183
184 @Override
185 public List<InputSplit> getSplits(JobContext job) throws IOException, InterruptedException {
186 List<InputSplit> results = new ArrayList<InputSplit>();
187 for (TableSnapshotInputFormatImpl.InputSplit split :
188 TableSnapshotInputFormatImpl.getSplits(job.getConfiguration())) {
189 results.add(new TableSnapshotRegionSplit(split));
190 }
191 return results;
192 }
193
194
195
196
197
198
199
200
201
202
203 public static void setInput(Job job, String snapshotName, Path restoreDir) throws IOException {
204 TableSnapshotInputFormatImpl.setInput(job.getConfiguration(), snapshotName, restoreDir);
205 }
206 }