This is an automated email from the ASF dual-hosted git repository. zhangduo pushed a commit to branch branch-2.4 in repository https://gitbox.apache.org/repos/asf/hbase.git
commit fd4a1c638378b92f281b8c8a1278bc3a9d54b19b Author: guluo <[email protected]> AuthorDate: Sun May 21 19:47:27 2023 +0800 HBASE-27848:Should fast-fail if unmatched column family exists when using ImportTsv (#5225) Signed-off-by: Duo Zhang <[email protected]> (cherry picked from commit ce29f97a809a849bf067fa3571fd775fb596fc10) --- .../apache/hadoop/hbase/mapreduce/ImportTsv.java | 17 +++++++++++++++++ .../hadoop/hbase/mapreduce/TestImportTsv.java | 22 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java index 2c1a2ddae24..3318dd3cc11 100644 --- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java +++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/ImportTsv.java @@ -45,6 +45,7 @@ import org.apache.hadoop.hbase.client.RegionLocator; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; +import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.io.Text; @@ -553,6 +554,22 @@ public class ImportTsv extends Configured implements Tool { LOG.error(errorMsg); throw new TableNotFoundException(errorMsg); } + try (Table table = connection.getTable(tableName)) { + ArrayList<String> unmatchedFamilies = new ArrayList<>(); + Set<String> cfSet = getColumnFamilies(columns); + TableDescriptor tDesc = table.getDescriptor(); + for (String cf : cfSet) { + if (!tDesc.hasColumnFamily(Bytes.toBytes(cf))) { + unmatchedFamilies.add(cf); + } + } + if (unmatchedFamilies.size() > 0) { + String noSuchColumnFamiliesMsg = + format("Column families: %s do not exist.", unmatchedFamilies); + LOG.error(noSuchColumnFamiliesMsg); + throw new NoSuchColumnFamilyException(noSuchColumnFamiliesMsg); + } + } if (mapperClass.equals(TsvImporterTextMapper.class)) { usage(TsvImporterTextMapper.class.toString() + " should not be used for non bulkloading case. use " diff --git a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java index 43516f20e84..374f444a711 100644 --- a/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java +++ b/hbase-mapreduce/src/test/java/org/apache/hadoop/hbase/mapreduce/TestImportTsv.java @@ -51,6 +51,7 @@ import org.apache.hadoop.hbase.client.Table; 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.regionserver.NoSuchColumnFamilyException; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.testclassification.VerySlowMapReduceTests; import org.apache.hadoop.hbase.util.Bytes; @@ -241,6 +242,27 @@ public class TestImportTsv implements Configurable { }, args)); } + @Test + public void testMRNoMatchedColumnFamily() throws Exception { + util.createTable(tn, FAMILY); + + String[] args = new String[] { + "-D" + ImportTsv.COLUMNS_CONF_KEY + + "=HBASE_ROW_KEY,FAM:A,FAM01_ERROR:A,FAM01_ERROR:B,FAM02_ERROR:C", + tn.getNameAsString(), "/inputFile" }; + exception.expect(NoSuchColumnFamilyException.class); + assertEquals("running test job configuration failed.", 0, + ToolRunner.run(new Configuration(util.getConfiguration()), new ImportTsv() { + @Override + public int run(String[] args) throws Exception { + createSubmittableJob(getConf(), args); + return 0; + } + }, args)); + + util.deleteTable(tn); + } + @Test public void testMRWithoutAnExistingTable() throws Exception { String[] args = new String[] { tn.getNameAsString(), "/inputFile" };
