From 7e3343c5dc5892844c07c377bcfe3269e4543aef Mon Sep 17 00:00:00 2001 From: Apekshit Sharma Date: Sun, 20 Aug 2017 14:34:16 -0700 Subject: [PATCH] HBASE-18640 Move mapreduce out of hbase-server into separate module. Change-Id: Ieeb7235014717ca83ee5cb13b2a27fddfa6838e8 --- a.xml | 335 ++++++++++++++++ .../hadoop/hbase/security/token/TokenUtil.java | 0 hbase-it/pom.xml | 20 + .../hbase/mapreduce/IntegrationTestBulkLoad.java | 4 +- .../hbase/mapreduce/IntegrationTestImportTsv.java | 5 +- .../hbase/test/IntegrationTestLoadAndVerify.java | 3 +- ...grationTestWithCellVisibilityLoadAndVerify.java | 2 +- hbase-mapreduce-util/pom.xml | 317 +++++++++++++++ .../org/apache/hadoop/hbase/mapred/Driver.java | 0 .../hadoop/hbase/mapred/GroupingTableMap.java | 0 .../hadoop/hbase/mapred/HRegionPartitioner.java | 1 - .../hadoop/hbase/mapred/IdentityTableMap.java | 0 .../hadoop/hbase/mapred/IdentityTableReduce.java | 0 .../org/apache/hadoop/hbase/mapred/RowCounter.java | 0 .../hadoop/hbase/mapred/TableInputFormat.java | 0 .../hadoop/hbase/mapred/TableInputFormatBase.java | 0 .../org/apache/hadoop/hbase/mapred/TableMap.java | 0 .../hadoop/hbase/mapred/TableMapReduceUtil.java | 69 ---- .../hadoop/hbase/mapred/TableOutputFormat.java | 0 .../hadoop/hbase/mapred/TableRecordReader.java | 0 .../hadoop/hbase/mapred/TableRecordReaderImpl.java | 0 .../apache/hadoop/hbase/mapred/TableReduce.java | 0 .../org/apache/hadoop/hbase/mapred/TableSplit.java | 0 .../apache/hadoop/hbase/mapreduce/CellCounter.java | 0 .../apache/hadoop/hbase/mapreduce/CellCreator.java | 24 +- .../org/apache/hadoop/hbase/mapreduce/Export.java | 0 .../hbase/mapreduce/GroupingTableMapper.java | 0 .../hadoop/hbase/mapreduce/HRegionPartitioner.java | 0 .../apache/hadoop/hbase/mapreduce/HashTable.java | 0 .../hbase/mapreduce/IdentityTableMapper.java | 0 .../hbase/mapreduce/IdentityTableReducer.java | 0 .../hadoop/hbase/mapreduce/ImportTsvUtil.java | 46 +++ .../apache/hadoop/hbase/mapreduce/JarFinder.java | 0 .../hbase/mapreduce/KeyValueSerialization.java | 0 .../hbase/mapreduce/KeyValueSortReducer.java | 0 .../hbase/mapreduce/MultiTableInputFormat.java | 0 .../hbase/mapreduce/MultiTableInputFormatBase.java | 1 - .../hbase/mapreduce/MultiTableOutputFormat.java | 0 .../hbase/mapreduce/MultithreadedTableMapper.java | 0 .../hbase/mapreduce/MutationSerialization.java | 0 .../apache/hadoop/hbase/mapreduce/PutCombiner.java | 0 .../hadoop/hbase/mapreduce/PutSortReducer.java | 0 .../hbase/mapreduce}/RegionSizeCalculator.java | 23 +- .../hbase/mapreduce/ResultSerialization.java | 0 .../apache/hadoop/hbase/mapreduce/RowCounter.java | 0 .../mapreduce/SimpleTotalOrderPartitioner.java | 0 .../apache/hadoop/hbase/mapreduce/SyncTable.java | 0 .../hadoop/hbase/mapreduce/TableInputFormat.java | 0 .../hbase/mapreduce/TableInputFormatBase.java | 1 - .../hadoop/hbase/mapreduce/TableMapReduceUtil.java | 73 ---- .../apache/hadoop/hbase/mapreduce/TableMapper.java | 0 .../hbase/mapreduce/TableOutputCommitter.java | 0 .../hadoop/hbase/mapreduce/TableOutputFormat.java | 0 .../hadoop/hbase/mapreduce/TableRecordReader.java | 0 .../hbase/mapreduce/TableRecordReaderImpl.java | 2 +- .../hadoop/hbase/mapreduce/TableReducer.java | 0 .../apache/hadoop/hbase/mapreduce/TableSplit.java | 0 .../hadoop/hbase/mapreduce/TextSortReducer.java | 16 +- .../hadoop/hbase/mapreduce/TsvImporterMapper.java | 26 +- .../hbase/mapreduce/TsvImporterTextMapper.java | 14 +- .../apache/hadoop/hbase/mapreduce/TsvParser.java | 371 +++++++++++++++++ .../mapreduce/VisibilityExpressionResolver.java | 0 .../hadoop/hbase/mapred/TestGroupingTableMap.java | 0 .../hadoop/hbase/mapred/TestIdentityTableMap.java | 0 .../apache/hadoop/hbase/mapred/TestRowCounter.java | 0 .../apache/hadoop/hbase/mapred/TestSplitTable.java | 0 ...adoopSecurityEnabledUserProviderForTesting.java | 0 .../hadoop/hbase/mapreduce/NMapInputFormat.java | 0 .../hadoop/hbase/mapreduce/TestJarFinder.java | 0 .../hbase/mapreduce}/TestRegionSizeCalculator.java | 4 +- .../hadoop/hbase/mapreduce/TestTableSplit.java | 0 hbase-mapreduce/pom.xml | 190 +++++++++ .../mapred/MultiTableSnapshotInputFormat.java | 4 +- .../apache/hadoop/hbase/mapred/TableMRUtil.java | 101 +++++ .../hbase/mapred/TableSnapshotInputFormat.java | 0 .../apache/hadoop/hbase/mapreduce/CopyTable.java | 0 .../DefaultVisibilityExpressionResolver.java | 1 + .../org/apache/hadoop/hbase/mapreduce/Driver.java | 0 .../org/apache/hadoop/hbase/mapreduce/Import.java | 0 .../apache/hadoop/hbase/mapreduce/ImportTsv.java | 440 ++------------------- .../hadoop/hbase/mapreduce/package-info.java | 0 .../org/apache/hadoop/hbase/mapred/TestDriver.java | 1 + .../mapred/TestMultiTableSnapshotInputFormat.java | 2 +- .../hadoop/hbase/mapred/TestTableInputFormat.java | 0 .../hadoop/hbase/mapred/TestTableMapReduce.java | 0 .../hbase/mapred/TestTableMapReduceUtil.java | 0 .../TestTableOutputFormatConnectionExhaust.java | 0 .../hbase/mapred/TestTableSnapshotInputFormat.java | 10 +- .../mapreduce/MultiTableInputFormatTestBase.java | 0 .../hadoop/hbase/mapreduce/TestCellCounter.java | 2 + .../hadoop/hbase/mapreduce/TestCopyTable.java | 0 .../hbase/mapreduce/TestGroupingTableMapper.java | 1 + .../hbase/mapreduce/TestHRegionPartitioner.java | 2 + .../hadoop/hbase/mapreduce/TestHashTable.java | 0 .../hadoop/hbase/mapreduce/TestImportExport.java | 1 - .../TestImportTSVWithOperationAttributes.java | 12 +- .../hbase/mapreduce/TestImportTSVWithTTLs.java | 6 +- .../TestImportTSVWithVisibilityLabels.java | 50 +-- .../hadoop/hbase/mapreduce/TestImportTsv.java | 92 ++--- .../hbase/mapreduce/TestImportTsvParser.java | 6 +- .../hbase/mapreduce/TestMultiTableInputFormat.java | 0 .../TestMultiTableSnapshotInputFormat.java | 4 +- .../TestMultiTableSnapshotInputFormatImpl.java | 0 .../mapreduce/TestMultithreadedTableMapper.java | 0 .../hadoop/hbase/mapreduce/TestRowCounter.java | 0 .../mapreduce/TestSecureLoadIncrementalHFiles.java | 0 ...stSecureLoadIncrementalHFilesSplitRecovery.java | 0 .../mapreduce/TestSimpleTotalOrderPartitioner.java | 1 + .../hadoop/hbase/mapreduce/TestSyncTable.java | 0 .../hbase/mapreduce/TestTableInputFormat.java | 0 .../hbase/mapreduce/TestTableInputFormatBase.java | 1 + .../hbase/mapreduce/TestTableInputFormatScan1.java | 0 .../hbase/mapreduce/TestTableInputFormatScan2.java | 0 .../mapreduce/TestTableInputFormatScanBase.java | 0 .../hadoop/hbase/mapreduce/TestTableMapReduce.java | 0 .../hbase/mapreduce/TestTableMapReduceBase.java | 1 + .../hbase/mapreduce/TestTableMapReduceUtil.java | 0 .../hbase/mapreduce/TestTimeRangeMapRed.java | 0 .../hbase/mapreduce/TestWALRecordReader.java | 0 .../mapreduce/TsvImporterCustomTestMapper.java | 1 + .../TsvImporterCustomTestMapperForOprAttr.java | 8 +- hbase-server/pom.xml | 10 + .../mapreduce/MultiTableHFileOutputFormat.java | 2 +- .../mapreduce/MultiTableSnapshotInputFormat.java | 14 +- .../apache/hadoop/hbase/mapreduce/TableMRUtil.java | 113 ++++++ .../hbase/mapreduce/TableSnapshotInputFormat.java | 4 +- .../mapreduce/TableSnapshotInputFormatImpl.java | 2 - .../mapreduce/replication/VerifyReplication.java | 5 +- .../hadoop/hbase/ScanPerformanceEvaluation.java | 3 +- .../hbase/mapreduce/TestLoadIncrementalHFiles.java | 2 +- .../mapreduce/TestTableSnapshotInputFormat.java | 32 +- .../hadoop/hbase/spark/TestJavaHBaseContext.java | 1 - .../apache/hadoop/hbase/spark/BulkLoadSuite.scala | 6 +- pom.xml | 26 ++ src/main/asciidoc/_chapters/mapreduce.adoc | 4 +- src/main/asciidoc/_chapters/ops_mgt.adoc | 20 +- 136 files changed, 1782 insertions(+), 756 deletions(-) create mode 100644 a.xml rename {hbase-server => hbase-client}/src/main/java/org/apache/hadoop/hbase/security/token/TokenUtil.java (100%) create mode 100644 hbase-mapreduce-util/pom.xml rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/Driver.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/GroupingTableMap.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java (99%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableMap.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableReduce.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/RowCounter.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormatBase.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableMap.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java (78%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableOutputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReader.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReaderImpl.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableReduce.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapred/TableSplit.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java (83%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/Export.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/HashTable.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java (100%) create mode 100644 hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsvUtil.java rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/JarFinder.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSerialization.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSortReducer.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java (99%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/MutationSerialization.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/PutCombiner.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/PutSortReducer.java (100%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/util => hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce}/RegionSizeCalculator.java (84%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/ResultSerialization.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/RowCounter.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/SyncTable.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java (99%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java (92%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapper.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReader.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java (99%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableReducer.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSplit.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java (93%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java (90%) rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java (91%) create mode 100644 hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvParser.java rename {hbase-server => hbase-mapreduce-util}/src/main/java/org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapred/TestRowCounter.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapred/TestSplitTable.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapreduce/HadoopSecurityEnabledUserProviderForTesting.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java (100%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestJarFinder.java (100%) rename {hbase-server/src/test/java/org/apache/hadoop/hbase/util => hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce}/TestRegionSizeCalculator.java (97%) rename {hbase-server => hbase-mapreduce-util}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSplit.java (100%) create mode 100644 hbase-mapreduce/pom.xml rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java (97%) create mode 100644 hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/TableMRUtil.java rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java (100%) rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapreduce/CopyTable.java (100%) rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java (99%) rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapreduce/Driver.java (100%) rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapreduce/Import.java (100%) rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java (52%) rename {hbase-server => hbase-mapreduce}/src/main/java/org/apache/hadoop/hbase/mapreduce/package-info.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestTableInputFormat.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduce.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestTableOutputFormatConnectionExhaust.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java (96%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java (99%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCopyTable.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java (95%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHashTable.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java (99%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java (95%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java (96%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java (91%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java (86%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java (98%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormatImpl.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRowCounter.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFiles.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFilesSplitRecovery.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSyncTable.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan1.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan2.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java (99%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceUtil.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.java (100%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java (97%) rename {hbase-server => hbase-mapreduce}/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java (87%) create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMRUtil.java diff --git a/a.xml b/a.xml new file mode 100644 index 0000000000..da46cac509 --- /dev/null +++ b/a.xml @@ -0,0 +1,335 @@ + + + + 4.0.0 + + hbase + org.apache.hbase + 3.0.0-SNAPSHOT + .. + + hbase-mapreduce + Apache HBase - MapReduce + HBase Mapreduce + + + + + org.apache.maven.plugins + maven-site-plugin + + true + + + + + maven-assembly-plugin + + true + + + + maven-surefire-plugin + + + + secondPartTestsExecution + test + + test + + + true + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + [3.2,) + + compile + + + + + + + + + + + + + + + + + + org.apache.hbase.thirdparty + hbase-shaded-protobuf + + + org.apache.hbase + hbase-annotations + + + jdk.tools + jdk.tools + + + + + org.apache.hbase + hbase-annotations + test-jar + test + + + org.apache.hbase + hbase-common + + + org.apache.hbase + hbase-client + + + org.apache.hbase + hbase-common + test-jar + + + org.apache.hbase + hbase-mapreduce-util + + + org.apache.hbase + hbase-mapreduce-util + test-jar + + + org.apache.hbase + hbase-server + + + org.apache.hbase + hbase-server + test-jar + + + org.apache.hbase + hbase-protocol-shaded + + + + commons-codec + commons-codec + + + commons-io + commons-io + + + commons-lang + commons-lang + + + commons-logging + commons-logging + + + com.google.protobuf + protobuf-java + + + org.apache.zookeeper + zookeeper + + + org.apache.htrace + htrace-core + + + log4j + log4j + test + + + io.dropwizard.metrics + metrics-core + + + org.mockito + mockito-all + test + + + + + + + compile-protobuf + + + compile-protobuf + + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + + + compile-protoc + generate-sources + + compile + + + + ${basedir}/../hbase-protocol/src/main/protobuf + + + + + + + + + + + + hadoop-2.0 + + + + !hadoop.profile + + + + + com.github.stephenc.findbugs + findbugs-annotations + true + + + org.apache.hadoop + hadoop-auth + + + org.apache.hadoop + hadoop-common + + + net.java.dev.jets3t + jets3t + + + javax.servlet.jsp + jsp-api + + + org.mortbay.jetty + jetty + + + com.sun.jersey + jersey-server + + + com.sun.jersey + jersey-core + + + com.sun.jersey + jersey-json + + + javax.servlet + servlet-api + + + tomcat + jasper-compiler + + + tomcat + jasper-runtime + + + com.google.code.findbugs + jsr305 + + + + + + + + + hadoop-3.0 + + + hadoop.profile + 3.0 + + + + 3.0-SNAPSHOT + + + + org.apache.hadoop + hadoop-auth + + + org.apache.hadoop + hadoop-common + + + + + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/token/TokenUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/security/token/TokenUtil.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/security/token/TokenUtil.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/security/token/TokenUtil.java diff --git a/hbase-it/pom.xml b/hbase-it/pom.xml index eba444018a..ac36a9cdf5 100644 --- a/hbase-it/pom.xml +++ b/hbase-it/pom.xml @@ -200,6 +200,26 @@ org.apache.hbase + hbase-mapreduce-util + + + org.apache.hbase + hbase-mapreduce-util + test-jar + test + + + org.apache.hbase + hbase-mapreduce + + + org.apache.hbase + hbase-mapreduce + test-jar + test + + + org.apache.hbase hbase-rsgroup diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java index 52f1223e59..9aed5f0446 100644 --- a/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java +++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java @@ -253,10 +253,10 @@ public class IntegrationTestBulkLoad extends IntegrationTestBase { EnvironmentEdgeManager.currentTime(); Configuration conf = new Configuration(util.getConfiguration()); Path p = null; - if (conf.get(ImportTsv.BULK_OUTPUT_CONF_KEY) == null) { + if (conf.get(ImportTsvUtil.BULK_OUTPUT_CONF_KEY) == null) { p = util.getDataTestDirOnTestFS(getTablename() + "-" + iteration); } else { - p = new Path(conf.get(ImportTsv.BULK_OUTPUT_CONF_KEY)); + p = new Path(conf.get(ImportTsvUtil.BULK_OUTPUT_CONF_KEY)); } conf.setBoolean("mapreduce.map.speculative", false); diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java index 9d04bf91b0..ae2ba13784 100644 --- a/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java +++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java @@ -29,7 +29,6 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeSet; -import java.util.UUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -195,8 +194,8 @@ public class IntegrationTestImportTsv extends Configured implements Tool { Map args = new HashMap<>(); - args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString()); - args.put(ImportTsv.COLUMNS_CONF_KEY, + args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString()); + args.put(ImportTsvUtil.COLUMNS_CONF_KEY, format("HBASE_ROW_KEY,HBASE_TS_KEY,%s:c1,%s:c2", cf, cf)); // configure the test harness to NOT delete the HFiles after they're // generated. We need those for doLoadIncrementalHFiles diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java index f0425213ad..f00fe30ca4 100644 --- a/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java +++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java @@ -44,6 +44,8 @@ import org.apache.hadoop.hbase.IntegrationTestBase; import org.apache.hadoop.hbase.IntegrationTestingUtility; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; +import org.apache.hadoop.hbase.mapreduce.TableMRUtil; +import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.testclassification.IntegrationTests; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; @@ -55,7 +57,6 @@ import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.ScannerCallable; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.NMapInputFormat; -import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.mapreduce.TableMapper; import org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl; import org.apache.hadoop.hbase.util.AbstractHBaseTool; diff --git a/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java b/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java index 3cafe9d433..37493dfa0a 100644 --- a/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java +++ b/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java @@ -41,8 +41,8 @@ import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.ScannerCallable; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.io.hfile.HFile; -import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.mapreduce.TableMapper; +import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl; import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.security.visibility.Authorizations; diff --git a/hbase-mapreduce-util/pom.xml b/hbase-mapreduce-util/pom.xml new file mode 100644 index 0000000000..86b5800981 --- /dev/null +++ b/hbase-mapreduce-util/pom.xml @@ -0,0 +1,317 @@ + + + + 4.0.0 + + hbase + org.apache.hbase + 3.0.0-SNAPSHOT + .. + + hbase-mapreduce-util + Apache HBase - MapReduce Util + HBase Mapreduce Util + + + + + org.apache.maven.plugins + maven-site-plugin + + true + + + + + maven-assembly-plugin + + true + + + + maven-surefire-plugin + + + + secondPartTestsExecution + test + + test + + + true + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + [3.2,) + + compile + + + + + + + + + + + + + + + + + + org.apache.hbase.thirdparty + hbase-shaded-protobuf + + + org.apache.hbase + hbase-annotations + + + jdk.tools + jdk.tools + + + + + org.apache.hbase + hbase-annotations + test-jar + test + + + org.apache.hbase + hbase-common + + + org.apache.hbase + hbase-client + + + org.apache.hbase + hbase-common + test-jar + + + org.apache.hbase + hbase-protocol-shaded + + + + commons-codec + commons-codec + + + commons-io + commons-io + + + commons-lang + commons-lang + + + commons-logging + commons-logging + + + com.google.protobuf + protobuf-java + + + org.apache.zookeeper + zookeeper + + + org.apache.htrace + htrace-core + + + log4j + log4j + test + + + io.dropwizard.metrics + metrics-core + + + org.mockito + mockito-all + test + + + + + + + compile-protobuf + + + compile-protobuf + + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + + + compile-protoc + generate-sources + + compile + + + + ${basedir}/../hbase-protocol/src/main/protobuf + + + + + + + + + + + + hadoop-2.0 + + + + !hadoop.profile + + + + + com.github.stephenc.findbugs + findbugs-annotations + true + + + org.apache.hadoop + hadoop-auth + + + org.apache.hadoop + hadoop-common + + + net.java.dev.jets3t + jets3t + + + javax.servlet.jsp + jsp-api + + + org.mortbay.jetty + jetty + + + com.sun.jersey + jersey-server + + + com.sun.jersey + jersey-core + + + com.sun.jersey + jersey-json + + + javax.servlet + servlet-api + + + tomcat + jasper-compiler + + + tomcat + jasper-runtime + + + com.google.code.findbugs + jsr305 + + + + + + + + + hadoop-3.0 + + + hadoop.profile + 3.0 + + + + 3.0-SNAPSHOT + + + + org.apache.hadoop + hadoop-auth + + + org.apache.hadoop + hadoop-common + + + + + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/Driver.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/Driver.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/Driver.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/Driver.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/GroupingTableMap.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/GroupingTableMap.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/GroupingTableMap.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/GroupingTableMap.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java similarity index 99% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java index 0011a60520..4f5323ad80 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/HRegionPartitioner.java @@ -33,7 +33,6 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.Partitioner; - /** * This is used to partition the output keys into groups of keys. * Keys are grouped according to the regions that currently exist diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableMap.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableMap.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableMap.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableMap.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableReduce.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableReduce.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableReduce.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/IdentityTableReduce.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/RowCounter.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/RowCounter.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/RowCounter.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/RowCounter.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormat.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormat.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormat.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormat.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormatBase.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormatBase.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormatBase.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableInputFormatBase.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableMap.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableMap.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableMap.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableMap.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java similarity index 78% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java index 63ec4189a0..d377828830 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java @@ -18,7 +18,6 @@ */ package org.apache.hadoop.hbase.mapred; -import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.MetaTableAccessor; import org.apache.hadoop.hbase.TableName; @@ -26,7 +25,6 @@ import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.MutationSerialization; import org.apache.hadoop.hbase.mapreduce.ResultSerialization; @@ -41,8 +39,6 @@ import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; import java.io.IOException; -import java.util.Collection; -import java.util.Map; /** * Utility for {@link TableMap} and {@link TableReduce} @@ -121,71 +117,6 @@ public class TableMapReduceUtil { } /** - * Sets up the job for reading from one or more multiple table snapshots, with one or more scans - * per snapshot. - * It bypasses hbase servers and read directly from snapshot files. - * - * @param snapshotScans map of snapshot name to scans on that snapshot. - * @param mapper The mapper class to use. - * @param outputKeyClass The class of the output key. - * @param outputValueClass The class of the output value. - * @param job The current job to adjust. Make sure the passed job is - * carrying all necessary HBase configuration. - * @param addDependencyJars upload HBase jars and jars for any of the configured - * job classes via the distributed cache (tmpjars). - */ - public static void initMultiTableSnapshotMapperJob(Map> snapshotScans, - Class mapper, Class outputKeyClass, Class outputValueClass, - JobConf job, boolean addDependencyJars, Path tmpRestoreDir) throws IOException { - MultiTableSnapshotInputFormat.setInput(job, snapshotScans, tmpRestoreDir); - - job.setInputFormat(MultiTableSnapshotInputFormat.class); - if (outputValueClass != null) { - job.setMapOutputValueClass(outputValueClass); - } - if (outputKeyClass != null) { - job.setMapOutputKeyClass(outputKeyClass); - } - job.setMapperClass(mapper); - if (addDependencyJars) { - addDependencyJars(job); - } - - org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.resetCacheConfig(job); - } - - /** - * Sets up the job for reading from a table snapshot. It bypasses hbase servers - * and read directly from snapshot files. - * - * @param snapshotName The name of the snapshot (of a table) to read from. - * @param columns The columns to scan. - * @param mapper The mapper class to use. - * @param outputKeyClass The class of the output key. - * @param outputValueClass The class of the output value. - * @param job The current job to adjust. Make sure the passed job is - * carrying all necessary HBase configuration. - * @param addDependencyJars upload HBase jars and jars for any of the configured - * job classes via the distributed cache (tmpjars). - * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should - * have write permissions to this directory, and this should not be a subdirectory of rootdir. - * After the job is finished, restore directory can be deleted. - * @throws IOException When setting up the details fails. - * @see TableSnapshotInputFormat - */ - public static void initTableSnapshotMapJob(String snapshotName, String columns, - Class mapper, - Class outputKeyClass, - Class outputValueClass, JobConf job, - boolean addDependencyJars, Path tmpRestoreDir) - throws IOException { - TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir); - initTableMapJob(snapshotName, columns, mapper, outputKeyClass, outputValueClass, job, - addDependencyJars, TableSnapshotInputFormat.class); - org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.resetCacheConfig(job); - } - - /** * Use this before submitting a TableReduce job. It will * appropriately set up the JobConf. * diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableOutputFormat.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableOutputFormat.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableOutputFormat.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableOutputFormat.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReader.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReader.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReader.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReader.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReaderImpl.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReaderImpl.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReaderImpl.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableRecordReaderImpl.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableReduce.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableReduce.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableReduce.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableReduce.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableSplit.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableSplit.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableSplit.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapred/TableSplit.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java similarity index 83% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java index 1d4d37bc4b..8b8b7b2a97 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCreator.java @@ -39,11 +39,25 @@ public class CellCreator { private VisibilityExpressionResolver visExpResolver; public CellCreator(Configuration conf) { - Class clazz = conf.getClass( - VISIBILITY_EXP_RESOLVER_CLASS, DefaultVisibilityExpressionResolver.class, - VisibilityExpressionResolver.class); - this.visExpResolver = ReflectionUtils.newInstance(clazz, conf); - this.visExpResolver.init(); + // NOTE: We are dynamically linking DefaultVisibilityExpressionResolver here because it is in + // hbase-server module right now. In future, when we have a separate module for visibility + // tokens, we may be able to depend on that module and link the class statically again. + String visExpResolverClass = conf.get(VISIBILITY_EXP_RESOLVER_CLASS, + "DefaultVisibilityExpressionResolver"); + Class clazz; + try { + clazz = conf.getClassByName(visExpResolverClass); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + if (!VisibilityExpressionResolver.class.isAssignableFrom(clazz)) { + throw new RuntimeException(clazz + " is not of type VisibilityExpressionResolver"); + } else { + this.visExpResolver = ReflectionUtils.newInstance( + (Class) clazz, conf); + this.visExpResolver.init(); + } + } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/Export.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/Export.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/Export.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/Export.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/HashTable.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/HashTable.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/HashTable.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/HashTable.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java diff --git a/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsvUtil.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsvUtil.java new file mode 100644 index 0000000000..e1a9db6d3f --- /dev/null +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsvUtil.java @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.mapreduce; + +import org.apache.hadoop.hbase.classification.InterfaceAudience; + +@InterfaceAudience.Private +public class ImportTsvUtil { + public final static String MAPPER_CONF_KEY = "importtsv.mapper.class"; + public final static String BULK_OUTPUT_CONF_KEY = "importtsv.bulk.output"; + public final static String TIMESTAMP_CONF_KEY = "importtsv.timestamp"; + public final static String JOB_NAME_CONF_KEY = "mapreduce.job.name"; + // TODO: the rest of these configs are used exclusively by TsvImporterMapper. + // Move them out of the tool and let the mapper handle its own validation. + public final static String DRY_RUN_CONF_KEY = "importtsv.dry.run"; + // If true, bad lines are logged to stderr. Default: false. + public final static String LOG_BAD_LINES_CONF_KEY = "importtsv.log.bad.lines"; + public final static String SKIP_LINES_CONF_KEY = "importtsv.skip.bad.lines"; + public final static String SKIP_EMPTY_COLUMNS = "importtsv.skip.empty.columns"; + public final static String COLUMNS_CONF_KEY = "importtsv.columns"; + public final static String SEPARATOR_CONF_KEY = "importtsv.separator"; + public final static String ATTRIBUTE_SEPERATOR_CONF_KEY = "attributes.seperator"; + //This config is used to propagate credentials from parent MR jobs which launch + //ImportTSV jobs. SEE IntegrationTestImportTsv. + public final static String CREDENTIALS_LOCATION = "credentials_location"; + public final static String CREATE_TABLE_CONF_KEY = "create.table"; + public final static String NO_STRICT_COL_FAMILY = "no.strict"; + final static String DEFAULT_SEPARATOR = "\t"; + final static String DEFAULT_ATTRIBUTES_SEPERATOR = "=>"; + final static Class DEFAULT_MAPPER = TsvImporterMapper.class; +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/JarFinder.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/JarFinder.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/JarFinder.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/JarFinder.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSerialization.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSerialization.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSerialization.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSerialization.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSortReducer.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSortReducer.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSortReducer.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/KeyValueSortReducer.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java similarity index 99% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java index e18b3aa53f..5d541a6beb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java @@ -37,7 +37,6 @@ import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; -import org.apache.hadoop.hbase.util.RegionSizeCalculator; import org.apache.hadoop.mapreduce.InputFormat; import org.apache.hadoop.mapreduce.InputSplit; import org.apache.hadoop.mapreduce.JobContext; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MutationSerialization.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MutationSerialization.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MutationSerialization.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/MutationSerialization.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/PutCombiner.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/PutCombiner.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/PutCombiner.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/PutCombiner.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/PutSortReducer.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/PutSortReducer.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/PutSortReducer.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/PutSortReducer.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSizeCalculator.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/RegionSizeCalculator.java similarity index 84% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSizeCalculator.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/RegionSizeCalculator.java index 99769b7d88..f14cd90666 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSizeCalculator.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/RegionSizeCalculator.java @@ -15,12 +15,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.util; +package org.apache.hadoop.hbase.mapreduce; import java.io.IOException; import java.util.Arrays; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -33,18 +32,14 @@ import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.RegionLoad; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.classification.InterfaceAudience; -import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.client.Admin; -import org.apache.hadoop.hbase.client.Connection; -import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.RegionLocator; -import org.apache.hadoop.hbase.client.Table; +import org.apache.hadoop.hbase.util.Bytes; /** * Computes size of each region for given table and given column families. * The value is used by MapReduce for better scheduling. * */ -@InterfaceStability.Evolving @InterfaceAudience.Private public class RegionSizeCalculator { @@ -60,20 +55,6 @@ public class RegionSizeCalculator { /** * Computes size of each region for table and given column families. - * - * @deprecated Use {@link #RegionSizeCalculator(RegionLocator, Admin)} instead. - */ - @Deprecated - public RegionSizeCalculator(Table table) throws IOException { - try (Connection conn = ConnectionFactory.createConnection(table.getConfiguration()); - RegionLocator locator = conn.getRegionLocator(table.getName()); - Admin admin = conn.getAdmin()) { - init(locator, admin); - } - } - - /** - * Computes size of each region for table and given column families. * */ public RegionSizeCalculator(RegionLocator regionLocator, Admin admin) throws IOException { init(regionLocator, admin); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/ResultSerialization.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/ResultSerialization.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/ResultSerialization.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/ResultSerialization.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/RowCounter.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/RowCounter.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/RowCounter.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/RowCounter.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/SyncTable.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/SyncTable.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/SyncTable.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/SyncTable.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormat.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormat.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormat.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormat.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java similarity index 99% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java index ce1928e6df..8c1c5d4a3c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java @@ -45,7 +45,6 @@ import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.util.Addressing; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; -import org.apache.hadoop.hbase.util.RegionSizeCalculator; import org.apache.hadoop.hbase.util.Strings; import org.apache.hadoop.mapreduce.InputFormat; import org.apache.hadoop.mapreduce.InputSplit; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java similarity index 92% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java index ff458fffff..f4cb9677b9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; -import java.util.Collection; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; @@ -61,8 +60,6 @@ import org.apache.hadoop.mapreduce.InputFormat; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.util.StringUtils; -import com.codahale.metrics.MetricRegistry; - /** * Utility for {@link TableMapper} and {@link TableReducer} */ @@ -306,76 +303,6 @@ public class TableMapReduceUtil { } /** - * Sets up the job for reading from one or more table snapshots, with one or more scans - * per snapshot. - * It bypasses hbase servers and read directly from snapshot files. - * - * @param snapshotScans map of snapshot name to scans on that snapshot. - * @param mapper The mapper class to use. - * @param outputKeyClass The class of the output key. - * @param outputValueClass The class of the output value. - * @param job The current job to adjust. Make sure the passed job is - * carrying all necessary HBase configuration. - * @param addDependencyJars upload HBase jars and jars for any of the configured - * job classes via the distributed cache (tmpjars). - */ - public static void initMultiTableSnapshotMapperJob(Map> snapshotScans, - Class mapper, Class outputKeyClass, Class outputValueClass, - Job job, boolean addDependencyJars, Path tmpRestoreDir) throws IOException { - MultiTableSnapshotInputFormat.setInput(job.getConfiguration(), snapshotScans, tmpRestoreDir); - - job.setInputFormatClass(MultiTableSnapshotInputFormat.class); - if (outputValueClass != null) { - job.setMapOutputValueClass(outputValueClass); - } - if (outputKeyClass != null) { - job.setMapOutputKeyClass(outputKeyClass); - } - job.setMapperClass(mapper); - Configuration conf = job.getConfiguration(); - HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf)); - - if (addDependencyJars) { - addDependencyJars(job); - addDependencyJarsForClasses(job.getConfiguration(), MetricRegistry.class); - } - - resetCacheConfig(job.getConfiguration()); - } - - /** - * Sets up the job for reading from a table snapshot. It bypasses hbase servers - * and read directly from snapshot files. - * - * @param snapshotName The name of the snapshot (of a table) to read from. - * @param scan The scan instance with the columns, time range etc. - * @param mapper The mapper class to use. - * @param outputKeyClass The class of the output key. - * @param outputValueClass The class of the output value. - * @param job The current job to adjust. Make sure the passed job is - * carrying all necessary HBase configuration. - * @param addDependencyJars upload HBase jars and jars for any of the configured - * job classes via the distributed cache (tmpjars). - * - * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should - * have write permissions to this directory, and this should not be a subdirectory of rootdir. - * After the job is finished, restore directory can be deleted. - * @throws IOException When setting up the details fails. - * @see TableSnapshotInputFormat - */ - public static void initTableSnapshotMapperJob(String snapshotName, Scan scan, - Class mapper, - Class outputKeyClass, - Class outputValueClass, Job job, - boolean addDependencyJars, Path tmpRestoreDir) - throws IOException { - TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir); - initTableMapperJob(snapshotName, scan, mapper, outputKeyClass, - outputValueClass, job, addDependencyJars, false, TableSnapshotInputFormat.class); - resetCacheConfig(job.getConfiguration()); - } - - /** * Use this before submitting a Multi TableMap job. It will appropriately set * up the job. * diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapper.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapper.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapper.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMapper.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReader.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReader.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReader.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReader.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java similarity index 99% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java index 9a1c98e018..5f85537a94 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java @@ -48,7 +48,7 @@ import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTe @InterfaceAudience.Public public class TableRecordReaderImpl { public static final String LOG_PER_ROW_COUNT - = "hbase.mapreduce.log.scanner.rowcount"; + = "hbase.mapreduce.log.scanner.rowcount"; private static final Log LOG = LogFactory.getLog(TableRecordReaderImpl.class); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableReducer.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableReducer.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableReducer.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableReducer.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSplit.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSplit.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSplit.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSplit.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java similarity index 93% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java index 84324e23e3..95bf5656f9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TextSortReducer.java @@ -63,7 +63,7 @@ public class TextSortReducer extends private Counter badLineCount; - private ImportTsv.TsvParser parser; + private TsvParser parser; /** Cell visibility expr **/ private String cellVisibilityExpr; @@ -102,7 +102,7 @@ public class TextSortReducer extends Configuration conf = context.getConfiguration(); doSetup(context, conf); - parser = new ImportTsv.TsvParser(conf.get(ImportTsv.COLUMNS_CONF_KEY), separator); + parser = new TsvParser(conf.get(ImportTsvUtil.COLUMNS_CONF_KEY), separator); if (parser.getRowKeyColumnIndex() == -1) { throw new RuntimeException("No row key column specified"); } @@ -117,17 +117,17 @@ public class TextSortReducer extends protected void doSetup(Context context, Configuration conf) { // If a custom separator has been used, // decode it back from Base64 encoding. - separator = conf.get(ImportTsv.SEPARATOR_CONF_KEY); + separator = conf.get(ImportTsvUtil.SEPARATOR_CONF_KEY); if (separator == null) { - separator = ImportTsv.DEFAULT_SEPARATOR; + separator = ImportTsvUtil.DEFAULT_SEPARATOR; } else { separator = new String(Base64.decode(separator)); } // Should never get 0 as we are setting this to a valid value in job configuration. - ts = conf.getLong(ImportTsv.TIMESTAMP_CONF_KEY, 0); + ts = conf.getLong(ImportTsvUtil.TIMESTAMP_CONF_KEY, 0); - skipBadLines = context.getConfiguration().getBoolean(ImportTsv.SKIP_LINES_CONF_KEY, true); + skipBadLines = context.getConfiguration().getBoolean(ImportTsvUtil.SKIP_LINES_CONF_KEY, true); badLineCount = context.getCounter("ImportTsv", "Bad Lines"); } @@ -151,7 +151,7 @@ public class TextSortReducer extends Text line = iter.next(); byte[] lineBytes = line.getBytes(); try { - ImportTsv.TsvParser.ParsedLine parsed = parser.parse(lineBytes, line.getLength()); + TsvParser.ParsedLine parsed = parser.parse(lineBytes, line.getLength()); // Retrieve timestamp if exists ts = parsed.getTimestamp(ts); cellVisibilityExpr = parsed.getCellVisibility(); @@ -184,7 +184,7 @@ public class TextSortReducer extends kvs.add(kv); curSize += kv.heapSize(); } - } catch (ImportTsv.TsvParser.BadTsvLineException | IllegalArgumentException + } catch (TsvParser.BadTsvLineException | IllegalArgumentException | InvalidLabelException badLine) { if (skipBadLines) { System.err.println("Bad line." + badLine.getMessage()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java similarity index 90% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java index a9d8e03580..b9455544fa 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java @@ -30,7 +30,7 @@ import org.apache.hadoop.hbase.TagType; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; -import org.apache.hadoop.hbase.mapreduce.ImportTsv.TsvParser.BadTsvLineException; +import org.apache.hadoop.hbase.mapreduce.TsvParser.BadTsvLineException; import org.apache.hadoop.hbase.security.visibility.CellVisibility; import org.apache.hadoop.hbase.security.visibility.InvalidLabelException; import org.apache.hadoop.hbase.util.Base64; @@ -61,7 +61,7 @@ extends Mapper private Counter badLineCount; private boolean logBadLines; - protected ImportTsv.TsvParser parser; + protected TsvParser parser; protected Configuration conf; @@ -105,7 +105,7 @@ extends Mapper doSetup(context); conf = context.getConfiguration(); - parser = new ImportTsv.TsvParser(conf.get(ImportTsv.COLUMNS_CONF_KEY), + parser = new TsvParser(conf.get(ImportTsvUtil.COLUMNS_CONF_KEY), separator); if (parser.getRowKeyColumnIndex() == -1) { throw new RuntimeException("No row key column specified"); @@ -123,23 +123,23 @@ extends Mapper // If a custom separator has been used, // decode it back from Base64 encoding. - separator = conf.get(ImportTsv.SEPARATOR_CONF_KEY); + separator = conf.get(ImportTsvUtil.SEPARATOR_CONF_KEY); if (separator == null) { - separator = ImportTsv.DEFAULT_SEPARATOR; + separator = ImportTsvUtil.DEFAULT_SEPARATOR; } else { separator = new String(Base64.decode(separator)); } // Should never get 0 as we are setting this to a valid value in job // configuration. - ts = conf.getLong(ImportTsv.TIMESTAMP_CONF_KEY, 0); + ts = conf.getLong(ImportTsvUtil.TIMESTAMP_CONF_KEY, 0); skipEmptyColumns = context.getConfiguration().getBoolean( - ImportTsv.SKIP_EMPTY_COLUMNS, false); + ImportTsvUtil.SKIP_EMPTY_COLUMNS, false); skipBadLines = context.getConfiguration().getBoolean( - ImportTsv.SKIP_LINES_CONF_KEY, true); + ImportTsvUtil.SKIP_LINES_CONF_KEY, true); badLineCount = context.getCounter("ImportTsv", "Bad Lines"); - logBadLines = context.getConfiguration().getBoolean(ImportTsv.LOG_BAD_LINES_CONF_KEY, false); - hfileOutPath = conf.get(ImportTsv.BULK_OUTPUT_CONF_KEY); + logBadLines = context.getConfiguration().getBoolean(ImportTsvUtil.LOG_BAD_LINES_CONF_KEY, false); + hfileOutPath = conf.get(ImportTsvUtil.BULK_OUTPUT_CONF_KEY); } /** @@ -152,7 +152,7 @@ extends Mapper byte[] lineBytes = value.getBytes(); try { - ImportTsv.TsvParser.ParsedLine parsed = parser.parse( + TsvParser.ParsedLine parsed = parser.parse( lineBytes, value.getLength()); ImmutableBytesWritable rowKey = new ImmutableBytesWritable(lineBytes, @@ -187,7 +187,7 @@ extends Mapper populatePut(lineBytes, parsed, put, i); } context.write(rowKey, put); - } catch (ImportTsv.TsvParser.BadTsvLineException | IllegalArgumentException + } catch (TsvParser.BadTsvLineException | IllegalArgumentException | InvalidLabelException badLine) { if (logBadLines) { System.err.println(value); @@ -203,7 +203,7 @@ extends Mapper } } - protected void populatePut(byte[] lineBytes, ImportTsv.TsvParser.ParsedLine parsed, Put put, + protected void populatePut(byte[] lineBytes, TsvParser.ParsedLine parsed, Put put, int i) throws BadTsvLineException, IOException { Cell cell = null; if (hfileOutPath == null) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java similarity index 91% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java index 581f0d08f3..a047ce23dd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java @@ -45,7 +45,7 @@ extends Mapper private Counter badLineCount; private boolean logBadLines; - private ImportTsv.TsvParser parser; + private TsvParser parser; public boolean getSkipBadLines() { return skipBadLines; @@ -73,7 +73,7 @@ extends Mapper Configuration conf = context.getConfiguration(); - parser = new ImportTsv.TsvParser(conf.get(ImportTsv.COLUMNS_CONF_KEY), separator); + parser = new TsvParser(conf.get(ImportTsvUtil.COLUMNS_CONF_KEY), separator); if (parser.getRowKeyColumnIndex() == -1) { throw new RuntimeException("No row key column specified"); } @@ -88,15 +88,15 @@ extends Mapper // If a custom separator has been used, // decode it back from Base64 encoding. - separator = conf.get(ImportTsv.SEPARATOR_CONF_KEY); + separator = conf.get(ImportTsvUtil.SEPARATOR_CONF_KEY); if (separator == null) { - separator = ImportTsv.DEFAULT_SEPARATOR; + separator = ImportTsvUtil.DEFAULT_SEPARATOR; } else { separator = new String(Base64.decode(separator)); } - skipBadLines = context.getConfiguration().getBoolean(ImportTsv.SKIP_LINES_CONF_KEY, true); - logBadLines = context.getConfiguration().getBoolean(ImportTsv.LOG_BAD_LINES_CONF_KEY, false); + skipBadLines = context.getConfiguration().getBoolean(ImportTsvUtil.SKIP_LINES_CONF_KEY, true); + logBadLines = context.getConfiguration().getBoolean(ImportTsvUtil.LOG_BAD_LINES_CONF_KEY, false); badLineCount = context.getCounter("ImportTsv", "Bad Lines"); } @@ -110,7 +110,7 @@ extends Mapper ImmutableBytesWritable rowKey = new ImmutableBytesWritable( value.getBytes(), rowKeyOffests.getFirst(), rowKeyOffests.getSecond()); context.write(rowKey, value); - } catch (ImportTsv.TsvParser.BadTsvLineException|IllegalArgumentException badLine) { + } catch (TsvParser.BadTsvLineException|IllegalArgumentException badLine) { if (logBadLines) { System.err.println(value); } diff --git a/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvParser.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvParser.java new file mode 100644 index 0000000000..970a683e3b --- /dev/null +++ b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/TsvParser.java @@ -0,0 +1,371 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.mapreduce; + +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.shaded.com.google.common.base.Preconditions; +import org.apache.hadoop.hbase.shaded.com.google.common.base.Splitter; +import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Pair; + +import java.util.ArrayList; + +@InterfaceAudience.Private +public class TsvParser { + /** + * Column families and qualifiers mapped to the TSV columns + */ + private final byte[][] families; + private final byte[][] qualifiers; + + private final byte separatorByte; + + private int rowKeyColumnIndex; + + private int maxColumnCount; + + // Default value must be negative + public static final int DEFAULT_TIMESTAMP_COLUMN_INDEX = -1; + private final static String DEFAULT_MULTIPLE_ATTRIBUTES_SEPERATOR = ","; + + private int timestampKeyColumnIndex = DEFAULT_TIMESTAMP_COLUMN_INDEX; + + public static final String ROWKEY_COLUMN_SPEC = "HBASE_ROW_KEY"; + + public static final String TIMESTAMPKEY_COLUMN_SPEC = "HBASE_TS_KEY"; + + public static final String ATTRIBUTES_COLUMN_SPEC = "HBASE_ATTRIBUTES_KEY"; + + public static final String CELL_VISIBILITY_COLUMN_SPEC = "HBASE_CELL_VISIBILITY"; + + public static final String CELL_TTL_COLUMN_SPEC = "HBASE_CELL_TTL"; + + private int attrKeyColumnIndex = DEFAULT_ATTRIBUTES_COLUMN_INDEX; + + public static final int DEFAULT_ATTRIBUTES_COLUMN_INDEX = -1; + + public static final int DEFAULT_CELL_VISIBILITY_COLUMN_INDEX = -1; + + public static final int DEFAULT_CELL_TTL_COLUMN_INDEX = -1; + + private int cellVisibilityColumnIndex = DEFAULT_CELL_VISIBILITY_COLUMN_INDEX; + + private int cellTTLColumnIndex = DEFAULT_CELL_TTL_COLUMN_INDEX; + + /** + * @param columnsSpecification the list of columns to parser out, comma separated. + * The row key should be the special token TsvParser.ROWKEY_COLUMN_SPEC + * @param separatorStr + */ + public TsvParser(String columnsSpecification, String separatorStr) { + // Configure separator + byte[] separator = Bytes.toBytes(separatorStr); + Preconditions + .checkArgument(separator.length == 1, "TsvParser only supports single-byte separators"); + separatorByte = separator[0]; + + // Configure columns + ArrayList columnStrings = Lists.newArrayList(Splitter.on(',').trimResults().split(columnsSpecification)); + + maxColumnCount = columnStrings.size(); + families = new byte[maxColumnCount][]; + qualifiers = new byte[maxColumnCount][]; + + for (int i = 0; i < columnStrings.size(); i++) { + String str = columnStrings.get(i); + if (ROWKEY_COLUMN_SPEC.equals(str)) { + rowKeyColumnIndex = i; + continue; + } + if (TIMESTAMPKEY_COLUMN_SPEC.equals(str)) { + timestampKeyColumnIndex = i; + continue; + } + if (ATTRIBUTES_COLUMN_SPEC.equals(str)) { + attrKeyColumnIndex = i; + continue; + } + if (CELL_VISIBILITY_COLUMN_SPEC.equals(str)) { + cellVisibilityColumnIndex = i; + continue; + } + if (CELL_TTL_COLUMN_SPEC.equals(str)) { + cellTTLColumnIndex = i; + continue; + } + String[] parts = str.split(":", 2); + if (parts.length == 1) { + families[i] = str.getBytes(); + qualifiers[i] = HConstants.EMPTY_BYTE_ARRAY; + } else { + families[i] = parts[0].getBytes(); + qualifiers[i] = parts[1].getBytes(); + } + } + } + + public boolean hasTimestamp() { + return timestampKeyColumnIndex != DEFAULT_TIMESTAMP_COLUMN_INDEX; + } + + public int getTimestampKeyColumnIndex() { + return timestampKeyColumnIndex; + } + + public boolean hasAttributes() { + return attrKeyColumnIndex != DEFAULT_ATTRIBUTES_COLUMN_INDEX; + } + + public boolean hasCellVisibility() { + return cellVisibilityColumnIndex != DEFAULT_CELL_VISIBILITY_COLUMN_INDEX; + } + + public boolean hasCellTTL() { + return cellTTLColumnIndex != DEFAULT_CELL_VISIBILITY_COLUMN_INDEX; + } + + public int getAttributesKeyColumnIndex() { + return attrKeyColumnIndex; + } + + public int getCellVisibilityColumnIndex() { + return cellVisibilityColumnIndex; + } + + public int getCellTTLColumnIndex() { + return cellTTLColumnIndex; + } + + public int getRowKeyColumnIndex() { + return rowKeyColumnIndex; + } + + public byte[] getFamily(int idx) { + return families[idx]; + } + + public byte[] getQualifier(int idx) { + return qualifiers[idx]; + } + + public ParsedLine parse(byte[] lineBytes, int length) throws BadTsvLineException { + // Enumerate separator offsets + ArrayList tabOffsets = new ArrayList<>(maxColumnCount); + for (int i = 0; i < length; i++) { + if (lineBytes[i] == separatorByte) { + tabOffsets.add(i); + } + } + if (tabOffsets.isEmpty()) { + throw new BadTsvLineException("No delimiter"); + } + + tabOffsets.add(length); + + if (tabOffsets.size() > maxColumnCount) { + throw new BadTsvLineException("Excessive columns"); + } else if (tabOffsets.size() <= getRowKeyColumnIndex()) { + throw new BadTsvLineException("No row key"); + } else if (hasTimestamp() && tabOffsets.size() <= getTimestampKeyColumnIndex()) { + throw new BadTsvLineException("No timestamp"); + } else if (hasAttributes() && tabOffsets.size() <= getAttributesKeyColumnIndex()) { + throw new BadTsvLineException("No attributes specified"); + } else if (hasCellVisibility() && tabOffsets.size() <= getCellVisibilityColumnIndex()) { + throw new BadTsvLineException("No cell visibility specified"); + } else if (hasCellTTL() && tabOffsets.size() <= getCellTTLColumnIndex()) { + throw new BadTsvLineException("No cell TTL specified"); + } + return new ParsedLine(tabOffsets, lineBytes); + } + + class ParsedLine { + private final ArrayList tabOffsets; + private byte[] lineBytes; + + ParsedLine(ArrayList tabOffsets, byte[] lineBytes) { + this.tabOffsets = tabOffsets; + this.lineBytes = lineBytes; + } + + public int getRowKeyOffset() { + return getColumnOffset(rowKeyColumnIndex); + } + + public int getRowKeyLength() { + return getColumnLength(rowKeyColumnIndex); + } + + public long getTimestamp(long ts) throws BadTsvLineException { + // Return ts if HBASE_TS_KEY is not configured in column spec + if (!hasTimestamp()) { + return ts; + } + + String timeStampStr = Bytes.toString(lineBytes, getColumnOffset(timestampKeyColumnIndex), + getColumnLength(timestampKeyColumnIndex)); + try { + return Long.parseLong(timeStampStr); + } catch (NumberFormatException nfe) { + // treat this record as bad record + throw new BadTsvLineException("Invalid timestamp " + timeStampStr); + } + } + + private String getAttributes() { + if (!hasAttributes()) { + return null; + } else { + return Bytes.toString(lineBytes, getColumnOffset(attrKeyColumnIndex), + getColumnLength(attrKeyColumnIndex)); + } + } + + public String[] getIndividualAttributes() { + String attributes = getAttributes(); + if (attributes != null) { + return attributes.split(DEFAULT_MULTIPLE_ATTRIBUTES_SEPERATOR); + } else { + return null; + } + } + + public int getAttributeKeyOffset() { + if (hasAttributes()) { + return getColumnOffset(attrKeyColumnIndex); + } else { + return DEFAULT_ATTRIBUTES_COLUMN_INDEX; + } + } + + public int getAttributeKeyLength() { + if (hasAttributes()) { + return getColumnLength(attrKeyColumnIndex); + } else { + return DEFAULT_ATTRIBUTES_COLUMN_INDEX; + } + } + + public int getCellVisibilityColumnOffset() { + if (hasCellVisibility()) { + return getColumnOffset(cellVisibilityColumnIndex); + } else { + return DEFAULT_CELL_VISIBILITY_COLUMN_INDEX; + } + } + + public int getCellVisibilityColumnLength() { + if (hasCellVisibility()) { + return getColumnLength(cellVisibilityColumnIndex); + } else { + return DEFAULT_CELL_VISIBILITY_COLUMN_INDEX; + } + } + + public String getCellVisibility() { + if (!hasCellVisibility()) { + return null; + } else { + return Bytes.toString(lineBytes, getColumnOffset(cellVisibilityColumnIndex), + getColumnLength(cellVisibilityColumnIndex)); + } + } + + public int getCellTTLColumnOffset() { + if (hasCellTTL()) { + return getColumnOffset(cellTTLColumnIndex); + } else { + return DEFAULT_CELL_TTL_COLUMN_INDEX; + } + } + + public int getCellTTLColumnLength() { + if (hasCellTTL()) { + return getColumnLength(cellTTLColumnIndex); + } else { + return DEFAULT_CELL_TTL_COLUMN_INDEX; + } + } + + public long getCellTTL() { + if (!hasCellTTL()) { + return 0; + } else { + return Bytes.toLong(lineBytes, getColumnOffset(cellTTLColumnIndex), + getColumnLength(cellTTLColumnIndex)); + } + } + + public int getColumnOffset(int idx) { + if (idx > 0) return tabOffsets.get(idx - 1) + 1; + else return 0; + } + + public int getColumnLength(int idx) { + return tabOffsets.get(idx) - getColumnOffset(idx); + } + + public int getColumnCount() { + return tabOffsets.size(); + } + + public byte[] getLineBytes() { + return lineBytes; + } + } + + public static class BadTsvLineException extends Exception { + public BadTsvLineException(String err) { + super(err); + } + + private static final long serialVersionUID = 1L; + } + + /** + * Return starting position and length of row key from the specified line bytes. + * + * @param lineBytes + * @param length + * @return Pair of row key offset and length. + * @throws BadTsvLineException + */ + public Pair parseRowKey(byte[] lineBytes, int length) + throws BadTsvLineException { + int rkColumnIndex = 0; + int startPos = 0, endPos = 0; + for (int i = 0; i <= length; i++) { + if (i == length || lineBytes[i] == separatorByte) { + endPos = i - 1; + if (rkColumnIndex++ == getRowKeyColumnIndex()) { + if ((endPos + 1) == startPos) { + throw new BadTsvLineException("Empty value for ROW KEY."); + } + break; + } else { + startPos = endPos + 2; + } + } + if (i == length) { + throw new BadTsvLineException("Row key does not exist as number of columns in the line" + " are less than row key position."); + } + } + return new Pair<>(startPos, endPos - startPos + 1); + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java b/hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java similarity index 100% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java rename to hbase-mapreduce-util/src/main/java/org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestRowCounter.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestRowCounter.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestRowCounter.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestRowCounter.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestSplitTable.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestSplitTable.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestSplitTable.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapred/TestSplitTable.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/HadoopSecurityEnabledUserProviderForTesting.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/HadoopSecurityEnabledUserProviderForTesting.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/HadoopSecurityEnabledUserProviderForTesting.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/HadoopSecurityEnabledUserProviderForTesting.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestJarFinder.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestJarFinder.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestJarFinder.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestJarFinder.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSizeCalculator.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRegionSizeCalculator.java similarity index 97% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSizeCalculator.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRegionSizeCalculator.java index 51dc2380e5..b0f90249b9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSizeCalculator.java +++ b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRegionSizeCalculator.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.util; +package org.apache.hadoop.hbase.mapreduce; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HRegionInfo; @@ -24,9 +24,11 @@ import org.apache.hadoop.hbase.RegionLoad; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.mapreduce.RegionSizeCalculator; import org.apache.hadoop.hbase.testclassification.MiscTests; import org.apache.hadoop.hbase.testclassification.SmallTests; import org.apache.hadoop.hbase.client.RegionLocator; +import org.apache.hadoop.hbase.util.Bytes; import org.junit.Test; import org.junit.experimental.categories.Category; import org.mockito.Mockito; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSplit.java b/hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSplit.java similarity index 100% rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSplit.java rename to hbase-mapreduce-util/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSplit.java diff --git a/hbase-mapreduce/pom.xml b/hbase-mapreduce/pom.xml new file mode 100644 index 0000000000..9b11f18967 --- /dev/null +++ b/hbase-mapreduce/pom.xml @@ -0,0 +1,190 @@ + + + + 4.0.0 + + hbase + org.apache.hbase + 3.0.0-SNAPSHOT + .. + + hbase-mapreduce + Apache HBase - MapReduce + HBase Mapreduce + + + + + org.apache.maven.plugins + maven-site-plugin + + true + + + + + maven-assembly-plugin + + true + + + + maven-surefire-plugin + + + + secondPartTestsExecution + test + + test + + + true + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + [3.2,) + + compile + + + + + + + + + + + + + + + + + + org.apache.hbase + hbase-annotations + + + jdk.tools + jdk.tools + + + + + org.apache.hbase + hbase-annotations + test-jar + test + + + org.apache.hbase + hbase-common + + + org.apache.hbase + hbase-common + test-jar + + + org.apache.hbase + hbase-client + + + org.apache.hbase + hbase-mapreduce-util + + + org.apache.hbase + hbase-mapreduce-util + test-jar + + + org.apache.hbase + hbase-server + + + org.apache.hbase + hbase-server + test-jar + + + + org.apache.hadoop + hadoop-mapreduce-client-jobclient + test-jar + test + + + com.google.guava + guava + + + + + org.apache.hadoop + hadoop-hdfs + test-jar + test + + + com.google.guava + guava + + + + + log4j + log4j + test + + + org.mockito + mockito-all + test + + + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java similarity index 97% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java index 3e121fe97f..f2f6b7a64d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java +++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java @@ -54,7 +54,7 @@ import java.util.Map; * the overall dataset for the job is defined by the concatenation of the regions and tables * included in each snapshot/scan * pair. - * {@link org.apache.hadoop.hbase.mapred.TableMapReduceUtil#initMultiTableSnapshotMapperJob(Map, + * {@link TableMRUtil#initMultiTableSnapshotMapperJob(Map, * Class, Class, Class, JobConf, boolean, Path)} * can be used to configure the job. *
{@code
@@ -64,7 +64,7 @@ import java.util.Map;
  *    "snapshot2", ImmutableList.of(new Scan(Bytes.toBytes("1"), Bytes.toBytes("2")))
  * );
  * Path restoreDir = new Path("/tmp/snapshot_restore_dir")
- * TableMapReduceUtil.initTableSnapshotMapperJob(
+ * TableMRUtil.initTableSnapshotMapperJob(
  *     snapshotScans, MyTableMapper.class, MyMapKeyOutput.class,
  *      MyMapOutputValueWritable.class, job, true, restoreDir);
  * }
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/TableMRUtil.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/TableMRUtil.java
new file mode 100644
index 0000000000..6fb9b05fec
--- /dev/null
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/TableMRUtil.java
@@ -0,0 +1,101 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.mapred;
+
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.client.Scan;
+import org.apache.hadoop.mapred.JobConf;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Utility for {@link TableMap} and {@link TableReduce}
+ */
+@InterfaceAudience.Public
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class TableMRUtil {
+
+  /**
+   * Sets up the job for reading from one or more multiple table snapshots, with one or more scans
+   * per snapshot.
+   * It bypasses hbase servers and read directly from snapshot files.
+   *
+   * @param snapshotScans     map of snapshot name to scans on that snapshot.
+   * @param mapper            The mapper class to use.
+   * @param outputKeyClass    The class of the output key.
+   * @param outputValueClass  The class of the output value.
+   * @param job               The current job to adjust.  Make sure the passed job is
+   *                          carrying all necessary HBase configuration.
+   * @param addDependencyJars upload HBase jars and jars for any of the configured
+   *                          job classes via the distributed cache (tmpjars).
+   */
+  public static void initMultiTableSnapshotMapperJob(Map> snapshotScans,
+      Class mapper, Class outputKeyClass, Class outputValueClass,
+      JobConf job, boolean addDependencyJars, Path tmpRestoreDir) throws IOException {
+    MultiTableSnapshotInputFormat.setInput(job, snapshotScans, tmpRestoreDir);
+
+    job.setInputFormat(MultiTableSnapshotInputFormat.class);
+    if (outputValueClass != null) {
+      job.setMapOutputValueClass(outputValueClass);
+    }
+    if (outputKeyClass != null) {
+      job.setMapOutputKeyClass(outputKeyClass);
+    }
+    job.setMapperClass(mapper);
+    if (addDependencyJars) {
+      TableMapReduceUtil.addDependencyJars(job);
+    }
+
+    org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.resetCacheConfig(job);
+  }
+
+  /**
+   * Sets up the job for reading from a table snapshot. It bypasses hbase servers
+   * and read directly from snapshot files.
+   *
+   * @param snapshotName The name of the snapshot (of a table) to read from.
+   * @param columns  The columns to scan.
+   * @param mapper  The mapper class to use.
+   * @param outputKeyClass  The class of the output key.
+   * @param outputValueClass  The class of the output value.
+   * @param job  The current job to adjust.  Make sure the passed job is
+   * carrying all necessary HBase configuration.
+   * @param addDependencyJars upload HBase jars and jars for any of the configured
+   *           job classes via the distributed cache (tmpjars).
+   * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should
+   * have write permissions to this directory, and this should not be a subdirectory of rootdir.
+   * After the job is finished, restore directory can be deleted.
+   * @throws IOException When setting up the details fails.
+   * @see TableSnapshotInputFormat
+   */
+  public static void initTableSnapshotMapJob(String snapshotName, String columns,
+      Class mapper,
+      Class outputKeyClass,
+      Class outputValueClass, JobConf job,
+      boolean addDependencyJars, Path tmpRestoreDir)
+  throws IOException {
+    TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir);
+    TableMapReduceUtil.initTableMapJob(snapshotName, columns, mapper, outputKeyClass,
+        outputValueClass, job,
+        addDependencyJars, TableSnapshotInputFormat.class);
+  }
+}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java
similarity index 100%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CopyTable.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/CopyTable.java
similarity index 100%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/CopyTable.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/CopyTable.java
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java
similarity index 99%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java
index 004ee5c6ac..013244e211 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java
@@ -47,6 +47,7 @@ import org.apache.hadoop.hbase.util.Bytes;
 /**
  * This implementation creates tags by expanding expression using label ordinal. Labels will be
  * serialized in sorted order of it's ordinal.
+ * Used by dynamic loading in {@link CellCreator}.
  */
 @InterfaceAudience.Private
 public class DefaultVisibilityExpressionResolver implements VisibilityExpressionResolver {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/Driver.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/Driver.java
similarity index 100%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/Driver.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/Driver.java
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/Import.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/Import.java
similarity index 100%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/Import.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/Import.java
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java
similarity index 52%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java
index b64271efbc..c789bbfae9 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java
@@ -34,7 +34,6 @@ import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.TableNotEnabledException;
@@ -49,7 +48,6 @@ import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.util.Base64;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.Pair;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapreduce.Job;
 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
@@ -62,9 +60,6 @@ import org.apache.hadoop.util.ToolRunner;
 
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptor;
-import org.apache.hadoop.hbase.shaded.com.google.common.base.Preconditions;
-import org.apache.hadoop.hbase.shaded.com.google.common.base.Splitter;
-import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists;
 
 /**
  * Tool to import data from a TSV file.
@@ -81,377 +76,12 @@ public class ImportTsv extends Configured implements Tool {
 
   final static String NAME = "importtsv";
 
-  public final static String MAPPER_CONF_KEY = "importtsv.mapper.class";
-  public final static String BULK_OUTPUT_CONF_KEY = "importtsv.bulk.output";
-  public final static String TIMESTAMP_CONF_KEY = "importtsv.timestamp";
-  public final static String JOB_NAME_CONF_KEY = "mapreduce.job.name";
-  // TODO: the rest of these configs are used exclusively by TsvImporterMapper.
-  // Move them out of the tool and let the mapper handle its own validation.
-  public final static String DRY_RUN_CONF_KEY = "importtsv.dry.run";
-  // If true, bad lines are logged to stderr. Default: false.
-  public final static String LOG_BAD_LINES_CONF_KEY = "importtsv.log.bad.lines";
-  public final static String SKIP_LINES_CONF_KEY = "importtsv.skip.bad.lines";
-  public final static String SKIP_EMPTY_COLUMNS = "importtsv.skip.empty.columns";
-  public final static String COLUMNS_CONF_KEY = "importtsv.columns";
-  public final static String SEPARATOR_CONF_KEY = "importtsv.separator";
-  public final static String ATTRIBUTE_SEPERATOR_CONF_KEY = "attributes.seperator";
-  //This config is used to propagate credentials from parent MR jobs which launch
-  //ImportTSV jobs. SEE IntegrationTestImportTsv.
-  public final static String CREDENTIALS_LOCATION = "credentials_location";
-  final static String DEFAULT_SEPARATOR = "\t";
-  final static String DEFAULT_ATTRIBUTES_SEPERATOR = "=>";
-  final static String DEFAULT_MULTIPLE_ATTRIBUTES_SEPERATOR = ",";
-  final static Class DEFAULT_MAPPER = TsvImporterMapper.class;
-  public final static String CREATE_TABLE_CONF_KEY = "create.table";
-  public final static String NO_STRICT_COL_FAMILY = "no.strict";
   /**
    * If table didn't exist and was created in dry-run mode, this flag is
    * flipped to delete it when MR ends.
    */
   private static boolean DRY_RUN_TABLE_CREATED;
 
-  public static class TsvParser {
-    /**
-     * Column families and qualifiers mapped to the TSV columns
-     */
-    private final byte[][] families;
-    private final byte[][] qualifiers;
-
-    private final byte separatorByte;
-
-    private int rowKeyColumnIndex;
-
-    private int maxColumnCount;
-
-    // Default value must be negative
-    public static final int DEFAULT_TIMESTAMP_COLUMN_INDEX = -1;
-
-    private int timestampKeyColumnIndex = DEFAULT_TIMESTAMP_COLUMN_INDEX;
-
-    public static final String ROWKEY_COLUMN_SPEC = "HBASE_ROW_KEY";
-
-    public static final String TIMESTAMPKEY_COLUMN_SPEC = "HBASE_TS_KEY";
-
-    public static final String ATTRIBUTES_COLUMN_SPEC = "HBASE_ATTRIBUTES_KEY";
-
-    public static final String CELL_VISIBILITY_COLUMN_SPEC = "HBASE_CELL_VISIBILITY";
-
-    public static final String CELL_TTL_COLUMN_SPEC = "HBASE_CELL_TTL";
-
-    private int attrKeyColumnIndex = DEFAULT_ATTRIBUTES_COLUMN_INDEX;
-
-    public static final int DEFAULT_ATTRIBUTES_COLUMN_INDEX = -1;
-
-    public static final int DEFAULT_CELL_VISIBILITY_COLUMN_INDEX = -1;
-
-    public static final int DEFAULT_CELL_TTL_COLUMN_INDEX = -1;
-
-    private int cellVisibilityColumnIndex = DEFAULT_CELL_VISIBILITY_COLUMN_INDEX;
-
-    private int cellTTLColumnIndex = DEFAULT_CELL_TTL_COLUMN_INDEX;
-
-    /**
-     * @param columnsSpecification the list of columns to parser out, comma separated.
-     * The row key should be the special token TsvParser.ROWKEY_COLUMN_SPEC
-     * @param separatorStr
-     */
-    public TsvParser(String columnsSpecification, String separatorStr) {
-      // Configure separator
-      byte[] separator = Bytes.toBytes(separatorStr);
-      Preconditions.checkArgument(separator.length == 1,
-        "TsvParser only supports single-byte separators");
-      separatorByte = separator[0];
-
-      // Configure columns
-      ArrayList columnStrings = Lists.newArrayList(
-        Splitter.on(',').trimResults().split(columnsSpecification));
-
-      maxColumnCount = columnStrings.size();
-      families = new byte[maxColumnCount][];
-      qualifiers = new byte[maxColumnCount][];
-
-      for (int i = 0; i < columnStrings.size(); i++) {
-        String str = columnStrings.get(i);
-        if (ROWKEY_COLUMN_SPEC.equals(str)) {
-          rowKeyColumnIndex = i;
-          continue;
-        }
-        if (TIMESTAMPKEY_COLUMN_SPEC.equals(str)) {
-          timestampKeyColumnIndex = i;
-          continue;
-        }
-        if (ATTRIBUTES_COLUMN_SPEC.equals(str)) {
-          attrKeyColumnIndex = i;
-          continue;
-        }
-        if (CELL_VISIBILITY_COLUMN_SPEC.equals(str)) {
-          cellVisibilityColumnIndex = i;
-          continue;
-        }
-        if (CELL_TTL_COLUMN_SPEC.equals(str)) {
-          cellTTLColumnIndex = i;
-          continue;
-        }
-        String[] parts = str.split(":", 2);
-        if (parts.length == 1) {
-          families[i] = str.getBytes();
-          qualifiers[i] = HConstants.EMPTY_BYTE_ARRAY;
-        } else {
-          families[i] = parts[0].getBytes();
-          qualifiers[i] = parts[1].getBytes();
-        }
-      }
-    }
-
-    public boolean hasTimestamp() {
-      return timestampKeyColumnIndex != DEFAULT_TIMESTAMP_COLUMN_INDEX;
-    }
-
-    public int getTimestampKeyColumnIndex() {
-      return timestampKeyColumnIndex;
-    }
-
-    public boolean hasAttributes() {
-      return attrKeyColumnIndex != DEFAULT_ATTRIBUTES_COLUMN_INDEX;
-    }
-
-    public boolean hasCellVisibility() {
-      return cellVisibilityColumnIndex != DEFAULT_CELL_VISIBILITY_COLUMN_INDEX;
-    }
-
-    public boolean hasCellTTL() {
-      return cellTTLColumnIndex != DEFAULT_CELL_VISIBILITY_COLUMN_INDEX;
-    }
-
-    public int getAttributesKeyColumnIndex() {
-      return attrKeyColumnIndex;
-    }
-
-    public int getCellVisibilityColumnIndex() {
-      return cellVisibilityColumnIndex;
-    }
-
-    public int getCellTTLColumnIndex() {
-      return cellTTLColumnIndex;
-    }
-
-    public int getRowKeyColumnIndex() {
-      return rowKeyColumnIndex;
-    }
-
-    public byte[] getFamily(int idx) {
-      return families[idx];
-    }
-    public byte[] getQualifier(int idx) {
-      return qualifiers[idx];
-    }
-
-    public ParsedLine parse(byte[] lineBytes, int length)
-    throws BadTsvLineException {
-      // Enumerate separator offsets
-      ArrayList tabOffsets = new ArrayList<>(maxColumnCount);
-      for (int i = 0; i < length; i++) {
-        if (lineBytes[i] == separatorByte) {
-          tabOffsets.add(i);
-        }
-      }
-      if (tabOffsets.isEmpty()) {
-        throw new BadTsvLineException("No delimiter");
-      }
-
-      tabOffsets.add(length);
-
-      if (tabOffsets.size() > maxColumnCount) {
-        throw new BadTsvLineException("Excessive columns");
-      } else if (tabOffsets.size() <= getRowKeyColumnIndex()) {
-        throw new BadTsvLineException("No row key");
-      } else if (hasTimestamp()
-          && tabOffsets.size() <= getTimestampKeyColumnIndex()) {
-        throw new BadTsvLineException("No timestamp");
-      } else if (hasAttributes() && tabOffsets.size() <= getAttributesKeyColumnIndex()) {
-        throw new BadTsvLineException("No attributes specified");
-      } else if (hasCellVisibility() && tabOffsets.size() <= getCellVisibilityColumnIndex()) {
-        throw new BadTsvLineException("No cell visibility specified");
-      } else if (hasCellTTL() && tabOffsets.size() <= getCellTTLColumnIndex()) {
-        throw new BadTsvLineException("No cell TTL specified");
-      }
-      return new ParsedLine(tabOffsets, lineBytes);
-    }
-
-    class ParsedLine {
-      private final ArrayList tabOffsets;
-      private byte[] lineBytes;
-
-      ParsedLine(ArrayList tabOffsets, byte[] lineBytes) {
-        this.tabOffsets = tabOffsets;
-        this.lineBytes = lineBytes;
-      }
-
-      public int getRowKeyOffset() {
-        return getColumnOffset(rowKeyColumnIndex);
-      }
-      public int getRowKeyLength() {
-        return getColumnLength(rowKeyColumnIndex);
-      }
-
-      public long getTimestamp(long ts) throws BadTsvLineException {
-        // Return ts if HBASE_TS_KEY is not configured in column spec
-        if (!hasTimestamp()) {
-          return ts;
-        }
-
-        String timeStampStr = Bytes.toString(lineBytes,
-            getColumnOffset(timestampKeyColumnIndex),
-            getColumnLength(timestampKeyColumnIndex));
-        try {
-          return Long.parseLong(timeStampStr);
-        } catch (NumberFormatException nfe) {
-          // treat this record as bad record
-          throw new BadTsvLineException("Invalid timestamp " + timeStampStr);
-        }
-      }
-
-      private String getAttributes() {
-        if (!hasAttributes()) {
-          return null;
-        } else {
-          return Bytes.toString(lineBytes, getColumnOffset(attrKeyColumnIndex),
-              getColumnLength(attrKeyColumnIndex));
-        }
-      }
-
-      public String[] getIndividualAttributes() {
-        String attributes = getAttributes();
-        if (attributes != null) {
-          return attributes.split(DEFAULT_MULTIPLE_ATTRIBUTES_SEPERATOR);
-        } else {
-          return null;
-        }
-      }
-
-      public int getAttributeKeyOffset() {
-        if (hasAttributes()) {
-          return getColumnOffset(attrKeyColumnIndex);
-        } else {
-          return DEFAULT_ATTRIBUTES_COLUMN_INDEX;
-        }
-      }
-
-      public int getAttributeKeyLength() {
-        if (hasAttributes()) {
-          return getColumnLength(attrKeyColumnIndex);
-        } else {
-          return DEFAULT_ATTRIBUTES_COLUMN_INDEX;
-        }
-      }
-
-      public int getCellVisibilityColumnOffset() {
-        if (hasCellVisibility()) {
-          return getColumnOffset(cellVisibilityColumnIndex);
-        } else {
-          return DEFAULT_CELL_VISIBILITY_COLUMN_INDEX;
-        }
-      }
-
-      public int getCellVisibilityColumnLength() {
-        if (hasCellVisibility()) {
-          return getColumnLength(cellVisibilityColumnIndex);
-        } else {
-          return DEFAULT_CELL_VISIBILITY_COLUMN_INDEX;
-        }
-      }
-
-      public String getCellVisibility() {
-        if (!hasCellVisibility()) {
-          return null;
-        } else {
-          return Bytes.toString(lineBytes, getColumnOffset(cellVisibilityColumnIndex),
-              getColumnLength(cellVisibilityColumnIndex));
-        }
-      }
-
-      public int getCellTTLColumnOffset() {
-        if (hasCellTTL()) {
-          return getColumnOffset(cellTTLColumnIndex);
-        } else {
-          return DEFAULT_CELL_TTL_COLUMN_INDEX;
-        }
-      }
-
-      public int getCellTTLColumnLength() {
-        if (hasCellTTL()) {
-          return getColumnLength(cellTTLColumnIndex);
-        } else {
-          return DEFAULT_CELL_TTL_COLUMN_INDEX;
-        }
-      }
-
-      public long getCellTTL() {
-        if (!hasCellTTL()) {
-          return 0;
-        } else {
-          return Bytes.toLong(lineBytes, getColumnOffset(cellTTLColumnIndex),
-              getColumnLength(cellTTLColumnIndex));
-        }
-      }
-
-      public int getColumnOffset(int idx) {
-        if (idx > 0)
-          return tabOffsets.get(idx - 1) + 1;
-        else
-          return 0;
-      }
-      public int getColumnLength(int idx) {
-        return tabOffsets.get(idx) - getColumnOffset(idx);
-      }
-      public int getColumnCount() {
-        return tabOffsets.size();
-      }
-      public byte[] getLineBytes() {
-        return lineBytes;
-      }
-    }
-
-    public static class BadTsvLineException extends Exception {
-      public BadTsvLineException(String err) {
-        super(err);
-      }
-      private static final long serialVersionUID = 1L;
-    }
-
-    /**
-     * Return starting position and length of row key from the specified line bytes.
-     * @param lineBytes
-     * @param length
-     * @return Pair of row key offset and length.
-     * @throws BadTsvLineException
-     */
-    public Pair parseRowKey(byte[] lineBytes, int length)
-        throws BadTsvLineException {
-      int rkColumnIndex = 0;
-      int startPos = 0, endPos = 0;
-      for (int i = 0; i <= length; i++) {
-        if (i == length || lineBytes[i] == separatorByte) {
-          endPos = i - 1;
-          if (rkColumnIndex++ == getRowKeyColumnIndex()) {
-            if ((endPos + 1) == startPos) {
-              throw new BadTsvLineException("Empty value for ROW KEY.");
-            }
-            break;
-          } else {
-            startPos = endPos + 2;
-          }
-        }
-        if (i == length) {
-          throw new BadTsvLineException(
-              "Row key does not exist as number of columns in the line"
-                  + " are less than row key position.");
-        }
-      }
-      return new Pair<>(startPos, endPos - startPos + 1);
-    }
-  }
-
   /**
    * Sets up the actual job.
    *
@@ -463,34 +93,34 @@ public class ImportTsv extends Configured implements Tool {
   protected static Job createSubmittableJob(Configuration conf, String[] args)
       throws IOException, ClassNotFoundException {
     Job job = null;
-    boolean isDryRun = conf.getBoolean(DRY_RUN_CONF_KEY, false);
+    boolean isDryRun = conf.getBoolean(ImportTsvUtil.DRY_RUN_CONF_KEY, false);
     try (Connection connection = ConnectionFactory.createConnection(conf)) {
       try (Admin admin = connection.getAdmin()) {
         // Support non-XML supported characters
         // by re-encoding the passed separator as a Base64 string.
-        String actualSeparator = conf.get(SEPARATOR_CONF_KEY);
+        String actualSeparator = conf.get(ImportTsvUtil.SEPARATOR_CONF_KEY);
         if (actualSeparator != null) {
-          conf.set(SEPARATOR_CONF_KEY,
+          conf.set(ImportTsvUtil.SEPARATOR_CONF_KEY,
               Base64.encodeBytes(actualSeparator.getBytes()));
         }
 
         // See if a non-default Mapper was set
-        String mapperClassName = conf.get(MAPPER_CONF_KEY);
-        Class mapperClass = mapperClassName != null? Class.forName(mapperClassName): DEFAULT_MAPPER;
+        String mapperClassName = conf.get(ImportTsvUtil.MAPPER_CONF_KEY);
+        Class mapperClass = mapperClassName != null? Class.forName(mapperClassName): ImportTsvUtil.DEFAULT_MAPPER;
 
         TableName tableName = TableName.valueOf(args[0]);
         Path inputDir = new Path(args[1]);
-        String jobName = conf.get(JOB_NAME_CONF_KEY,NAME + "_" + tableName.getNameAsString());
+        String jobName = conf.get(ImportTsvUtil.JOB_NAME_CONF_KEY,NAME + "_" + tableName.getNameAsString());
         job = Job.getInstance(conf, jobName);
         job.setJarByClass(mapperClass);
         FileInputFormat.setInputPaths(job, inputDir);
         job.setInputFormatClass(TextInputFormat.class);
         job.setMapperClass(mapperClass);
         job.setMapOutputKeyClass(ImmutableBytesWritable.class);
-        String hfileOutPath = conf.get(BULK_OUTPUT_CONF_KEY);
-        String[] columns = conf.getStrings(COLUMNS_CONF_KEY);
-        if(StringUtils.isNotEmpty(conf.get(CREDENTIALS_LOCATION))) {
-          String fileLoc = conf.get(CREDENTIALS_LOCATION);
+        String hfileOutPath = conf.get(ImportTsvUtil.BULK_OUTPUT_CONF_KEY);
+        String[] columns = conf.getStrings(ImportTsvUtil.COLUMNS_CONF_KEY);
+        if(StringUtils.isNotEmpty(conf.get(ImportTsvUtil.CREDENTIALS_LOCATION))) {
+          String fileLoc = conf.get(ImportTsvUtil.CREDENTIALS_LOCATION);
           Credentials cred = Credentials.readTokenStorageFile(new File(fileLoc), conf);
           job.getCredentials().addAll(cred);
         }
@@ -498,7 +128,7 @@ public class ImportTsv extends Configured implements Tool {
         if (hfileOutPath != null) {
           if (!admin.tableExists(tableName)) {
             LOG.warn(format("Table '%s' does not exist.", tableName));
-            if ("yes".equalsIgnoreCase(conf.get(CREATE_TABLE_CONF_KEY, "yes"))) {
+            if ("yes".equalsIgnoreCase(conf.get(ImportTsvUtil.CREATE_TABLE_CONF_KEY, "yes"))) {
               // TODO: this is backwards. Instead of depending on the existence of a table,
               // create a sane splits file for HFileOutputFormat based on data sampling.
               createTable(admin, tableName, columns);
@@ -511,14 +141,14 @@ public class ImportTsv extends Configured implements Tool {
             } else {
               String errorMsg =
                   format("Table '%s' does not exist and '%s' is set to no.", tableName,
-                      CREATE_TABLE_CONF_KEY);
+                      ImportTsvUtil.CREATE_TABLE_CONF_KEY);
               LOG.error(errorMsg);
               throw new TableNotFoundException(errorMsg);
             }
           }
           try (Table table = connection.getTable(tableName);
               RegionLocator regionLocator = connection.getRegionLocator(tableName)) {
-            boolean noStrict = conf.getBoolean(NO_STRICT_COL_FAMILY, false);
+            boolean noStrict = conf.getBoolean(ImportTsvUtil.NO_STRICT_COL_FAMILY, false);
             // if no.strict is false then check column family
             if(!noStrict) {
               ArrayList unmatchedFamilies = new ArrayList<>();
@@ -535,10 +165,10 @@ public class ImportTsv extends Configured implements Tool {
                   familyNames.add(family.getNameAsString());
                 }
                 String msg =
-                    "Column Families " + unmatchedFamilies + " specified in " + COLUMNS_CONF_KEY
+                    "Column Families " + unmatchedFamilies + " specified in " + ImportTsvUtil.COLUMNS_CONF_KEY
                     + " does not match with any of the table " + tableName
                     + " column families " + familyNames + ".\n"
-                    + "To disable column family check, use -D" + NO_STRICT_COL_FAMILY
+                    + "To disable column family check, use -D" + ImportTsvUtil.NO_STRICT_COL_FAMILY
                     + "=true.\n";
                 usage(msg);
                 System.exit(-1);
@@ -648,11 +278,11 @@ public class ImportTsv extends Configured implements Tool {
       System.err.println("ERROR: " + errorMsg);
     }
     String usage =
-      "Usage: " + NAME + " -D"+ COLUMNS_CONF_KEY + "=a,b,c  \n" +
+      "Usage: " + NAME + " -D"+ ImportTsvUtil.COLUMNS_CONF_KEY + "=a,b,c  \n" +
       "\n" +
       "Imports the given input directory of TSV data into the specified table.\n" +
       "\n" +
-      "The column names of the TSV data must be specified using the -D" + COLUMNS_CONF_KEY + "\n" +
+      "The column names of the TSV data must be specified using the -D" + ImportTsvUtil.COLUMNS_CONF_KEY + "\n" +
       "option. This option takes the form of comma-separated column names, where each\n" +
       "column name is either a simple column family, or a columnfamily:qualifier. The special\n" +
       "column name " + TsvParser.ROWKEY_COLUMN_SPEC + " is used to designate that this column should be used\n" +
@@ -664,7 +294,7 @@ public class ImportTsv extends Configured implements Tool {
       TsvParser.TIMESTAMPKEY_COLUMN_SPEC + " is optional." + "\n" +
       "You must specify at most one column as timestamp key for each imported record.\n" +
       "Record with invalid timestamps (blank, non-numeric) will be treated as bad record.\n" +
-      "Note: if you use this option, then '" + TIMESTAMP_CONF_KEY + "' option will be ignored.\n" +
+      "Note: if you use this option, then '" + ImportTsvUtil.TIMESTAMP_CONF_KEY + "' option will be ignored.\n" +
       "\n" +
       "Other special columns that can be specified are " + TsvParser.CELL_TTL_COLUMN_SPEC +
       " and " + TsvParser.CELL_VISIBILITY_COLUMN_SPEC + ".\n" +
@@ -678,23 +308,23 @@ public class ImportTsv extends Configured implements Tool {
       " as the seperator.  Note that more than one OperationAttributes can be specified.\n"+
       "By default importtsv will load data directly into HBase. To instead generate\n" +
       "HFiles of data to prepare for a bulk data load, pass the option:\n" +
-      "  -D" + BULK_OUTPUT_CONF_KEY + "=/path/for/output\n" +
+      "  -D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=/path/for/output\n" +
       "  Note: if you do not use this option, then the target table must already exist in HBase\n" +
       "\n" +
       "Other options that may be specified with -D include:\n" +
-      "  -D" + DRY_RUN_CONF_KEY + "=true - Dry run mode. Data is not actually populated into" +
+      "  -D" + ImportTsvUtil.DRY_RUN_CONF_KEY + "=true - Dry run mode. Data is not actually populated into" +
       " table. If table does not exist, it is created but deleted in the end.\n" +
-      "  -D" + SKIP_LINES_CONF_KEY + "=false - fail if encountering an invalid line\n" +
-      "  -D" + LOG_BAD_LINES_CONF_KEY + "=true - logs invalid lines to stderr\n" +
-      "  -D" + SKIP_EMPTY_COLUMNS + "=false - If true then skip empty columns in bulk import\n" +
-      "  '-D" + SEPARATOR_CONF_KEY + "=|' - eg separate on pipes instead of tabs\n" +
-      "  -D" + TIMESTAMP_CONF_KEY + "=currentTimeAsLong - use the specified timestamp for the import\n" +
-      "  -D" + MAPPER_CONF_KEY + "=my.Mapper - A user-defined Mapper to use instead of " +
-      DEFAULT_MAPPER.getName() + "\n" +
-      "  -D" + JOB_NAME_CONF_KEY + "=jobName - use the specified mapreduce job name for the import\n" +
-      "  -D" + CREATE_TABLE_CONF_KEY + "=no - can be used to avoid creation of table by this tool\n" +
+      "  -D" + ImportTsvUtil.SKIP_LINES_CONF_KEY + "=false - fail if encountering an invalid line\n" +
+      "  -D" + ImportTsvUtil.LOG_BAD_LINES_CONF_KEY + "=true - logs invalid lines to stderr\n" +
+      "  -D" + ImportTsvUtil.SKIP_EMPTY_COLUMNS + "=false - If true then skip empty columns in bulk import\n" +
+      "  '-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=|' - eg separate on pipes instead of tabs\n" +
+      "  -D" + ImportTsvUtil.TIMESTAMP_CONF_KEY + "=currentTimeAsLong - use the specified timestamp for the import\n" +
+      "  -D" + ImportTsvUtil.MAPPER_CONF_KEY + "=my.Mapper - A user-defined Mapper to use instead of " +
+      ImportTsvUtil.DEFAULT_MAPPER.getName() + "\n" +
+      "  -D" + ImportTsvUtil.JOB_NAME_CONF_KEY + "=jobName - use the specified mapreduce job name for the import\n" +
+      "  -D" + ImportTsvUtil.CREATE_TABLE_CONF_KEY + "=no - can be used to avoid creation of table by this tool\n" +
       "  Note: if you set this to 'no', then the target table must already exist in HBase\n" +
-      "  -D" + NO_STRICT_COL_FAMILY + "=true - ignore column family check in hbase table. " +
+      "  -D" + ImportTsvUtil.NO_STRICT_COL_FAMILY + "=true - ignore column family check in hbase table. " +
       "Default is false\n\n" +
       "For performance consider the following options:\n" +
       "  -Dmapreduce.map.speculative=false\n" +
@@ -714,12 +344,12 @@ public class ImportTsv extends Configured implements Tool {
     // perform validation on these additional args. When it's not null, user has provided their
     // own mapper, thus these validation are not relevant.
     // TODO: validation for TsvImporterMapper, not this tool. Move elsewhere.
-    if (null == getConf().get(MAPPER_CONF_KEY)) {
+    if (null == getConf().get(ImportTsvUtil.MAPPER_CONF_KEY)) {
       // Make sure columns are specified
-      String[] columns = getConf().getStrings(COLUMNS_CONF_KEY);
+      String[] columns = getConf().getStrings(ImportTsvUtil.COLUMNS_CONF_KEY);
       if (columns == null) {
         usage("No columns specified. Please specify with -D" +
-            COLUMNS_CONF_KEY+"=...");
+            ImportTsvUtil.COLUMNS_CONF_KEY+"=...");
         return -1;
       }
 
@@ -765,11 +395,11 @@ public class ImportTsv extends Configured implements Tool {
     }
 
     // If timestamp option is not specified, use current system time.
-    long timstamp = getConf().getLong(TIMESTAMP_CONF_KEY, System.currentTimeMillis());
+    long timstamp = getConf().getLong(ImportTsvUtil.TIMESTAMP_CONF_KEY, System.currentTimeMillis());
 
     // Set it back to replace invalid timestamp (non-numeric) with current
     // system time
-    getConf().setLong(TIMESTAMP_CONF_KEY, timstamp);
+    getConf().setLong(ImportTsvUtil.TIMESTAMP_CONF_KEY, timstamp);
 
     synchronized (ImportTsv.class) {
       DRY_RUN_TABLE_CREATED = false;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/package-info.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/package-info.java
similarity index 100%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/package-info.java
rename to hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/package-info.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java
index ab6a86d261..31eb2fc8fa 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestDriver.java
@@ -18,6 +18,7 @@
  */
 package org.apache.hadoop.hbase.mapred;
 
+import org.apache.hadoop.hbase.mapred.Driver;
 import org.apache.hadoop.hbase.testclassification.MapReduceTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.util.ProgramDriver;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java
index 665c547019..ec0280ba54 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestMultiTableSnapshotInputFormat.java
@@ -58,7 +58,7 @@ public class TestMultiTableSnapshotInputFormat
     job.setMapperClass(Mapper.class);
     job.setReducerClass(Reducer.class);
 
-    TableMapReduceUtil.initMultiTableSnapshotMapperJob(getSnapshotScanMapping(scans), Mapper.class,
+    TableMRUtil.initMultiTableSnapshotMapperJob(getSnapshotScanMapping(scans), Mapper.class,
         ImmutableBytesWritable.class, ImmutableBytesWritable.class, job, true, restoreDir);
 
     TableMapReduceUtil.addDependencyJars(job);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableInputFormat.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableInputFormat.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableInputFormat.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableInputFormat.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduce.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduce.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduce.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduce.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableOutputFormatConnectionExhaust.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableOutputFormatConnectionExhaust.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableOutputFormatConnectionExhaust.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableOutputFormatConnectionExhaust.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java
similarity index 96%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java
index c689c834f6..748409f9aa 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java
@@ -72,7 +72,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
   }
 
   static class TestTableSnapshotMapper extends MapReduceBase
-      implements  TableMap {
+      implements TableMap {
     @Override
     public void map(ImmutableBytesWritable key, Result value,
         OutputCollector collector, Reporter reporter)
@@ -111,7 +111,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       JobConf job = new JobConf(UTIL.getConfiguration());
       Path tmpTableDir = UTIL.getDataTestDirOnTestFS(snapshotName);
 
-      TableMapReduceUtil.initTableSnapshotMapJob(snapshotName,
+      TableMRUtil.initTableSnapshotMapJob(snapshotName,
         COLUMNS, TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
         NullWritable.class, job, false, tmpTableDir);
 
@@ -157,7 +157,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
   public void testRestoreSnapshotDoesNotCreateBackRefLinksInit(TableName tableName,
       String snapshotName, Path tmpTableDir) throws Exception {
     JobConf job = new JobConf(UTIL.getConfiguration());
-    TableMapReduceUtil.initTableSnapshotMapJob(snapshotName,
+    TableMRUtil.initTableSnapshotMapJob(snapshotName,
       COLUMNS, TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
       NullWritable.class, job, false, tmpTableDir);
   }
@@ -174,7 +174,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       JobConf job = new JobConf(util.getConfiguration());
       Path tmpTableDir = util.getDataTestDirOnTestFS(snapshotName);
 
-      TableMapReduceUtil.initTableSnapshotMapJob(snapshotName,
+      TableMRUtil.initTableSnapshotMapJob(snapshotName,
         COLUMNS, TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
         NullWritable.class, job, false, tmpTableDir);
 
@@ -251,7 +251,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addDependencyJarsForClasses(jobConf,
         TestTableSnapshotInputFormat.class);
 
-      TableMapReduceUtil.initTableSnapshotMapJob(snapshotName, COLUMNS,
+      TableMRUtil.initTableSnapshotMapJob(snapshotName, COLUMNS,
         TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
         NullWritable.class, jobConf, true, tableDir);
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java
similarity index 99%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java
index ff623cb8e0..9ec3611157 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCellCounter.java
@@ -28,6 +28,8 @@ import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.mapreduce.CellCounter;
+import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.testclassification.MapReduceTests;
 import org.apache.hadoop.hbase.util.Bytes;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCopyTable.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCopyTable.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCopyTable.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestCopyTable.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java
index b7fdb47ccc..f6121298e3 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.mapreduce.GroupingTableMapper;
 import org.apache.hadoop.hbase.testclassification.MapReduceTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.client.Result;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java
similarity index 95%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java
index 2867f130bf..46ae664900 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java
@@ -18,6 +18,8 @@ package org.apache.hadoop.hbase.mapreduce;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.mapreduce.HRegionPartitioner;
+import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
 import org.apache.hadoop.hbase.testclassification.MapReduceTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHashTable.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHashTable.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHashTable.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHashTable.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
similarity index 99%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
index dc5981790f..91d2696fbe 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportExport.java
@@ -34,7 +34,6 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.NavigableMap;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
similarity index 95%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
index 6d9b05b393..1a798396e2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java
@@ -120,10 +120,10 @@ public class TestImportTSVWithOperationAttributes implements Configurable {
 
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.MAPPER_CONF_KEY
+        "-D" + ImportTsvUtil.MAPPER_CONF_KEY
             + "=org.apache.hadoop.hbase.mapreduce.TsvImporterCustomTestMapperForOprAttr",
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_ATTRIBUTES_KEY",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_ATTRIBUTES_KEY",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE1\u001bVALUE2\u001btest=>myvalue\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1, true);
@@ -136,10 +136,10 @@ public class TestImportTSVWithOperationAttributes implements Configurable {
 
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.MAPPER_CONF_KEY
+        "-D" + ImportTsvUtil.MAPPER_CONF_KEY
             + "=org.apache.hadoop.hbase.mapreduce.TsvImporterCustomTestMapperForOprAttr",
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_ATTRIBUTES_KEY",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_ATTRIBUTES_KEY",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE1\u001bVALUE2\u001btest1=>myvalue\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1, false);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
similarity index 96%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
index 4ab3d29a9f..411e52126f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java
@@ -108,10 +108,10 @@ public class TestImportTSVWithTTLs implements Configurable {
 
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.MAPPER_CONF_KEY
+        "-D" + ImportTsvUtil.MAPPER_CONF_KEY
             + "=org.apache.hadoop.hbase.mapreduce.TsvImporterMapper",
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_TTL",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_TTL",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE1\u001bVALUE2\u001b1000000\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java
similarity index 91%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java
index 8967ac77e9..fa4d6184b0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java
@@ -161,10 +161,10 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
 
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.MAPPER_CONF_KEY
+        "-D" + ImportTsvUtil.MAPPER_CONF_KEY
             + "=org.apache.hadoop.hbase.mapreduce.TsvImporterMapper",
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE1\u001bVALUE2\u001bsecret&private\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1);
@@ -177,9 +177,9 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
 
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.MAPPER_CONF_KEY + "=org.apache.hadoop.hbase.mapreduce.TsvImporterMapper",
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.MAPPER_CONF_KEY + "=org.apache.hadoop.hbase.mapreduce.TsvImporterMapper",
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE1\u001bVALUE2\u001bsecret&private\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1);
@@ -229,10 +229,10 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tableName.getNameAsString()), "hfiles");
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
-        "-D" + ImportTsv.COLUMNS_CONF_KEY
+        "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY
             + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE1\u001bVALUE2\u001bsecret&private\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1);
@@ -247,12 +247,12 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
     // Prepare the arguments required for the test.
     String[] args =
         new String[] {
-            "-D" + ImportTsv.MAPPER_CONF_KEY
+            "-D" + ImportTsvUtil.MAPPER_CONF_KEY
                 + "=org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper",
-            "-D" + ImportTsv.COLUMNS_CONF_KEY
+            "-D" + ImportTsvUtil.COLUMNS_CONF_KEY
                 + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-            "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b",
-            "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + bulkOutputPath.toString(),
+            "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b",
+            "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + bulkOutputPath.toString(),
             table.getNameAsString()
             };
     String data = "KEY\u001bVALUE4\u001bVALUE8\u001bsecret&private\n";
@@ -266,11 +266,11 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tableName.getNameAsString()), "hfiles");
     // Prepare the arguments required for the test.
     String[] args = new String[] {
-        "-D" + ImportTsv.MAPPER_CONF_KEY
+        "-D" + ImportTsvUtil.MAPPER_CONF_KEY
             + "=org.apache.hadoop.hbase.mapreduce.TsvImporterMapper",
-        "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
     String data = "KEY\u001bVALUE4\u001bVALUE8\u001bsecret&private\n";
     util.createTable(tableName, FAMILY);
     doMROnTableTest(util, FAMILY, data, args, 1);
@@ -283,9 +283,9 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tableName.getNameAsString()), "hfiles");
     // Prepare the arguments required for the test.
     String[] args =
-        new String[] { "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
-            "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-            "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+        new String[] { "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
+            "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
+            "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
 
     // 2 Data rows, one with valid label and one with invalid label
     String data =
@@ -302,11 +302,11 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
     // Prepare the arguments required for the test.
     String[] args =
         new String[] {
-            "-D" + ImportTsv.MAPPER_CONF_KEY
+            "-D" + ImportTsvUtil.MAPPER_CONF_KEY
                 + "=org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper",
-            "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
-            "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
-            "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
+            "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + hfiles.toString(),
+            "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B,HBASE_CELL_VISIBILITY",
+            "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=\u001b", tableName.getNameAsString() };
 
     // 2 Data rows, one with valid label and one with invalid label
     String data =
@@ -369,7 +369,7 @@ public class TestImportTSVWithVisibilityLabels implements Configurable {
     boolean createdHFiles = false;
     String outputPath = null;
     for (String arg : argv) {
-      if (arg.contains(ImportTsv.BULK_OUTPUT_CONF_KEY)) {
+      if (arg.contains(ImportTsvUtil.BULK_OUTPUT_CONF_KEY)) {
         createdHFiles = true;
         // split '-Dfoo=bar' on '=' and keep 'bar'
         outputPath = arg.split("=")[1];
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java
similarity index 86%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java
index efcf91eb23..57da507317 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java
@@ -116,8 +116,8 @@ public class TestImportTsv implements Configurable {
     tn = TableName.valueOf("test-" + UUID.randomUUID());
     args = new HashMap<>();
     // Prepare the arguments required for the test.
-    args.put(ImportTsv.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,FAM:A,FAM:B");
-    args.put(ImportTsv.SEPARATOR_CONF_KEY, "\u001b");
+    args.put(ImportTsvUtil.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,FAM:A,FAM:B");
+    args.put(ImportTsvUtil.SEPARATOR_CONF_KEY, "\u001b");
   }
 
   @Test
@@ -130,8 +130,8 @@ public class TestImportTsv implements Configurable {
   @Test
   public void testMROnTableWithTimestamp() throws Exception {
     util.createTable(tn, FAMILY);
-    args.put(ImportTsv.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,HBASE_TS_KEY,FAM:A,FAM:B");
-    args.put(ImportTsv.SEPARATOR_CONF_KEY, ",");
+    args.put(ImportTsvUtil.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,HBASE_TS_KEY,FAM:A,FAM:B");
+    args.put(ImportTsvUtil.SEPARATOR_CONF_KEY, ",");
     String data = "KEY,1234,VALUE1,VALUE2\n";
 
     doMROnTableTest(data, 1);
@@ -142,7 +142,7 @@ public class TestImportTsv implements Configurable {
   public void testMROnTableWithCustomMapper()
   throws Exception {
     util.createTable(tn, FAMILY);
-    args.put(ImportTsv.MAPPER_CONF_KEY,
+    args.put(ImportTsvUtil.MAPPER_CONF_KEY,
         "org.apache.hadoop.hbase.mapreduce.TsvImporterCustomTestMapper");
 
     doMROnTableTest(null, 3);
@@ -153,7 +153,7 @@ public class TestImportTsv implements Configurable {
   public void testBulkOutputWithoutAnExistingTable() throws Exception {
     // Prepare the arguments required for the test.
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString());
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString());
 
     doMROnTableTest(null, 3);
     util.deleteTable(tn);
@@ -165,7 +165,7 @@ public class TestImportTsv implements Configurable {
 
     // Prepare the arguments required for the test.
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString());
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString());
 
     doMROnTableTest(null, 3);
     util.deleteTable(tn);
@@ -177,8 +177,8 @@ public class TestImportTsv implements Configurable {
 
     // Prepare the arguments required for the test.
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString());
-    args.put(ImportTsv.NO_STRICT_COL_FAMILY, "true");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString());
+    args.put(ImportTsvUtil.NO_STRICT_COL_FAMILY, "true");
     doMROnTableTest(null, 3);
     util.deleteTable(tn);
   }
@@ -190,12 +190,12 @@ public class TestImportTsv implements Configurable {
     // Prepare the arguments required for the test.
     String[] args =
         new String[] {
-            "-D" + ImportTsv.MAPPER_CONF_KEY
+            "-D" + ImportTsvUtil.MAPPER_CONF_KEY
                 + "=org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper",
-            "-D" + ImportTsv.COLUMNS_CONF_KEY
+            "-D" + ImportTsvUtil.COLUMNS_CONF_KEY
                 + "=HBASE_ROW_KEY,FAM:A,FAM:B",
-            "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=,",
-            "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + bulkOutputPath.toString(),
+            "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=,",
+            "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + bulkOutputPath.toString(),
                 tn.getNameAsString(),
             INPUT_FILE
             };
@@ -218,8 +218,8 @@ public class TestImportTsv implements Configurable {
   @Test
   public void testBulkOutputWithTsvImporterTextMapper() throws Exception {
     Path bulkOutputPath = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()),"hfiles");
-    args.put(ImportTsv.MAPPER_CONF_KEY, "org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, bulkOutputPath.toString());
+    args.put(ImportTsvUtil.MAPPER_CONF_KEY, "org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, bulkOutputPath.toString());
     String data = "KEY\u001bVALUE4\u001bVALUE8\n";
     doMROnTableTest(data, 4);
     util.deleteTable(tn);
@@ -230,9 +230,9 @@ public class TestImportTsv implements Configurable {
     String[] args = new String[] { tn.getNameAsString(), "/inputFile" };
 
     Configuration conf = new Configuration(util.getConfiguration());
-    conf.set(ImportTsv.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,FAM:A");
-    conf.set(ImportTsv.BULK_OUTPUT_CONF_KEY, "/output");
-    conf.set(ImportTsv.CREATE_TABLE_CONF_KEY, "no");
+    conf.set(ImportTsvUtil.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,FAM:A");
+    conf.set(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, "/output");
+    conf.set(ImportTsvUtil.CREATE_TABLE_CONF_KEY, "no");
     exception.expect(TableNotFoundException.class);
     assertEquals("running test job configuration failed.", 0,
         ToolRunner.run(new Configuration(util.getConfiguration()), new ImportTsv() {
@@ -266,10 +266,10 @@ public class TestImportTsv implements Configurable {
     String INPUT_FILE = "InputFile1.csv";
     // Prepare the arguments required for the test.
     String[] argsArray = new String[] {
-        "-D" + ImportTsv.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B",
-        "-D" + ImportTsv.SEPARATOR_CONF_KEY + "=,",
-        "-D" + ImportTsv.BULK_OUTPUT_CONF_KEY + "=" + bulkOutputPath.toString(),
-        "-D" + ImportTsv.DRY_RUN_CONF_KEY + "=true",
+        "-D" + ImportTsvUtil.COLUMNS_CONF_KEY + "=HBASE_ROW_KEY,FAM:A,FAM:B",
+        "-D" + ImportTsvUtil.SEPARATOR_CONF_KEY + "=,",
+        "-D" + ImportTsvUtil.BULK_OUTPUT_CONF_KEY + "=" + bulkOutputPath.toString(),
+        "-D" + ImportTsvUtil.DRY_RUN_CONF_KEY + "=true",
         tn.getNameAsString(),
         INPUT_FILE };
     assertEquals("running test job configuration failed.", 0, ToolRunner.run(
@@ -289,7 +289,7 @@ public class TestImportTsv implements Configurable {
   @Test
   public void testDryModeWithoutBulkOutputAndTableExists() throws Exception {
     util.createTable(tn, FAMILY);
-    args.put(ImportTsv.DRY_RUN_CONF_KEY, "true");
+    args.put(ImportTsvUtil.DRY_RUN_CONF_KEY, "true");
     doMROnTableTest(null, 1);
     // Dry mode should not delete an existing table. If it's not present,
     // this will throw TableNotFoundException.
@@ -302,7 +302,7 @@ public class TestImportTsv implements Configurable {
    */
   @Test
   public void testDryModeWithoutBulkOutputAndTableDoesNotExists() throws Exception {
-    args.put(ImportTsv.DRY_RUN_CONF_KEY, "true");
+    args.put(ImportTsvUtil.DRY_RUN_CONF_KEY, "true");
     exception.expect(TableNotFoundException.class);
     doMROnTableTest(null, 1);
   }
@@ -311,8 +311,8 @@ public class TestImportTsv implements Configurable {
     util.createTable(tn, FAMILY);
     // Prepare the arguments required for the test.
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString());
-    args.put(ImportTsv.DRY_RUN_CONF_KEY, "true");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString());
+    args.put(ImportTsvUtil.DRY_RUN_CONF_KEY, "true");
     doMROnTableTest(null, 1);
     // Dry mode should not delete an existing table. If it's not present,
     // this will throw TableNotFoundException.
@@ -328,9 +328,9 @@ public class TestImportTsv implements Configurable {
       Exception {
     // Prepare the arguments required for the test.
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString());
-    args.put(ImportTsv.DRY_RUN_CONF_KEY, "true");
-    args.put(ImportTsv.CREATE_TABLE_CONF_KEY, "no");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString());
+    args.put(ImportTsvUtil.DRY_RUN_CONF_KEY, "true");
+    args.put(ImportTsvUtil.CREATE_TABLE_CONF_KEY, "no");
     exception.expect(TableNotFoundException.class);
     doMROnTableTest(null, 1);
   }
@@ -339,9 +339,9 @@ public class TestImportTsv implements Configurable {
   public void testDryModeWithBulkModeAndTableDoesNotExistsCreateTableSetToYes() throws Exception {
     // Prepare the arguments required for the test.
     Path hfiles = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, hfiles.toString());
-    args.put(ImportTsv.DRY_RUN_CONF_KEY, "true");
-    args.put(ImportTsv.CREATE_TABLE_CONF_KEY, "yes");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, hfiles.toString());
+    args.put(ImportTsvUtil.DRY_RUN_CONF_KEY, "true");
+    args.put(ImportTsvUtil.CREATE_TABLE_CONF_KEY, "yes");
     doMROnTableTest(null, 1);
     // Verify temporary table was deleted.
     exception.expect(TableNotFoundException.class);
@@ -354,10 +354,10 @@ public class TestImportTsv implements Configurable {
   @Test
   public void testTsvImporterTextMapperWithInvalidData() throws Exception {
     Path bulkOutputPath = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.MAPPER_CONF_KEY, "org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, bulkOutputPath.toString());
-    args.put(ImportTsv.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,HBASE_TS_KEY,FAM:A,FAM:B");
-    args.put(ImportTsv.SEPARATOR_CONF_KEY, ",");
+    args.put(ImportTsvUtil.MAPPER_CONF_KEY, "org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, bulkOutputPath.toString());
+    args.put(ImportTsvUtil.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,HBASE_TS_KEY,FAM:A,FAM:B");
+    args.put(ImportTsvUtil.SEPARATOR_CONF_KEY, ",");
     // 3 Rows of data as input. 2 Rows are valid and 1 row is invalid as it doesn't have TS
     String data = "KEY,1234,VALUE1,VALUE2\nKEY\nKEY,1235,VALUE1,VALUE2\n";
     doMROnTableTest(util, tn, FAMILY, data, args, 1, 4);
@@ -367,10 +367,10 @@ public class TestImportTsv implements Configurable {
   @Test
   public void testSkipEmptyColumns() throws Exception {
     Path bulkOutputPath = new Path(util.getDataTestDirOnTestFS(tn.getNameAsString()), "hfiles");
-    args.put(ImportTsv.BULK_OUTPUT_CONF_KEY, bulkOutputPath.toString());
-    args.put(ImportTsv.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,HBASE_TS_KEY,FAM:A,FAM:B");
-    args.put(ImportTsv.SEPARATOR_CONF_KEY, ",");
-    args.put(ImportTsv.SKIP_EMPTY_COLUMNS, "true");
+    args.put(ImportTsvUtil.BULK_OUTPUT_CONF_KEY, bulkOutputPath.toString());
+    args.put(ImportTsvUtil.COLUMNS_CONF_KEY, "HBASE_ROW_KEY,HBASE_TS_KEY,FAM:A,FAM:B");
+    args.put(ImportTsvUtil.SEPARATOR_CONF_KEY, ",");
+    args.put(ImportTsvUtil.SKIP_EMPTY_COLUMNS, "true");
     // 2 Rows of data as input. Both rows are valid and only 3 columns are no-empty among 4
     String data = "KEY,1234,VALUE1,VALUE2\nKEY,1235,,VALUE2\n";
     doMROnTableTest(util, tn, FAMILY, data, args, 1, 3);
@@ -436,15 +436,15 @@ public class TestImportTsv implements Configurable {
     // Perform basic validation. If the input args did not include
     // ImportTsv.BULK_OUTPUT_CONF_KEY then validate data in the table.
     // Otherwise, validate presence of hfiles.
-    boolean isDryRun = args.containsKey(ImportTsv.DRY_RUN_CONF_KEY) &&
-        "true".equalsIgnoreCase(args.get(ImportTsv.DRY_RUN_CONF_KEY));
-    if (args.containsKey(ImportTsv.BULK_OUTPUT_CONF_KEY)) {
+    boolean isDryRun = args.containsKey(ImportTsvUtil.DRY_RUN_CONF_KEY) &&
+        "true".equalsIgnoreCase(args.get(ImportTsvUtil.DRY_RUN_CONF_KEY));
+    if (args.containsKey(ImportTsvUtil.BULK_OUTPUT_CONF_KEY)) {
       if (isDryRun) {
         assertFalse(String.format("Dry run mode, %s should not have been created.",
-                 ImportTsv.BULK_OUTPUT_CONF_KEY),
-            fs.exists(new Path(ImportTsv.BULK_OUTPUT_CONF_KEY)));
+                 ImportTsvUtil.BULK_OUTPUT_CONF_KEY),
+            fs.exists(new Path(ImportTsvUtil.BULK_OUTPUT_CONF_KEY)));
       } else {
-        validateHFiles(fs, args.get(ImportTsv.BULK_OUTPUT_CONF_KEY), family,expectedKVCount);
+        validateHFiles(fs, args.get(ImportTsvUtil.BULK_OUTPUT_CONF_KEY), family,expectedKVCount);
       }
     } else {
       validateTable(conf, table, family, valueMultiplier, isDryRun);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java
similarity index 98%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java
index 3c38102185..fb9eb87ce8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java
@@ -27,11 +27,11 @@ import static org.junit.Assert.fail;
 import java.util.ArrayList;
 
 import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.mapreduce.TsvParser;
 import org.apache.hadoop.hbase.testclassification.MapReduceTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.apache.hadoop.hbase.mapreduce.ImportTsv.TsvParser;
-import org.apache.hadoop.hbase.mapreduce.ImportTsv.TsvParser.BadTsvLineException;
-import org.apache.hadoop.hbase.mapreduce.ImportTsv.TsvParser.ParsedLine;
+import org.apache.hadoop.hbase.mapreduce.TsvParser.BadTsvLineException;
+import org.apache.hadoop.hbase.mapreduce.TsvParser.ParsedLine;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
 import org.junit.Test;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java
index 32f511b236..ccf8df75ca 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormat.java
@@ -56,7 +56,7 @@ public class TestMultiTableSnapshotInputFormat extends MultiTableInputFormatTest
     for (String tableName : TABLES) {
       SnapshotTestingUtils
           .createSnapshotAndValidate(TEST_UTIL.getAdmin(), TableName.valueOf(tableName),
-              ImmutableList.of(MultiTableInputFormatTestBase.INPUT_FAMILY), null,
+              ImmutableList.of(INPUT_FAMILY), null,
               snapshotNameForTable(tableName), FSUtils.getRootDir(TEST_UTIL.getConfiguration()),
               TEST_UTIL.getTestFileSystem(), true);
     }
@@ -69,7 +69,7 @@ public class TestMultiTableSnapshotInputFormat extends MultiTableInputFormatTest
 
   @Override
   protected void initJob(List scans, Job job) throws IOException {
-    TableMapReduceUtil
+    TableMRUtil
         .initMultiTableSnapshotMapperJob(getSnapshotScanMapping(scans), ScanMapper.class,
             ImmutableBytesWritable.class, ImmutableBytesWritable.class, job, true, restoreDir);
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormatImpl.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormatImpl.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormatImpl.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormatImpl.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRowCounter.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRowCounter.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRowCounter.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestRowCounter.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFiles.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFiles.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFiles.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFiles.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFilesSplitRecovery.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFilesSplitRecovery.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFilesSplitRecovery.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSecureLoadIncrementalHFilesSplitRecovery.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java
index 0f41f33677..e060c51161 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.*;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner;
 import org.apache.hadoop.hbase.testclassification.MapReduceTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSyncTable.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSyncTable.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSyncTable.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestSyncTable.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java
index 699e773ce9..225ac18e9b 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java
@@ -24,6 +24,7 @@ import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
+import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan1.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan1.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan1.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan1.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan2.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan2.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan2.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan2.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java
similarity index 99%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java
index 27bf0637ec..855cc348d1 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java
@@ -40,6 +40,7 @@ import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceUtil.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceUtil.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceUtil.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableMapReduceUtil.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.java
similarity index 100%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.java
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java
similarity index 97%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java
index aea5036a61..26acdf7b4b 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.hbase.mapreduce;
 
+import org.apache.hadoop.hbase.mapreduce.TsvImporterMapper;
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java
similarity index 87%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java
rename to hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java
index 9d8b8f0b0e..b2f8dd46d2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java
+++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapperForOprAttr.java
@@ -21,8 +21,10 @@ import java.io.IOException;
 
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.mapreduce.ImportTsv.TsvParser.BadTsvLineException;
-import org.apache.hadoop.hbase.mapreduce.ImportTsv.TsvParser.ParsedLine;
+import org.apache.hadoop.hbase.mapreduce.ImportTsvUtil;
+import org.apache.hadoop.hbase.mapreduce.TsvImporterMapper;
+import org.apache.hadoop.hbase.mapreduce.TsvParser.BadTsvLineException;
+import org.apache.hadoop.hbase.mapreduce.TsvParser.ParsedLine;
 import org.apache.hadoop.hbase.util.Bytes;
 
 /**
@@ -42,7 +44,7 @@ public class TsvImporterCustomTestMapperForOprAttr extends TsvImporterMapper {
     if (parsed.getIndividualAttributes() != null) {
       String[] attributes = parsed.getIndividualAttributes();
       for (String attr : attributes) {
-        String[] split = attr.split(ImportTsv.DEFAULT_ATTRIBUTES_SEPERATOR);
+        String[] split = attr.split(ImportTsvUtil.DEFAULT_ATTRIBUTES_SEPERATOR);
         if (split == null || split.length <= 1) {
           throw new BadTsvLineException("Invalid attributes seperator specified" + attributes);
         } else {
diff --git a/hbase-server/pom.xml b/hbase-server/pom.xml
index e377874f64..2e323447ae 100644
--- a/hbase-server/pom.xml
+++ b/hbase-server/pom.xml
@@ -378,6 +378,16 @@
     
     
       org.apache.hbase
+      hbase-mapreduce-util
+    
+    
+      org.apache.hbase
+      hbase-mapreduce-util
+      test-jar
+      test
+    
+    
+      org.apache.hbase
       hbase-prefix-tree
       runtime
     
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java
index d7c7cc0d2b..9f783f19c7 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java
@@ -100,7 +100,7 @@ public class MultiTableHFileOutputFormat extends HFileOutputFormat2 {
 
   final private static int validateCompositeKey(byte[] keyBytes) {
 
-    int separatorIdx = Bytes.indexOf(keyBytes, HFileOutputFormat2.tableSeparator);
+    int separatorIdx = Bytes.indexOf(keyBytes, tableSeparator);
 
     // Either the separator was not found or a tablename wasn't present or a key wasn't present
     if (separatorIdx == -1) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java
index 0f07a58e35..856158052a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java
@@ -33,13 +33,13 @@ import java.util.Map;
 
 /**
  * MultiTableSnapshotInputFormat generalizes
- * {@link org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat}
+ * {@link TableSnapshotInputFormat}
  * allowing a MapReduce job to run over one or more table snapshots, with one or more scans
  * configured for each.
  * Internally, the input format delegates to
- * {@link org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat}
+ * {@link TableSnapshotInputFormat}
  * and thus has the same performance advantages;
- * see {@link org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat} for
+ * see {@link TableSnapshotInputFormat} for
  * more details.
  * Usage is similar to TableSnapshotInputFormat, with the following exception:
  * initMultiTableSnapshotMapperJob takes in a map
@@ -48,7 +48,7 @@ import java.util.Map;
  * the overall dataset for the job is defined by the concatenation of the regions and tables
  * included in each snapshot/scan
  * pair.
- * {@link org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil#initMultiTableSnapshotMapperJob
+ * {@link TableMRUtil#initMultiTableSnapshotMapperJob
  * (java.util.Map, Class, Class, Class, org.apache.hadoop.mapreduce.Job, boolean, org.apache
  * .hadoop.fs.Path)}
  * can be used to configure the job.
@@ -59,7 +59,7 @@ import java.util.Map;
  *    "snapshot2", ImmutableList.of(new Scan(Bytes.toBytes("1"), Bytes.toBytes("2")))
  * );
  * Path restoreDir = new Path("/tmp/snapshot_restore_dir")
- * TableMapReduceUtil.initTableSnapshotMapperJob(
+ * TableMRUtil.initTableSnapshotMapperJob(
  *     snapshotScans, MyTableMapper.class, MyMapKeyOutput.class,
  *      MyMapOutputValueWritable.class, job, true, restoreDir);
  * }
@@ -69,11 +69,11 @@ import java.util.Map;
  * record readers are created as described in {@link org.apache.hadoop.hbase.mapreduce
  * .TableSnapshotInputFormat}
  * (one per region).
- * See {@link org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat} for more notes on
+ * See {@link TableSnapshotInputFormat} for more notes on
  * permissioning; the
  * same caveats apply here.
  *
- * @see org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat
+ * @see TableSnapshotInputFormat
  * @see org.apache.hadoop.hbase.client.TableSnapshotScanner
  */
 @InterfaceAudience.Public
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMRUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMRUtil.java
new file mode 100644
index 0000000000..60ac5aac6d
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableMRUtil.java
@@ -0,0 +1,113 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.mapreduce;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.client.Scan;
+import org.apache.hadoop.mapreduce.Job;
+
+import com.codahale.metrics.MetricRegistry;
+
+/**
+ * Utility for {@link TableMapper} and {@link TableReducer}
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+@InterfaceAudience.Public
+public class TableMRUtil {
+  private static final Log LOG = LogFactory.getLog(TableMRUtil.class);
+
+  /**
+   * Sets up the job for reading from one or more table snapshots, with one or more scans
+   * per snapshot.
+   * It bypasses hbase servers and read directly from snapshot files.
+   *
+   * @param snapshotScans     map of snapshot name to scans on that snapshot.
+   * @param mapper            The mapper class to use.
+   * @param outputKeyClass    The class of the output key.
+   * @param outputValueClass  The class of the output value.
+   * @param job               The current job to adjust.  Make sure the passed job is
+   *                          carrying all necessary HBase configuration.
+   * @param addDependencyJars upload HBase jars and jars for any of the configured
+   *                          job classes via the distributed cache (tmpjars).
+   */
+  public static void initMultiTableSnapshotMapperJob(Map> snapshotScans,
+      Class mapper, Class outputKeyClass, Class outputValueClass,
+      Job job, boolean addDependencyJars, Path tmpRestoreDir) throws IOException {
+    MultiTableSnapshotInputFormat.setInput(job.getConfiguration(), snapshotScans, tmpRestoreDir);
+
+    job.setInputFormatClass(MultiTableSnapshotInputFormat.class);
+    if (outputValueClass != null) {
+      job.setMapOutputValueClass(outputValueClass);
+    }
+    if (outputKeyClass != null) {
+      job.setMapOutputKeyClass(outputKeyClass);
+    }
+    job.setMapperClass(mapper);
+    Configuration conf = job.getConfiguration();
+    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));
+
+    if (addDependencyJars) {
+      TableMapReduceUtil.addDependencyJars(job);
+      TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(), MetricRegistry.class);
+    }
+
+    TableMapReduceUtil.resetCacheConfig(job.getConfiguration());
+  }
+
+  /**
+   * Sets up the job for reading from a table snapshot. It bypasses hbase servers
+   * and read directly from snapshot files.
+   *
+   * @param snapshotName The name of the snapshot (of a table) to read from.
+   * @param scan  The scan instance with the columns, time range etc.
+   * @param mapper  The mapper class to use.
+   * @param outputKeyClass  The class of the output key.
+   * @param outputValueClass  The class of the output value.
+   * @param job  The current job to adjust.  Make sure the passed job is
+   * carrying all necessary HBase configuration.
+   * @param addDependencyJars upload HBase jars and jars for any of the configured
+   *           job classes via the distributed cache (tmpjars).
+   *
+   * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should
+   * have write permissions to this directory, and this should not be a subdirectory of rootdir.
+   * After the job is finished, restore directory can be deleted.
+   * @throws IOException When setting up the details fails.
+   * @see TableSnapshotInputFormat
+   */
+  public static void initTableSnapshotMapperJob(String snapshotName, Scan scan,
+      Class mapper,
+      Class outputKeyClass,
+      Class outputValueClass, Job job,
+      boolean addDependencyJars, Path tmpRestoreDir)
+  throws IOException {
+    TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir);
+    TableMapReduceUtil.initTableMapperJob(snapshotName, scan, mapper, outputKeyClass,
+        outputValueClass, job, addDependencyJars, false, TableSnapshotInputFormat.class);
+    TableMapReduceUtil.resetCacheConfig(job.getConfiguration());
+  }
+}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java
index 7e59c3bb91..451127edb3 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java
@@ -53,13 +53,13 @@ import java.util.List;
  * The snapshot should not be deleted while there are jobs reading from snapshot files.
  * 

* Usage is similar to TableInputFormat, and - * {@link TableMapReduceUtil#initTableSnapshotMapperJob(String, Scan, Class, Class, Class, Job, + * {@link TableMRUtil#initTableSnapshotMapperJob(String, Scan, Class, Class, Class, Job, * boolean, Path)} * can be used to configure the job. *

{@code
  * Job job = new Job(conf);
  * Scan scan = new Scan();
- * TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName,
+ * TableMRUtil.initTableSnapshotMapperJob(snapshotName,
  *      scan, MyTableMapper.class, MyMapKeyOutput.class,
  *      MyMapOutputValueWritable.class, job, true);
  * }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
index 2f6955ed7f..fe447f4dbc 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
@@ -30,7 +30,6 @@ import org.apache.hadoop.hbase.HDFSBlocksDistribution.HostAndWeight;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
-import org.apache.hadoop.hbase.classification.InterfaceStability;
 import org.apache.hadoop.hbase.client.ClientSideRegionScanner;
 import org.apache.hadoop.hbase.client.IsolationLevel;
 import org.apache.hadoop.hbase.client.Result;
@@ -60,7 +59,6 @@ import java.util.UUID;
  * Hadoop MR API-agnostic implementation for mapreduce over table snapshots.
  */
 @InterfaceAudience.Private
-@InterfaceStability.Evolving
 public class TableSnapshotInputFormatImpl {
   // TODO: Snapshots files are owned in fs by the hbase user. There is no
   // easy way to delegate access.
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java
index 8bb266e15e..5f66620c39 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java
@@ -44,9 +44,10 @@ import org.apache.hadoop.hbase.filter.FilterList;
 import org.apache.hadoop.hbase.filter.PrefixFilter;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
+import org.apache.hadoop.hbase.mapreduce.TableMRUtil;
+import org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat;
 import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
 import org.apache.hadoop.hbase.mapreduce.TableMapper;
-import org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat;
 import org.apache.hadoop.hbase.mapreduce.TableSplit;
 import org.apache.hadoop.hbase.replication.ReplicationException;
 import org.apache.hadoop.hbase.replication.ReplicationFactory;
@@ -440,7 +441,7 @@ public class VerifyReplication extends Configured implements Tool {
       Path snapshotTempPath = new Path(sourceSnapshotTmpDir);
       LOG.info(
         "Using source snapshot-" + sourceSnapshotName + " with temp dir:" + sourceSnapshotTmpDir);
-      TableMapReduceUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,
+      TableMRUtil.initTableSnapshotMapperJob(sourceSnapshotName, scan, Verifier.class, null,
         null, job, true, snapshotTempPath);
     } else {
       TableMapReduceUtil.initTableMapperJob(tableName, scan, Verifier.class, null, null, job);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/ScanPerformanceEvaluation.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/ScanPerformanceEvaluation.java
index e669f14be1..033a1b8409 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/ScanPerformanceEvaluation.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/ScanPerformanceEvaluation.java
@@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.client.TableSnapshotScanner;
 import org.apache.hadoop.hbase.client.metrics.ScanMetrics;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.mapreduce.TableMRUtil;
 import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
 import org.apache.hadoop.hbase.mapreduce.TableMapper;
 import org.apache.hadoop.hbase.util.AbstractHBaseTool;
@@ -340,7 +341,7 @@ public class ScanPerformanceEvaluation extends AbstractHBaseTool {
 
     job.setJarByClass(getClass());
 
-    TableMapReduceUtil.initTableSnapshotMapperJob(
+    TableMRUtil.initTableSnapshotMapperJob(
         this.snapshotName,
         scan,
         MyMapper.class,
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
index b6ad2c9d68..dd1d16d940 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestLoadIncrementalHFiles.java
@@ -50,6 +50,7 @@ import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.io.hfile.HFile;
 import org.apache.hadoop.hbase.io.hfile.HFileScanner;
+import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;
 import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.LoadQueueItem;
 import org.apache.hadoop.hbase.regionserver.BloomType;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
@@ -59,7 +60,6 @@ import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.hbase.util.HFileTestUtil;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.java
index 5e630822b7..4c8ae5c30e 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestTableSnapshotInputFormat.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.hbase.mapreduce;
 
+import static com.sun.corba.se.spi.logging.CORBALogDomains.UTIL;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -145,7 +146,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
     protected void map(ImmutableBytesWritable key, Result value,
         Context context) throws IOException, InterruptedException {
       // Validate a single row coming from the snapshot, and emit the row key
-      verifyRowFromMap(key, value);
+      TableSnapshotInputFormatTestBase.verifyRowFromMap(key, value);
       context.write(key, NullWritable.get());
     }
   }
@@ -174,11 +175,12 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
     String snapshotName = "foo";
 
     try {
-      createTableAndSnapshot(UTIL, tableName, snapshotName, getStartRow(), getEndRow(), 1);
+      TableSnapshotInputFormatTestBase
+          .createTableAndSnapshot(UTIL, tableName, snapshotName, getStartRow(), getEndRow(), 1);
       Job job = new Job(UTIL.getConfiguration());
       Path tmpTableDir = UTIL.getDataTestDirOnTestFS(snapshotName);
 
-      TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName,
+      TableMRUtil.initTableSnapshotMapperJob(snapshotName,
         new Scan(), TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
         NullWritable.class, job, false, tmpTableDir);
 
@@ -202,7 +204,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
   public void testRestoreSnapshotDoesNotCreateBackRefLinksInit(TableName tableName,
       String snapshotName, Path tmpTableDir) throws Exception {
     Job job = new Job(UTIL.getConfiguration());
-    TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName,
+    TableMRUtil.initTableSnapshotMapperJob(snapshotName,
       new Scan(), TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
       NullWritable.class, job, false, tmpTableDir);
   }
@@ -213,14 +215,14 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
     setupCluster();
     final TableName tableName = TableName.valueOf(name.getMethodName());
     try {
-      createTableAndSnapshot(
+      TableSnapshotInputFormatTestBase.createTableAndSnapshot(
         util, tableName, snapshotName, getStartRow(), getEndRow(), numRegions);
 
       Job job = new Job(util.getConfiguration());
       Path tmpTableDir = util.getDataTestDirOnTestFS(snapshotName);
       Scan scan = new Scan(getStartRow(), getEndRow()); // limit the scan
 
-      TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName,
+      TableMRUtil.initTableSnapshotMapperJob(snapshotName,
           scan, TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
           NullWritable.class, job, false, tmpTableDir);
 
@@ -254,12 +256,12 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
         UTIL.deleteTable(tableName);
       }
 
-      UTIL.createTable(tableName, FAMILIES);
+      UTIL.createTable(tableName, TableSnapshotInputFormatTestBase.FAMILIES);
       Admin admin = UTIL.getAdmin();
 
       // put some stuff in the table
       Table table = UTIL.getConnection().getTable(tableName);
-      UTIL.loadTable(table, FAMILIES);
+      UTIL.loadTable(table, TableSnapshotInputFormatTestBase.FAMILIES);
 
       // split to 2 regions
       admin.split(tableName, Bytes.toBytes("eee"));
@@ -268,12 +270,13 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       Path rootDir = FSUtils.getRootDir(UTIL.getConfiguration());
       FileSystem fs = rootDir.getFileSystem(UTIL.getConfiguration());
 
-      SnapshotTestingUtils.createSnapshotAndValidate(admin, tableName, Arrays.asList(FAMILIES),
+      SnapshotTestingUtils.createSnapshotAndValidate(admin, tableName, Arrays.asList(
+          TableSnapshotInputFormatTestBase.FAMILIES),
         null, snapshotName, rootDir, fs, true);
 
       // load different values
       byte[] value = Bytes.toBytes("after_snapshot_value");
-      UTIL.loadTable(table, FAMILIES, value);
+      UTIL.loadTable(table, TableSnapshotInputFormatTestBase.FAMILIES, value);
 
       // cause flush to create new files in the region
       admin.flush(tableName);
@@ -284,7 +287,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       // limit the scan
       Scan scan = new Scan().withStartRow(getStartRow()).withStopRow(getEndRow());
 
-      TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName, scan,
+      TableMRUtil.initTableSnapshotMapperJob(snapshotName, scan,
         TestTableSnapshotMapper.class, ImmutableBytesWritable.class, NullWritable.class, job, false,
         tmpTableDir);
 
@@ -322,7 +325,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       // validate we can read all the data back
       while (rr.nextKeyValue()) {
         byte[] row = rr.getCurrentKey().get();
-        verifyRowFromMap(rr.getCurrentKey(), rr.getCurrentValue());
+        TableSnapshotInputFormatTestBase.verifyRowFromMap(rr.getCurrentKey(), rr.getCurrentValue());
         rowTracker.addRow(row);
       }
 
@@ -349,7 +352,8 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
     LOG.info("testing with MapReduce");
 
     LOG.info("create the table and snapshot");
-    createTableAndSnapshot(util, tableName, snapshotName, startRow, endRow, numRegions);
+    TableSnapshotInputFormatTestBase
+        .createTableAndSnapshot(util, tableName, snapshotName, startRow, endRow, numRegions);
 
     if (shutdownCluster) {
       LOG.info("shutting down hbase cluster.");
@@ -365,7 +369,7 @@ public class TestTableSnapshotInputFormat extends TableSnapshotInputFormatTestBa
       TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),
         TestTableSnapshotInputFormat.class);
 
-      TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName,
+      TableMRUtil.initTableSnapshotMapperJob(snapshotName,
         scan, TestTableSnapshotMapper.class, ImmutableBytesWritable.class,
         NullWritable.class, job, true, tableDir);
 
diff --git a/hbase-spark/src/test/java/org/apache/hadoop/hbase/spark/TestJavaHBaseContext.java b/hbase-spark/src/test/java/org/apache/hadoop/hbase/spark/TestJavaHBaseContext.java
index 93cd939c10..bfacbe8511 100644
--- a/hbase-spark/src/test/java/org/apache/hadoop/hbase/spark/TestJavaHBaseContext.java
+++ b/hbase-spark/src/test/java/org/apache/hadoop/hbase/spark/TestJavaHBaseContext.java
@@ -27,7 +27,6 @@ import java.util.List;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
diff --git a/hbase-spark/src/test/scala/org/apache/hadoop/hbase/spark/BulkLoadSuite.scala b/hbase-spark/src/test/scala/org/apache/hadoop/hbase/spark/BulkLoadSuite.scala
index d2b707e1b4..eab7741320 100644
--- a/hbase-spark/src/test/scala/org/apache/hadoop/hbase/spark/BulkLoadSuite.scala
+++ b/hbase-spark/src/test/scala/org/apache/hadoop/hbase/spark/BulkLoadSuite.scala
@@ -18,13 +18,13 @@
 package org.apache.hadoop.hbase.spark
 
 import org.apache.hadoop.fs.{FileSystem, Path}
-import org.apache.hadoop.hbase.client.{Get, ConnectionFactory}
+import org.apache.hadoop.hbase.client.{ConnectionFactory, Get}
 import org.apache.hadoop.hbase.io.hfile.{CacheConfig, HFile}
 import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles
-import org.apache.hadoop.hbase.{HConstants, CellUtil, HBaseTestingUtility, TableName}
+import org.apache.hadoop.hbase.{CellUtil, HBaseTestingUtility, HConstants, TableName}
 import org.apache.hadoop.hbase.util.Bytes
 import org.apache.hadoop.hbase.spark.HBaseRDDFunctions._
-import org.apache.spark.{SparkContext, Logging}
+import org.apache.spark.{Logging, SparkContext}
 import org.junit.rules.TemporaryFolder
 import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach, FunSuite}
 
diff --git a/pom.xml b/pom.xml
index 5040361f30..95bd742e6d 100755
--- a/pom.xml
+++ b/pom.xml
@@ -61,6 +61,8 @@
   
 
   
+    hbase-mapreduce-util
+    hbase-mapreduce
     hbase-resource-bundle
     hbase-server
     hbase-thrift
@@ -1594,6 +1596,30 @@
         test
       
       
+        hbase-mapreduce-util
+        org.apache.hbase
+        ${project.version}
+      
+      
+        hbase-mapreduce-util
+        org.apache.hbase
+        ${project.version}
+        test-jar
+        test
+      
+      
+        hbase-mapreduce
+        org.apache.hbase
+        ${project.version}
+      
+      
+        hbase-mapreduce
+        org.apache.hbase
+        ${project.version}
+        test-jar
+        test
+      
+      
         hbase-server
         org.apache.hbase
         ${project.version}
diff --git a/src/main/asciidoc/_chapters/mapreduce.adoc b/src/main/asciidoc/_chapters/mapreduce.adoc
index dfa843a95f..3a37f29d1f 100644
--- a/src/main/asciidoc/_chapters/mapreduce.adoc
+++ b/src/main/asciidoc/_chapters/mapreduce.adoc
@@ -126,7 +126,7 @@ Exception in thread "main" java.lang.IllegalAccessError: class
     at
     org.apache.hadoop.hbase.protobuf.ProtobufUtil.toScan(ProtobufUtil.java:818)
     at
-    org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.convertScanToString(TableMapReduceUtil.java:433)
+    TableMRUtil.convertScanToString(TableMapReduceUtil.java:433)
     at
     org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.initTableMapperJob(TableMapReduceUtil.java:186)
     at
@@ -218,7 +218,7 @@ $ ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/hbase-server-VERSION.jar rowcounte
 HBase can be used as a data source, link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableInputFormat.html[TableInputFormat], and data sink, link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.html[TableOutputFormat] or link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.html[MultiTableOutputFormat], for MapReduce jobs.
 Writing MapReduce jobs that read or write HBase, it is advisable to subclass link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapper.html[TableMapper]        and/or link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableReducer.html[TableReducer].
 See the do-nothing pass-through classes link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.html[IdentityTableMapper] and link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.html[IdentityTableReducer] for basic usage.
-For a more involved example, see link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html[RowCounter] or review the `org.apache.hadoop.hbase.mapreduce.TestTableMapReduce` unit test.
+For a more involved example, see link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html[RowCounter] or review the `TestTableMapReduce` unit test.
 
 If you run MapReduce jobs that use HBase as source or sink, need to specify source and sink table and column names in your configuration.
 
diff --git a/src/main/asciidoc/_chapters/ops_mgt.adoc b/src/main/asciidoc/_chapters/ops_mgt.adoc
index 6181b13e34..1da94a51ce 100644
--- a/src/main/asciidoc/_chapters/ops_mgt.adoc
+++ b/src/main/asciidoc/_chapters/ops_mgt.adoc
@@ -387,8 +387,8 @@ The usage is as follows:
 
 ----
 
-$ ./bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --help
-/bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --help
+$ ./bin/hbase CopyTable --help
+/bin/hbase CopyTable --help
 Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] 
 
 Options:
@@ -414,7 +414,7 @@ Args:
 
 Examples:
  To copy 'TestTable' to a cluster that uses replication for a 1 hour window:
- $ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable
+ $ bin/hbase CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable
 
 For performance consider the following general options:
   It is recommended that you set the following to >=100. A higher value uses more memory but
@@ -464,7 +464,7 @@ Import is a utility that will load data that has been exported back into HBase.
 Invoke via:
 
 ----
-$ bin/hbase org.apache.hadoop.hbase.mapreduce.Import  
+$ bin/hbase Import  
 ----
 
 NOTE: To see usage instructions, run the command with no options.
@@ -472,7 +472,7 @@ NOTE: To see usage instructions, run the command with no options.
 To import 0.94 exported files in a 0.96 cluster or onwards, you need to set system property "hbase.import.version" when running the import command as below:
 
 ----
-$ bin/hbase -Dhbase.import.version=0.94 org.apache.hadoop.hbase.mapreduce.Import  
+$ bin/hbase -Dhbase.import.version=0.94 Import  
 ----
 
 [[importtsv]]
@@ -484,14 +484,14 @@ It has two distinct usages: loading data from TSV format in HDFS into HBase via
 To load data via Puts (i.e., non-bulk loading):
 
 ----
-$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c  
+$ bin/hbase ImportTsv -Dimporttsv.columns=a,b,c  
 ----
 
 To generate StoreFiles for bulk-loading:
 
 [source,bourne]
 ----
-$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir  
+$ bin/hbase ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir  
 ----
 
 These generated StoreFiles can be loaded into HBase via <>.
@@ -577,7 +577,7 @@ There are two ways to invoke this utility, with explicit classname and via the d
 
 .Explicit Classname
 ----
-$ bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles  
+$ bin/hbase LoadIncrementalHFiles  
 ----
 
 .Driver
@@ -605,13 +605,13 @@ WALPlayer can also generate HFiles for later bulk importing, in that case only a
 Invoke via:
 
 ----
-$ bin/hbase org.apache.hadoop.hbase.mapreduce.WALPlayer [options]   []>
+$ bin/hbase WALPlayer [options]   []>
 ----
 
 For example:
 
 ----
-$ bin/hbase org.apache.hadoop.hbase.mapreduce.WALPlayer /backuplogdir oldTable1,oldTable2 newTable1,newTable2
+$ bin/hbase WALPlayer /backuplogdir oldTable1,oldTable2 newTable1,newTable2
 ----
 
 WALPlayer, by default, runs as a mapreduce job.
-- 
2.11.1