1 /**
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19 package org.apache.hadoop.hbase.mapreduce;
20
21 import java.io.IOException;
22
23 import org.apache.hadoop.hbase.classification.InterfaceAudience;
24 import org.apache.hadoop.hbase.classification.InterfaceStability;
25 import org.apache.hadoop.hbase.client.Result;
26 import org.apache.hadoop.hbase.client.Scan;
27 import org.apache.hadoop.hbase.client.Table;
28 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
29 import org.apache.hadoop.mapreduce.InputSplit;
30 import org.apache.hadoop.mapreduce.RecordReader;
31 import org.apache.hadoop.mapreduce.TaskAttemptContext;
32
33 /**
34 * Iterate over an HBase table data, return (ImmutableBytesWritable, Result)
35 * pairs.
36 */
37 @InterfaceAudience.Public
38 @InterfaceStability.Stable
39 public class TableRecordReader
40 extends RecordReader<ImmutableBytesWritable, Result> {
41
42 private TableRecordReaderImpl recordReaderImpl = new TableRecordReaderImpl();
43
44 /**
45 * Restart from survivable exceptions by creating a new scanner.
46 *
47 * @param firstRow The first row to start at.
48 * @throws IOException When restarting fails.
49 */
50 public void restart(byte[] firstRow) throws IOException {
51 this.recordReaderImpl.restart(firstRow);
52 }
53
54
55 /**
56 * Sets the HBase table.
57 *
58 * @param htable The table to scan.
59 * @deprecated Use setTable() instead.
60 */
61 @Deprecated
62 public void setHTable(Table htable) {
63 this.setTable(htable);
64 }
65
66 /**
67 * @param table the {@link Table} to scan.
68 */
69 public void setTable(Table table) {
70 this.recordReaderImpl.setHTable(table);
71 }
72
73 /**
74 * Sets the scan defining the actual details like columns etc.
75 *
76 * @param scan The scan to set.
77 */
78 public void setScan(Scan scan) {
79 this.recordReaderImpl.setScan(scan);
80 }
81
82 /**
83 * Closes the split.
84 *
85 * @see org.apache.hadoop.mapreduce.RecordReader#close()
86 */
87 @Override
88 public void close() {
89 this.recordReaderImpl.close();
90 }
91
92 /**
93 * Returns the current key.
94 *
95 * @return The current key.
96 * @throws IOException
97 * @throws InterruptedException When the job is aborted.
98 * @see org.apache.hadoop.mapreduce.RecordReader#getCurrentKey()
99 */
100 @Override
101 public ImmutableBytesWritable getCurrentKey() throws IOException,
102 InterruptedException {
103 return this.recordReaderImpl.getCurrentKey();
104 }
105
106 /**
107 * Returns the current value.
108 *
109 * @return The current value.
110 * @throws IOException When the value is faulty.
111 * @throws InterruptedException When the job is aborted.
112 * @see org.apache.hadoop.mapreduce.RecordReader#getCurrentValue()
113 */
114 @Override
115 public Result getCurrentValue() throws IOException, InterruptedException {
116 return this.recordReaderImpl.getCurrentValue();
117 }
118
119 /**
120 * Initializes the reader.
121 *
122 * @param inputsplit The split to work with.
123 * @param context The current task context.
124 * @throws IOException When setting up the reader fails.
125 * @throws InterruptedException When the job is aborted.
126 * @see org.apache.hadoop.mapreduce.RecordReader#initialize(
127 * org.apache.hadoop.mapreduce.InputSplit,
128 * org.apache.hadoop.mapreduce.TaskAttemptContext)
129 */
130 @Override
131 public void initialize(InputSplit inputsplit,
132 TaskAttemptContext context) throws IOException,
133 InterruptedException {
134 this.recordReaderImpl.initialize(inputsplit, context);
135 }
136
137 /**
138 * Positions the record reader to the next record.
139 *
140 * @return <code>true</code> if there was another record.
141 * @throws IOException When reading the record failed.
142 * @throws InterruptedException When the job was aborted.
143 * @see org.apache.hadoop.mapreduce.RecordReader#nextKeyValue()
144 */
145 @Override
146 public boolean nextKeyValue() throws IOException, InterruptedException {
147 return this.recordReaderImpl.nextKeyValue();
148 }
149
150 /**
151 * The current progress of the record reader through its data.
152 *
153 * @return A number between 0.0 and 1.0, the fraction of the data read.
154 * @see org.apache.hadoop.mapreduce.RecordReader#getProgress()
155 */
156 @Override
157 public float getProgress() {
158 return this.recordReaderImpl.getProgress();
159 }
160
161 }