Java tutorial
/** * <br> * Licensed under the Apache License, Version 2.0 (the "License");<br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at<br> * <br> * http://www.apache.org/licenses/LICENSE-2.0<br> * <br> * Unless required by applicable law or agreed to in writing, software<br> * distributed under the License is distributed on an "AS IS" BASIS,<br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br> * See the License for the specific language governing permissions and<br> * limitations under the License.<br> */ package edu.american.student.redis.hadoop; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.InputSplit; import org.apache.hadoop.mapreduce.RecordReader; import org.apache.hadoop.mapreduce.TaskAttemptContext; import edu.american.student.redis.MessageFactory; import edu.american.student.redis.foreman.RedisForeman; import edu.american.student.redis.foreman.RedisForemanException; public class RedisBigTableRecordReader extends RecordReader<RedisBigTableKey, Text> { private Iterator<Entry<RedisBigTableKey, byte[]>> keyValueMapIter = null; private Entry<RedisBigTableKey, byte[]> currentEntry = null; private RedisBigTableKey key = null; private Text value = new Text(); private float totalKVs = 0; private float processedKVs = 0; @Override public void close() throws IOException { } @Override public RedisBigTableKey getCurrentKey() throws IOException, InterruptedException { return key; } @Override public Text getCurrentValue() throws IOException, InterruptedException { return value; } @Override public float getProgress() throws IOException, InterruptedException { return processedKVs / totalKVs; } @Override public void initialize(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { String[] locations = split.getLocations(); RedisBigTableKey key = RedisBigTableKey.inflate(locations[0].getBytes()); byte[] row = key.getRow(); byte[] cf = key.getColumnFamily(); byte[] cq = key.getColumnQualifier(); RedisForeman foreman = new RedisForeman(); foreman.connect(); Map<RedisBigTableKey, byte[]> keyValues; try { keyValues = foreman.getByQualifier(locations[1].getBytes(), row, cf, cq); totalKVs = keyValues.size(); keyValueMapIter = keyValues.entrySet().iterator(); } catch (RedisForemanException e) { throw new IOException(MessageFactory.objective("Read Split").toString(), e); } } @Override public boolean nextKeyValue() throws IOException, InterruptedException { if (keyValueMapIter.hasNext()) { currentEntry = keyValueMapIter.next(); key = currentEntry.getKey(); value.set(currentEntry.getValue()); processedKVs++; return true; } return false; } }