FAQ-离线开发-shell节点提交spark-submit任务,运行超48小时后报错

问题描述/异常栈
shell节点内通过spark-submit提交jar包运行,任务运行超过48小时后报错:
DIGEST-MD5: IO error acquiring password
FAQ-离线开发-shell节点提交spark-submit任务,运行超48小时后报错 - 图1
FAQ-离线开发-shell节点提交spark-submit任务,运行超48小时后报错 - 图2
发现版本
所有版本
解决方案
通过shell节点提交spark-submit任务时,手动指定keytab路径及pricipal。eg:
${HADOOP_CONF_V3}/spark-submit \
   --principal=${PRINCIPAL} \     --通过变量,手动指定principal
   --keytab=${KEYTAB_FILE} \      --通过变量,手动指定keytab
   --master yarn \
   --deploy-mode cluster \
   --num-executors ${num_executors} \
   --executor-memory 12G \
   --executor-cores ${executor_cores} \
   --driver-memory 4G \
   --queue ${QUEUE_NAME} \
   --archives ${LIB_PATH}/python310-env.tar.gz#environment \
   --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./environment/bin/python \
   --conf spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python \
   --conf spark.yarn.appMasterEnv.ENV_TYPE=$ENV_TYPE \
   --conf spark.yarn.appMasterEnv.HIVE_TABLE_LOCATION_DIR=$HIVE_TABLE_LOCATION_DIR \
   --files ${ROOT_PATH}/log4j2.properties \
   --conf "spark.driver.extraJavaOptions=-Dlog4j.configurationFile=log4j2.properties" \
   --conf "spark.executor.extraJavaOptions=-Dlog4j.configurationFile=log4j2.properties" \
   --conf spark.dynamicAllocation.enabled=false \
   --conf spark.default.parallelism=100 \
   --conf spark.network.timeout=800s \
   --conf spark.sql.autoBroadcastJoinThreshold=-1 \
   --conf spark.executor.memoryOverhead=10g \
   --conf spark.driver.memoryOverhead=4g \
   --conf spark.hadoop.hive.metastore.client.socket.timeout=864000s \
   --py-files ${ROOT_PATH}/src.zip \
   ${ROOT_PATH}/src/offline/business/patent/claims_instruction_translation.py \
      --db_name ${HIVE_DB_NAME} --from_tbl_name ${FROM_TBL_NAME} --primary_col out_num_ipph \
      --other_cols claims,instruction --dt ${dt} --nums_per_group 50000 --num_partitions ${num_partitions} \
      --num_thread ${num_thread} --max_retry 1
问题原因
1、直接通过shell节点提交spark-submit任务,spark任务使用的Kerberos票据为平台shell节点自动kinit的票据,48小时后会过期,导致上述报错;
2、而spark-submit支持直接指定keytab,这样keytab随Spark Driver分发,long running 作业在 token 过期后可以拿keytab刷token续命;
3、但同时为防止spark-submit指定的keytab会与shell节点自动kinit的票据产生冲突,因此spark-submit任务在指定keytab时可通过变量获取平台shell节点kinit的同一pricipal和keytab,可避免票据冲突情况;

作者:曹俊