[ 
https://issues.apache.org/jira/browse/HIVE-30011?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

shml updated HIVE-30011:
------------------------
    Description: 
HIVE-28869 makes Hive append the JDK 17 {{--add-opens}} flags to the JVMs it 
launches itself: Tez AM / containers ({{{}DagUtils{}}}, 
{{{}TezSessionState{}}}), MR AM / tasks ({{{}ExecDriver{}}}) and the WebHCat 
controller ({{{}TempletonControllerJob{}}}). The MR side of that injection 
lives in {{{}ExecDriver.execute(){}}}, but three code paths submit MR jobs 
through {{JobClient}} directly and never go through {{{}ExecDriver{}}}:
|| Path || Trigger || | {{ql/io/merge/MergeFileTask}} | {{ALTER TABLE ... 
CONCATENATE}} with {{hive.execution.engine=mr}} | | 
{{ql/io/rcfile/truncate/ColumnTruncateTask}} | {{TRUNCATE TABLE ... COLUMNS 
(...)}} on RCFile tables | | {{ql/txn/compactor/MRCompactor}} | ACID compaction 
launched by the metastore {{{}Worker{}}}; still the default for full-CRUD 
tables because {{hive.compactor.crud.query.based}} defaults to {{false}} |

None of them touches {{{}mapreduce.map.java.opts{}}}, 
{{mapreduce.reduce.java.opts}} or {{{}yarn.app.mapreduce.am.command-opts{}}}, 
so on a JDK 17 cluster whose {{mapred-site.xml}} does not carry the flags the 
task JVMs fail on the first reflective access into {{{}java.base{}}}.

_Reproduction_ (JDK 17 on both the submitter and the containers, no 
{{--add-opens}} in {{{}mapred-site.xml{}}}):
{code:sql}
 {code}
 SET hive.execution.engine=mr; CREATE TABLE t_orc (id INT, s STRING) STORED AS 
ORC; INSERT INTO t_orc VALUES (1,'a'); INSERT INTO t_orc VALUES (2,'b'); ALTER 
TABLE t_orc CONCATENATE; \{code}

Task attempt log:
{noformat}
 {noformat}
 Error: java.lang.reflect.InaccessibleObjectException: Unable to make field 
private volatile java.lang.String java.net.URI.string accessible: module 
java.base does not "opens java.net" to unnamed module at 
org.apache.hadoop.hive.common.StringInternUtils. at 
org.apache.hadoop.hive.ql.io.HiveInputFormat.init \{noformat}

An {{INSERT ... SELECT}} on the same cluster succeeds because {{ExecDriver}} 
injects the flags.

{_}Why CI does not catch it{_}: the MiniMR / qtest drivers run tasks in the 
local job runner inside the test JVM, where the {{*.java.opts}} keys are 
ignored and the surefire {{argLine}} already opens the packages. Only a real 
YARN submission exercises the container command line.

{_}Proposed fix{_}: move the injection into a shared helper and call it from 
every MR submission path.
{code:java}
 {code}
 // org.apache.hadoop.hive.common.JavaVersionUtils public static void 
addOpensFlags(Configuration job) { String addOpens = getAddOpensFlags(); for 
(String key : new String[] 

{"mapreduce.map.java.opts", "mapreduce.reduce.java.opts", 
"yarn.app.mapreduce.am.command-opts"}

) \{ String current = job.get(key); job.set(key, (current == null ? "" : 
current) + addOpens); } } \{code}
 * {{ExecDriver}} calls the helper instead of its private {{addOpensFlags}} / 
{{{}addJavaOpts{}}}.
 * {{{}MergeFileTask.execute{}}}, {{ColumnTruncateTask.execute}} and 
{{MRCompactor.launchCompactionJob}} call it right before {{{}new 
JobClient(job){}}}.
 * Append semantics are kept, so cluster / user {{java.opts}} such as heap 
sizes survive. String-literal keys keep {{hive-common}} free of a 
{{hadoop-mapreduce-client-core}} dependency, as {{ExecDriver}} already does 
today.
 * Unit test in {{{}TestJavaVersionUtils{}}}: an existing {{-Xmx}} value is 
preserved and all three keys end with the flag set.

Not in scope: {{MapredLocalTask}} (map-join local task) inherits 
{{HADOOP_CLIENT_OPTS}} from the parent process, which 
{{bin/ext/hiveserver2.sh}} already exports since HIVE-26473.

{_}Verification{_}: an equivalent patch on a 3.1.x-based build was run on a 
3-node YARN cluster (Hadoop 3.4.3, JDK 17.0.20 on submitter and containers, 
cluster-side {{--add-opens}} removed). Before the patch {{ALTER TABLE ... 
CONCATENATE}} failed as above; after it the AM and task {{launch_container.sh}} 
of the merge job, the RCFile column-truncate job and the metastore-launched 
major compaction all carry the flag set and the jobs succeed.

  was:
HIVE-28869 makes Hive append the JDK 17 \{{--add-opens}} flags to the JVMs it 
launches itself: Tez AM / containers (\{{DagUtils}}, \{{TezSessionState}}), MR 
AM / tasks (\{{ExecDriver}}) and the WebHCat controller 
(\{{TempletonControllerJob}}). The MR side of that injection lives in 
\{{ExecDriver.execute()}}, but three code paths submit MR jobs through 
\{{JobClient}} directly and never go through \{{ExecDriver}}:

|| Path || Trigger || | \{{ql/io/merge/MergeFileTask}} | \{{ALTER TABLE ... 
CONCATENATE}} with \{{hive.execution.engine=mr}} | | 
\{{ql/io/rcfile/truncate/ColumnTruncateTask}} | \{{TRUNCATE TABLE ... COLUMNS 
(...)}} on RCFile tables | | \{{ql/txn/compactor/MRCompactor}} | ACID 
compaction launched by the metastore \{{Worker}}; still the default for 
full-CRUD tables because \{{hive.compactor.crud.query.based}} defaults to 
\{{false}} |

None of them touches \{{mapreduce.map.java.opts}}, 
\{{mapreduce.reduce.java.opts}} or \{{yarn.app.mapreduce.am.command-opts}}, so 
on a JDK 17 cluster whose \{{mapred-site.xml}} does not carry the flags the 
task JVMs fail on the first reflective access into \{{java.base}}.

_Reproduction_ (JDK 17 on both the submitter and the containers, no 
\{{--add-opens}} in \{{mapred-site.xml}}):

{code:sql} SET hive.execution.engine=mr; CREATE TABLE t_orc (id INT, s STRING) 
STORED AS ORC; INSERT INTO t_orc VALUES (1,'a'); INSERT INTO t_orc VALUES 
(2,'b'); ALTER TABLE t_orc CONCATENATE; \{code}

Task attempt log:

{noformat} Error: java.lang.reflect.InaccessibleObjectException: Unable to make 
field private volatile java.lang.String java.net.URI.string accessible: module 
java.base does not "opens java.net" to unnamed module at 
org.apache.hadoop.hive.common.StringInternUtils. at 
org.apache.hadoop.hive.ql.io.HiveInputFormat.init \{noformat}

An \{{INSERT ... SELECT}} on the same cluster succeeds because \{{ExecDriver}} 
injects the flags.

{_}Why CI does not catch it{_}: the MiniMR / qtest drivers run tasks in the 
local job runner inside the test JVM, where the \{{*.java.opts}} keys are 
ignored and the surefire \{{argLine}} already opens the packages. Only a real 
YARN submission exercises the container command line.

{_}Proposed fix{_}: move the injection into a shared helper and call it from 
every MR submission path.

{code:java} // org.apache.hadoop.hive.common.JavaVersionUtils public static 
void addOpensFlags(Configuration job) \{ String addOpens = getAddOpensFlags(); 
for (String key : new String[] {"mapreduce.map.java.opts", 
"mapreduce.reduce.java.opts", "yarn.app.mapreduce.am.command-opts"}) \{ String 
current = job.get(key); job.set(key, (current == null ? "" : current) + 
addOpens); } } \{code}
 * {\{ExecDriver}} calls the helper instead of its private \{{addOpensFlags}} / 
\{{addJavaOpts}}.
 * {\{MergeFileTask.execute}}, \{{ColumnTruncateTask.execute}} and 
\{{MRCompactor.launchCompactionJob}} call it right before \{{new 
JobClient(job)}}.
 * Append semantics are kept, so cluster / user \{{java.opts}} such as heap 
sizes survive. String-literal keys keep \{{hive-common}} free of a 
\{{hadoop-mapreduce-client-core}} dependency, as \{{ExecDriver}} already does 
today.
 * Unit test in \{{TestJavaVersionUtils}}: an existing \{{-Xmx}} value is 
preserved and all three keys end with the flag set.

Not in scope: \{{MapredLocalTask}} (map-join local task) inherits 
\{{HADOOP_CLIENT_OPTS}} from the parent process, which 
\{{bin/ext/hiveserver2.sh}} already exports since HIVE-26473.

{_}Verification{_}: an equivalent patch on a 3.1.x-based build was run on a 
3-node YARN cluster (Hadoop 3.4.3, JDK 17.0.20 on submitter and containers, 
cluster-side \{{--add-opens}} removed). Before the patch \{{ALTER TABLE ... 
CONCATENATE}} failed as above; after it the AM and task 
\{{launch_container.sh}} of the merge job, the RCFile column-truncate job and 
the metastore-launched major compaction all carry the flag set and the jobs 
succeed.


> MR jobs submitted outside ExecDriver (MergeFileTask, ColumnTruncateTask, 
> MRCompactor) miss the JDK 17 --add-opens flags
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: HIVE-30011
>                 URL: https://issues.apache.org/jira/browse/HIVE-30011
>             Project: Hive
>          Issue Type: Bug
>          Components: Query Processor, Transactions
>    Affects Versions: 4.1.0
>            Reporter: shml
>            Priority: Major
>
> HIVE-28869 makes Hive append the JDK 17 {{--add-opens}} flags to the JVMs it 
> launches itself: Tez AM / containers ({{{}DagUtils{}}}, 
> {{{}TezSessionState{}}}), MR AM / tasks ({{{}ExecDriver{}}}) and the WebHCat 
> controller ({{{}TempletonControllerJob{}}}). The MR side of that injection 
> lives in {{{}ExecDriver.execute(){}}}, but three code paths submit MR jobs 
> through {{JobClient}} directly and never go through {{{}ExecDriver{}}}:
> || Path || Trigger || | {{ql/io/merge/MergeFileTask}} | {{ALTER TABLE ... 
> CONCATENATE}} with {{hive.execution.engine=mr}} | | 
> {{ql/io/rcfile/truncate/ColumnTruncateTask}} | {{TRUNCATE TABLE ... COLUMNS 
> (...)}} on RCFile tables | | {{ql/txn/compactor/MRCompactor}} | ACID 
> compaction launched by the metastore {{{}Worker{}}}; still the default for 
> full-CRUD tables because {{hive.compactor.crud.query.based}} defaults to 
> {{false}} |
> None of them touches {{{}mapreduce.map.java.opts{}}}, 
> {{mapreduce.reduce.java.opts}} or {{{}yarn.app.mapreduce.am.command-opts{}}}, 
> so on a JDK 17 cluster whose {{mapred-site.xml}} does not carry the flags the 
> task JVMs fail on the first reflective access into {{{}java.base{}}}.
> _Reproduction_ (JDK 17 on both the submitter and the containers, no 
> {{--add-opens}} in {{{}mapred-site.xml{}}}):
> {code:sql}
>  {code}
>  SET hive.execution.engine=mr; CREATE TABLE t_orc (id INT, s STRING) STORED 
> AS ORC; INSERT INTO t_orc VALUES (1,'a'); INSERT INTO t_orc VALUES (2,'b'); 
> ALTER TABLE t_orc CONCATENATE; \{code}
> Task attempt log:
> {noformat}
>  {noformat}
>  Error: java.lang.reflect.InaccessibleObjectException: Unable to make field 
> private volatile java.lang.String java.net.URI.string accessible: module 
> java.base does not "opens java.net" to unnamed module at 
> org.apache.hadoop.hive.common.StringInternUtils. at 
> org.apache.hadoop.hive.ql.io.HiveInputFormat.init \{noformat}
> An {{INSERT ... SELECT}} on the same cluster succeeds because {{ExecDriver}} 
> injects the flags.
> {_}Why CI does not catch it{_}: the MiniMR / qtest drivers run tasks in the 
> local job runner inside the test JVM, where the {{*.java.opts}} keys are 
> ignored and the surefire {{argLine}} already opens the packages. Only a real 
> YARN submission exercises the container command line.
> {_}Proposed fix{_}: move the injection into a shared helper and call it from 
> every MR submission path.
> {code:java}
>  {code}
>  // org.apache.hadoop.hive.common.JavaVersionUtils public static void 
> addOpensFlags(Configuration job) { String addOpens = getAddOpensFlags(); for 
> (String key : new String[] 
> {"mapreduce.map.java.opts", "mapreduce.reduce.java.opts", 
> "yarn.app.mapreduce.am.command-opts"}
> ) \{ String current = job.get(key); job.set(key, (current == null ? "" : 
> current) + addOpens); } } \{code}
>  * {{ExecDriver}} calls the helper instead of its private {{addOpensFlags}} / 
> {{{}addJavaOpts{}}}.
>  * {{{}MergeFileTask.execute{}}}, {{ColumnTruncateTask.execute}} and 
> {{MRCompactor.launchCompactionJob}} call it right before {{{}new 
> JobClient(job){}}}.
>  * Append semantics are kept, so cluster / user {{java.opts}} such as heap 
> sizes survive. String-literal keys keep {{hive-common}} free of a 
> {{hadoop-mapreduce-client-core}} dependency, as {{ExecDriver}} already does 
> today.
>  * Unit test in {{{}TestJavaVersionUtils{}}}: an existing {{-Xmx}} value is 
> preserved and all three keys end with the flag set.
> Not in scope: {{MapredLocalTask}} (map-join local task) inherits 
> {{HADOOP_CLIENT_OPTS}} from the parent process, which 
> {{bin/ext/hiveserver2.sh}} already exports since HIVE-26473.
> {_}Verification{_}: an equivalent patch on a 3.1.x-based build was run on a 
> 3-node YARN cluster (Hadoop 3.4.3, JDK 17.0.20 on submitter and containers, 
> cluster-side {{--add-opens}} removed). Before the patch {{ALTER TABLE ... 
> CONCATENATE}} failed as above; after it the AM and task 
> {{launch_container.sh}} of the merge job, the RCFile column-truncate job and 
> the metastore-launched major compaction all carry the flag set and the jobs 
> succeed.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to