Spark HDFS_DELEGATION_TOKEN не может быть найден в кеше

I am running simplest Driver alone long running job to reproduce this error
Hadoop Version        2.7.3.2.6.5.0-292 
Spark-core version    2_11.2.3.0.2.6.5.0-292

Code:
FileSystem fs = tmpPath.getFileSystem(sc.hadoopConfiguration())
log.info("Path {} is ",path,fs.exists(tmpPath);

Поведение: Мое задание выполняется без проблем в течение ~ 17-18 часов. После этого новые ключи выпускаются как часть HadoopFSDelagationTokenProvider, и задание продолжает выполняться с вновь выпущенными делегированными токенами. Но в течение следующего 1 часа после обновления токена делегирования задание завершается с ошибкой. токен не может быть найден в кеше. Я пошел дальше и программно сгенерировал свой собственный токен dfs.adddelegationtoken для задействованных узлов имен, и я вижу такое же поведение.

Вопрос:

  1. Какова вероятность того, что токен делегирования будет удален с сервера и какие свойства контролируют это?
  2. Какие журналы на стороне сервера показывают, что этот токен собирается удалить или удалить из кеша.
Path /test/abc.parquet is true
Path /test/abc.parquet is true
INFO Successfully logged into KDC
INFO getting token for DFS[DFSClient][clientName=DFSClient_NONMAPREDUCE_2324234_29,[email protected](auth:KERBEROS)](org.apache.spark.deploy.security.HadoopFSDelagationTokenProvider)
INFO Created HDFS_DELEGATION_TOKEN token 31615466 for qa_user on ha:hdfs:hacluster
INFO getting token for DFS[DFSClient][clientName=DFSClient_NONMAPREDUCE_2324234_29,[email protected](auth:KERBEROS)](org.apache.spark.deploy.security.HadoopFSDelagationTokenProvider)
INFO Created HDFS_DELEGATION_TOKEN token 31615467 for qa_user on ha:hdfs:hacluster
INFO writing out delegation tokens to hdfs://abc/user/qa/.sparkstaging/application_121212.....tmp
INFO delegation tokens written out successfully, renaming file to hdfs://.....
INFO delegation token file rename complete(org.apache.spark.deploy.yarn.security.AMCredentialRenewer)
Scheduling login from keytab in 64799125 millis
Path /test/abc.parquet is true
Path /test/abc.parquet is true

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.token.SecretManager$InvalidToken): token (HDFS_DELEGATION_TOKEN token 31615466 for qa_user) can't be found in cache
 at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1554)
 at org.apache.hadoop.ipc.Client.call(Client.java:1498)
 at org.apache.hadoop.ipc.Client.call(Client.java:1398)
 at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:233)
 at com.sun.proxy.$Proxy13.getListing(Unknown Source)
 at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getListing(ClientNamenodeProtocolTranslatorPB.java:620)
 at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
FYI submitted in yarn-cluster-mode with:
--keytab /path/to/the/headless-keytab,
--principal principalNameAsPerTheKeytab 
--conf spark.hadoop.fs.hdfs.impl.disable.cache=true
Note that Token renewer is issuing new keys and new keys are working too, But it;s somehow gets revoked from server, AM logs doesn't have any clue on the same.

person rbyndoor    schedule 27.09.2020    source источник
comment
Есть много других вопросов, но ни один из них не имеет надлежащих ответов. Дайте мне знать, если вам нужны какие-либо подробности.   -  person rbyndoor    schedule 27.09.2020


Ответы (1)


Отвечая на мой собственный вопрос:

Отсюда можно сделать пару очень важных моментов.

  1. Токен делегирования — это единственная копия, хранящаяся в UserGroupInformation.getCredentials.getAllTokens(). Она может обновляться любым другим потоком, работающим в JVM сохранения. Моя проблема была устранена путем установки mapreduce.job.complete.cancel.delegation.tokens=false для всех других заданий, работающих в тех же контекстах, особенно для тех, которые запускают контексты MAPREDUCE.
  2. HadoopFSDelagationTokenProvider должен обновлять ключи для каждого (fraction*renewal time), то есть по умолчанию 0.75*24 hrs, если вы отправили задание с --keytab и --principal
  3. Убедитесь, что вы установили fs.disable.cache для файловой системы hdfs, т.е. каждый раз, когда вы получаете новый объект файловой системы, это дорогостоящая операция, но вы точно получаете свежий fsObject с новыми ключами, а не получаете его из CACHE.get(fsname).

В случае, если ничего не работает, вы можете создать свои собственные токены делегирования, вызвав с помощью new Credentials() https://hadoop.apache.org/docs/r2.8.2/hadoop-project-dist/hadoop-common/api/org/apache/hadoop/fs/FileSystem.html#addDelegationTokens(java.lang.String,%20org.apache.hadoop.security.Credentials) но этот метод должен вызываться с kerberosUGI.doAS({});

person rbyndoor    schedule 29.09.2020