У меня кластер Cloudera CDH 5.14.2 с установленной Apache Phoenix Parcel (APACHE_PHOENIX-4.14.0-cdh5.14.2.p0.3
).
У меня есть таблица, содержащая вторичный индекс, и я хотел бы заполнить этот индекс, используя IndexTool
, поставляемый с Apache Phoenix. Но это дает мне следующую ошибку:
19/01/02 13:58:10 INFO mapreduce.Job: The url to track the job: http://mor-master-01.triviadata.local:8088/proxy/application_1546422102410_0020/
19/01/02 13:58:10 INFO mapreduce.Job: Running job: job_1546422102410_0020
19/01/02 13:58:18 INFO mapreduce.Job: Job job_1546422102410_0020 running in uber mode : false
19/01/02 13:58:18 INFO mapreduce.Job: map 0% reduce 0%
19/01/02 13:58:22 INFO mapreduce.Job: Task Id : attempt_1546422102410_0020_m_000000_0, Status : FAILED
Error: java.lang.ClassNotFoundException: org.apache.tephra.TransactionSystemClient
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.phoenix.transaction.TransactionFactory$Provider.<clinit>(TransactionFactory.java:27)
at org.apache.phoenix.query.QueryServicesOptions.<clinit>(QueryServicesOptions.java:270)
at org.apache.phoenix.query.QueryServicesImpl.<init>(QueryServicesImpl.java:36)
at org.apache.phoenix.jdbc.PhoenixDriver.getQueryServices(PhoenixDriver.java:197)
at org.apache.phoenix.jdbc.PhoenixDriver.getConnectionQueryServices(PhoenixDriver.java:235)
at org.apache.phoenix.jdbc.PhoenixEmbeddedDriver.createConnection(PhoenixEmbeddedDriver.java:150)
at org.apache.phoenix.jdbc.PhoenixDriver.connect(PhoenixDriver.java:221)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at org.apache.phoenix.mapreduce.util.ConnectionUtil.getConnection(ConnectionUtil.java:113)
at org.apache.phoenix.mapreduce.util.ConnectionUtil.getInputConnection(ConnectionUtil.java:58)
at org.apache.phoenix.mapreduce.PhoenixInputFormat.getQueryPlan(PhoenixInputFormat.java:180)
at org.apache.phoenix.mapreduce.PhoenixInputFormat.createRecordReader(PhoenixInputFormat.java:76)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.<init>(MapTask.java:521)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Когда я проверяю свой HBASE_CLASSPATH
с помощью команды ${HBASE_HOME}/bin/hbase classpath
, я вижу, что он содержит следующие банки:
/opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/conf
/usr/java/latest/lib/tools.jar
/opt/cloudera/parcels/CDH-5.14.2-1.cdh5.14.2.p0.3/lib/*.jar
/etc/hadoop/conf
$HBASE_HOME/lib/hadoop/lib/*
$HBASE_HOME/lib/hadoop/.//*
$HBASE_HOME/lib/hadoop-hdfs/./
$HBASE_HOME/hadoop-hdfs/lib/*
$HBASE_HOME/hadoop-hdfs/.//*
$HBASE_HOME/hadoop-yarn/lib/*
$HBASE_HOME/hadoop-yarn/.//*
/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/lib/*
/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/.//*
/etc/hadoop/conf
$HBASE_HOME/lib/hadoop/*
$HBASE_HOME/lib/hadoop/lib/*
$HBASE_HOME/lib/zookeeper/*
$HBASE_HOME/lib/zookeeper/lib/*
$HBASE_HOME/jars/hbase-common-1.2.0-cdh5.14.2.jar
$HBASE_HOME/jars/hbase-client-1.2.0-cdh5.14.2.jar
$HBASE_HOME/jars/hbase-hadoop-compat-1.2.0-cdh5.14.2.jar
$HBASE_HOME/jars/htrace-core-3.0.4.jar
$HBASE_HOME/jars/htrace-core-3.2.0-incubating.jar
$HBASE_HOME/jars/htrace-core4-4.0.1-incubating.jar
$HBASE_HOME/jars/hbase-protocol-1.2.0-cdh5.14.2.jar
$HBASE_HOME/jars/hbase-server-1.2.0-cdh5.14.2.jar
$HBASE_HOME/jars/metrics-core-2.2.0.jar
$HBASE_HOME/jars/metrics-core-3.1.2.jar
$PHOENIX_HOME/lib/phoenix/lib/tephra-hbase-compat-1.2-cdh-0.14.0-incubating.jar
$PHOENIX_HOME/lib/phoenix/lib/tephra-api-0.14.0-incubating.jar
$PHOENIX_HOME/lib/phoenix/lib/tephra-core-0.14.0-incubating.jar
$PHOENIX_HOME/lib/phoenix/lib/phoenix-core-4.14.0-cdh5.14.2.jar
$PHOENIX_HOME/lib/phoenix/lib/twill-zookeeper-0.8.0.jar
$PHOENIX_HOME/lib/phoenix/lib/twill-discovery-api-0.8.0.jar
$PHOENIX_HOME/lib/phoenix/lib/twill-discovery-core-0.8.0.jar
$PHOENIX_HOME/lib/phoenix/lib/joda-time-1.6.jar
$PHOENIX_HOME/lib/phoenix/lib/antlr-runtime-3.5.2.jar
Когда я проверяю исходный код и его зависимости, я вижу, что отсутствующий класс является частью $PHOENIX_HOME/lib/phoenix/lib/tephra-core-0.14.0-incubating.jar
Когда я собираю содержимое этого JAR-файла для отсутствующего класса, я вижу, что он там есть:
# jar tf $PHOENIX_HOME/lib/phoenix/lib/tephra-core-0.14.0-incubating.jar | grep TransactionSystemClient
org/apache/tephra/TransactionSystemClient.class
У вас есть идея, почему работа MR не может найти этот конкретный класс?
Если это поможет, моя таблица со вторичным индексом определяется следующим образом:
0: jdbc:phoenix:localhost:2181/hbase> create table t1(v1 varchar, v2 varchar, v3 integer constraint primary_key primary key(v1)) immutable_rows=true, compression='SNAPPY';
1: jdbc:phoenix:localhost:2181/hbase> create index glb_idx on t1(v2) async;
И я запускаю IndexTool
с помощью команды
${HBASE_HOME}/bin/hbase org.apache.phoenix.mapreduce.index.IndexTool -dt T1 -it GLB_IDX -op /tmp
Когда я создаю индекс синхронно и добавляю некоторые данные в таблицу, индекс заполняется правильно, поэтому конфигурация вторичного индекса Phoenix выглядит нормально.