Hello,
Using a portion of exported production data we have attempted to add secondary
indexes in our testing environment. (This question is not related to my
previous question in the mailing list which used a different dataset).
The primary row-key in HBase is a 30-byte binary value: 1 Byte for salting, 8
Bytes - timestamp (Long), 20 Bytes - hash result of other record fields. + 1
extra byte for unknown issue about updating schema in future.
Generating the indexes asynchronously we hit the following error:
19/07/17 18:11:07 INFO mapreduce.Job: Task Id :
attempt_1562553170901_0491_m_000007_2, Status : FAILED
Error: java.lang.RuntimeException: java.sql.SQLException: ERROR 218 (23018):
Constraint violation. STATISTICS_HOUR_INDEX.:PK may not be null
at
org.apache.phoenix.mapreduce.index.PhoenixIndexImportMapper.map(PhoenixIndexImportMapper.java:122)
at
org.apache.phoenix.mapreduce.index.PhoenixIndexImportMapper.map(PhoenixIndexImportMapper.java:48)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
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:1693)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.sql.SQLException: ERROR 218 (23018): Constraint violation.
STATISTICS_HOUR_INDEX.:PK may not be null
at
org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:422)
at
org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:145)
at
org.apache.phoenix.schema.ConstraintViolationException.<init>(ConstraintViolationException.java:39)
at org.apache.phoenix.schema.PTableImpl.newKey(PTableImpl.java:618)
at
org.apache.phoenix.compile.UpsertCompiler.setValues(UpsertCompiler.java:137)
at
org.apache.phoenix.compile.UpsertCompiler.access$500(UpsertCompiler.java:106)
at
org.apache.phoenix.compile.UpsertCompiler$3.execute(UpsertCompiler.java:917)
at
org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:338)
at
org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:326)
at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
at
org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:324)
at
org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:245)
at
org.apache.phoenix.jdbc.PhoenixPreparedStatement.execute(PhoenixPreparedStatement.java:172)
at
org.apache.phoenix.jdbc.PhoenixPreparedStatement.execute(PhoenixPreparedStatement.java:177)
at
org.apache.phoenix.mapreduce.index.PhoenixIndexImportMapper.map(PhoenixIndexImportMapper.java:101)
... 9 more
Correct me if I’m wrong; my understanding is that :PK (in the index table)
would be the same as the PK from the main table, such that other columns in the
original table at that row can easily be read when querying the index table?
However there are no rows in the main table where PK is null (is it even
possible?), therefore it’s very strange that it is telling us that the :PK is
null somewhere. Is my understanding incorrect, or could there be something else
causing this issue?
Phoenix: 4.7.0 (CLABS_PHOENIX)
HBase: 1.2.0-cdh5.7.6
Thanks