рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпрд╛ рд╣реИ?

рд╣рдорд╛рд░реА рдХрд╣рд╛рдиреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рдо рд╕реЗ рд╢реБрд░реВ рд╣реБрдИ рдереАред рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдФрд░ рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдЙрдкрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╣ рдХрд╛рд░реНрдп рд╣рдореЗрдВ рдЦреБрджрд░рд╛ рдЬреЛрдЦрд┐рдо рдФрд░ CRM рдкреНрд░рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреА рдПрдХрд╛рдЧреНрд░рддрд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рд╣реИред рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдПрдХ рд╕рд░рд▓ рдЗрдЪреНрдЫрд╛ рдереА - рдкрд╛рдпрдерди рдХреЛрдб рд▓рд┐рдЦрдирд╛, рдЙрдиреНрдирдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (xgboost, pytorch, рдЯреЗрдВрд╕реЛрд░рдлрд╝реНрд▓реЛ, рдЖрджрд┐) рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдФрд░ hdfs рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ рдЙрдард╛рдП рдЧрдП рдбреЗрдЯрд╛ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓рд╛рдирд╛ред



рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рдиреБрдХрд╕рд╛рди рдереЗ рдХрд┐ рд╣рдордиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЧреАрдерд╣рдм рдкрд░ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реЛрд░реНрд╕ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╡рд░рдг:

  • рдПрдЪрдбреАрдПрдлрдПрд╕ рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ (12 рдУрд░реЗрдХрд▓ рдмрд┐рдЧ рдбреЗрдЯрд╛ рдЙрдкрдХрд░рдг рдиреЛрдбреНрд╕, рдХреНрд▓рд╛рдЙрдбрд╕ рд╡рд┐рддрд░рдг)ред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╕реНрдЯреЛрд░рд╣рд╛рдЙрд╕ рдореЗрдВ рдмреИрдВрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рд╕реЗ 130 рдЯреАрдмреА рдбреЗрдЯрд╛ рд╣реИ; рдмрд╛рд╣рд░реА рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╡рд┐рд╖рдо рдЬрд╛рдирдХрд╛рд░реА рднреА рд╣реИред
  • рджреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдЬрд┐рд╕ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рддреИрдирд╛рддреА рдЪрд╛рд╣рд┐рдП рдереАред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрди рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рди рдХреЗрд╡рд▓ рдЙрдиреНрдирдд рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХрд╛рд░реНрдп "рд╕реНрдкрд┐рди" рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ, рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░рд╛рдЗрдЬреЗрд╢рди рдЯреВрд▓ (рдбреЛрдХрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдерд╛ред

рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреБрдкрд┐рдЯрд░рд╣рдм рдХреЛ рдЪреБрдирдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдирдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдФрд░ рдкрдврд╝реЗрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреБрдкрд┐рдЯрд░рд▓реИрдм рдХреА рдХрд▓реНрдкрдирд╛ рдХреА рдереАред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ рдкрд╛рдпрдерди + рдПрдирд╛рдХреЛрдВрдбрд╛ + рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓реЗрдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдкрд░ рдЬреНрдпреВрдкрд┐рдЯрд░ рд╣рдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдПрд▓рдбреАрдПрдкреА рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░реЗрдВ, рд╕реНрдкрд╛рд░реНрдХ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдПрдЪрдбреАрдПрдлрдПрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ - рдореЙрдбрд▓ рдмрдирд╛рдПрдВ!
рдпрджрд┐ рдЖрдк рд╕рднреА рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рджреЗрд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ:

  • рдбреЙрдХрдЯрд░ рдореЗрдВ рдЬрдпреБрдкрд░рд╣рдм (рдмреЗрд╕ рдУрдПрд╕ - рдУрд░реЗрдХрд▓ рд▓рд┐рдирдХреНрд╕ 7) рдЪрд▓рд╛рдирд╛
  • рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ Kerberos рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде Cloudera CDH рдХреНрд▓рд╕реНрдЯрд░ 5.15.1 + рд╕реНрдкрд╛рд░реНрдХ 2.3.0 + рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рдорд░реНрдкрд┐рдд MIT Kerberos ( рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╕реНрдЯрд░-рд╕рдорд░реНрдкрд┐рдд MIT KDC рджреЗрдЦреЗрдВ), Oracle Linux 6
  • рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдПрдХреАрдХрд░рдг
  • Hadoop рдФрд░ Spark рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг
  • рдЕрдЬрдЧрд░ 2 рдФрд░ 3 рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ
  • рд╕реНрдкрд╛рд░реНрдХ 1 рдФрд░ 2 (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ pyspark рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде)
  • рдореЗрдЬрдмрд╛рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  • рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗрдЯ

рдпрд╣ рдкреЛрд╕реНрдЯ рдЖрдИрдЯреА рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди


Docker + Cloudera рдХреНрд▓рд╕реНрдЯрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдореЗрдВ рд▓реЙрдиреНрдЪ


рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред JupyterHub рдФрд░ Cloudera рдЙрддреНрдкрд╛рдж рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдЬреИрд╕реЗ - рдиреАрдЪреЗ рджреЗрдЦреЗрдВ), рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рд╕реЗ рдорд╛рдЙрдВрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВ:

start-hub.sh

VOLUMES="-v/var/run/docker.sock:/var/run/docker.sock:Z -v/var/lib/pbis/.lsassd:/var/lib/pbis/.lsassd:Z -v/var/lib/pbis/.netlogond:/var/lib/pbis/.netlogond:Z -v/var/jupyterhub/home:/home/BANK/:Z -v/u00/:/u00/:Z -v/tmp:/host/tmp:Z -v${CONFIG_DIR}/krb5.conf:/etc/krb5.conf:ro -v${CONFIG_DIR}/hadoop/:/etc/hadoop/conf.cloudera.yarn/:ro -v${CONFIG_DIR}/spark/:/etc/spark/conf.cloudera.spark_on_yarn/:ro -v${CONFIG_DIR}/spark2/:/etc/spark2/conf.cloudera.spark2_on_yarn/:ro -v${CONFIG_DIR}/jupyterhub/:/etc/jupyterhub/:ro" docker run -p0.0.0.0:8000:8000/tcp ${VOLUMES} -e VOLUMES="${VOLUMES}" -e HOST_HOSTNAME=`hostname -f` dsai1.2 


рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдПрдХреАрдХрд░рдг


рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ / рдХреЗрд░реНрдмрд░реЛрд╕ рд▓реЛрд╣рд╛ рдФрд░ рдмрд╣реБрдд рдореЗрдЬрдмрд╛рди рдирд╣реАрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рдорд╛рдирдХ PBIS рдУрдкрди рдЙрддреНрдкрд╛рдж рд╣реИред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрддреНрдкрд╛рдж рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде, рдЧреНрд░рд╛рд╣рдХ, рдпреВрдирд┐рдХреНрд╕ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЙрддреНрдкрд╛рдж рд▓рд┐рдирдХреНрд╕ рдкреАрдПрдПрдо рдФрд░ рдПрдирдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред

рд╣рдордиреЗ рдорд╛рдирдХ рдбреЙрдХрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ - рдореЗрдЬрдмрд╛рди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдпреВрдирд┐рдХреНрд╕ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ (lsof рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рд╕реЙрдХреЗрдЯ рдкрд╛рдП рдЧрдП рдереЗ):

start-hub.sh

 VOLUMES="-v/var/run/docker.sock:/var/run/docker.sock:Z -v/var/lib/pbis/.lsassd:/var/lib/pbis/.lsassd:Z <b>-v/var/lib/pbis/.netlogond:/var/lib/pbis/.netlogond:Z -v/var/jupyterhub/home:/home/BANK/:Z -v/u00/:/u00/:Z -v/tmp:/host/tmp:Z -v${CONFIG_DIR}/krb5.conf:/etc/krb5.conf:ro </b> -v${CONFIG_DIR}/hadoop/:/etc/hadoop/conf.cloudera.yarn/:ro -v${CONFIG_DIR}/spark/:/etc/spark/conf.cloudera.spark_on_yarn/:ro -v${CONFIG_DIR}/spark2/:/etc/spark2/conf.cloudera.spark2_on_yarn/:ro -v${CONFIG_DIR}/jupyterhub/:/etc/jupyterhub/:ro" docker run -p0.0.0.0:8000:8000/tcp ${VOLUMES} -e VOLUMES="${VOLUMES}" -e HOST_HOSTNAME=`hostname -f` dsai1.2 

рдмрджрд▓реЗ рдореЗрдВ, рдкреАрдмреАрдЖрдИрдПрд╕ рдкреИрдХреЗрдЬ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯ-рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЕрдиреБрднрд╛рдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рд╕реЗрд╡рд╛рдПрдВ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред PAM рдФрд░ NSS рд▓рд┐рдирдХреНрд╕ рдПрдХреАрдХрд░рдг рдХрдорд╛рдВрдб рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

Dockerfile:

 # Install PAM itself and standard PAM configuration packages. RUN yum install -y pam util-linux \ # Here we just download PBIS RPM packages then install them omitting scripts. # We don't need scripts since they start PBIS services, which are not used - we connect to the host services instead. && find /var/yum/localrepo/ -type f -name 'pbis-open*.rpm' | xargs rpm -ivh --noscripts \ # Enable PBIS PAM integration. && domainjoin-cli configure --enable pam \ # Make pam_loginuid.so module optional (Docker requirement) and add pam_mkhomedir.so to have home directories created automatically. && mv /etc/pam.d/login /tmp \ && awk '{ if ($1 == "session" && $2 == "required" && $3 == "pam_loginuid.so") { print "session optional pam_loginuid.so"; print "session required pam_mkhomedir.so skel=/etc/skel/ umask=0022";} else { print $0; } }' /tmp/login > /etc/pam.d/login \ && rm /tmp/login \ # Enable PBIS nss integration. && domainjoin-cli configure --enable nsswitch 

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ PBIS рдХрдВрдЯреЗрдирд░ рдХреЗ рдЧреНрд░рд╛рд╣рдХ PBIS рд╣реЛрд╕реНрдЯ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред JupyterHub рдПрдХ PAM рдкреНрд░рдорд╛рдгрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣реЛрд╕реНрдЯ рдкрд░ рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ PBIS рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

AD рд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ JupyterHub рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрди рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ AD рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреА рд╣реИрдВред

config-example / jupyterhub / jupyterhub_config.py

 c.DSAIAuthenticator.group_whitelist = ['COMPANY\\domain^users'] 

Hadoop рдФрд░ Spark рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг


JupyterHub рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╕рдордп, PBIS / tmp рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ Kerberos рдЯрд┐рдХрдЯ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХреА / tmp рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдФрд░ KRB5CCNAME рдЪрд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░рдорд╛рдгрдХ рд╡рд░реНрдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

start-hub.sh

 VOLUMES="-v/var/run/docker.sock:/var/run/docker.sock:Z -v/var/lib/pbis/.lsassd:/var/lib/pbis/.lsassd:Z -v/var/lib/pbis/.netlogond:/var/lib/pbis/.netlogond:Z -v/var/jupyterhub/home:/home/BANK/:Z -v/u00/:/u00/:Z -v/tmp:/host/tmp:Z -v${CONFIG_DIR}/krb5.conf:/etc/krb5.conf:ro -v${CONFIG_DIR}/hadoop/:/etc/hadoop/conf.cloudera.yarn/:ro -v${CONFIG_DIR}/spark/:/etc/spark/conf.cloudera.spark_on_yarn/:ro -v${CONFIG_DIR}/spark2/:/etc/spark2/conf.cloudera.spark2_on_yarn/:ro -v${CONFIG_DIR}/jupyterhub/:/etc/jupyterhub/:ro" docker run -p0.0.0.0:8000:8000/tcp ${VOLUMES} -e VOLUMES="${VOLUMES}" -e HOST_HOSTNAME=`hostname -f` dsai1.2 

рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ / jupyterhub / dsai.py

 env['KRB5CCNAME'] = '/host/tmp/krb5cc_%d' % pwd.getpwnam(self.user.name).pw_uid 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, JupyterHub рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Jupyter рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ hdfs рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЪрд░рдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╛рд░реНрдХ рдиреМрдХрд░рд┐рдпрд╛рдВ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХреА рдкреВрд░реА / tmp рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ - рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИред

рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг 2 рдФрд░ 3


рдпрд╣рд╛рдВ, рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ рдкрд╛рдпрдерди рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде, рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдореБрджреНрджрд╛ рдкрд╣рд▓реЗ рд╣реА рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдЫрд╛рдпрд╛ рд╣реБрдЖ рд╣реИред Conda рдХрд╛ рдЙрдкрдпреЛрдЧ Python рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рд╕рд╛рджрдЧреА рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдХреНрдпреЛрдВ рд╣реИ рдпрд╣ рдЕрдЧрд▓реЗ рднрд╛рдЧ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред рдкрд╛рдпрдерди 3.6 рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдЙрджрд╛рд╣рд░рдг (рдпрд╣ рдлрд╝рд╛рдЗрд▓ git рдореЗрдВ рдирд╣реАрдВ рд╣реИ - рд╕рднреА рдХрд░реНрдиреЗрд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ)

/opt/cloudera/parcels/Anaconda-5.3.1-dsai1.0/envs/python3.6.6/share/jupyter/kernels/python3.6.6/kernel.json

 {   "argv": [      "/opt/cloudera/parcels/Anaconda-5.3.1-dsai1.0/envs/python3.6.6/bin/python",       "-m",       "ipykernel_launcher",       "-f",      "{connection_file}"   ],   "display_name": "Python 3",   "language": "python" } 

рд╕реНрдкрд╛рд░реНрдХ 1 рдФрд░ 2


рд╕реНрдкрд╛рд░реНрдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╛рдпрдерди 3.6 рдФрд░ рд╕реНрдкрд╛рд░реНрдХ 2 рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдЙрджрд╛рд╣рд░рдгред

/opt/cloudera/parcels/Anaconda-5.3.1-dsai1.0/envs/python3.6.6/share/jupyter/kernels/python3.6.6-pyspark2/kernel.json

 {   "argv": [       "/opt/cloudera/parcels/Anaconda-5.3.1-dsai1.0/envs/python3.6.6/bin/python",       "-m",       "ipykernel_launcher",       "-f",      "{connection_file}"   ],   "display_name": "Python 3 + PySpark 2",   "language": "python",   "env": {       "JAVA_HOME": "/usr/java/default/",       "SPARK_HOME": "/opt/cloudera/parcels/SPARK2/lib/spark2/",       "PYTHONSTARTUP": "/opt/cloudera/parcels/SPARK2/lib/spark2/python/pyspark/shell.py",       "PYTHONPATH": "/opt/cloudera/parcels/SPARK2/lib/spark2/python/:/opt/cloudera/parcels/SPARK2/lib/spark2/python/lib/py4j-0.10.7-src.zip",       "PYSPARK_PYTHON": "/opt/cloudera/parcels/Anaconda-5.3.1-dsai1.0/envs/python3.6.6/bin/python"   } } 

рдмрд╕ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдкрд╛рд░реНрдХ 1 рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╛рди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдЧрд╛ - рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ 2 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣рд╛рдВ рдЙрди рдиреБрдХрд╕рд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдорд┐рд▓реЗ рдереЗред
рдкрд╣рд▓рд╛, рд╕реНрдкрд╛рд░реНрдХ 1.6.1 рдкрд╛рдпрдерди 3.6 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╕реАрдбреАрдПрдЪ 5.12.1 рдореЗрдВ рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди 5.15.1 рдореЗрдВ - рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдирд╣реАрдВ)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕реНрдкрд╛рд░реНрдХ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдерд╛ред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрдерди 3.5 рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдХреЛрдиреНрдбрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ред

рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╕реНрдкрд╛рд░реНрдХ 1 рдХреЛ рдбреЙрдХрд░ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИред рд╕реНрдкрд╛рд░реНрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдХрд░ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ рдЙрд╕реЗ рдЕрдкрдирд╛ рдЖрдИрдкреА рдкрддрд╛ рднреЗрдЬрддрд╛ рд╣реИред рдбреЙрдХрд░ рд╡рд░реНрдХрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ = рдмреНрд░рд┐рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЖрдИрдкреА рдирд╣реАрдВ рднреЗрдЬрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрдЬрдмрд╛рди рдХрд╛ рдЖрдИрдкреА, рдЬрд┐рд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЬреЛрдбрд╝рдХрд░ рд╕реНрдкрд╛рд░реНрдХ 2 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкреИрдЪ рдХреЛ рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирдпрд╛ рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ 1 рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕реНрдкрд╛рд░реНрдХ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдЬрдмрд╛рдиреЛрдВ рдкрд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╛рдпрдерди 3.6 рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рд╕рдорд╛рди рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рдорд╛рди рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВред рдХреНрд▓реЛрдПрдбрд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдХреЗ рдПрдирд╛рдХреЛрдВрдбрд╛ рдХреЛ рд╕реАрдзреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛:

  • рдПрдирд╛рдХреЛрдВрдбрд╛ рдФрд░ рд╕рднреА рд╕рд╣реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкрд╛рд░реНрд╕рд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ
  • рдЗрд╕реЗ рдбреЙрдХрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд┐рдП)

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд╛рд░реНрд╕рд▓ рдПрдирд╛рдХреЛрдВрдбрд╛


рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдХрд╛рд░реНрдп рдерд╛ред рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ:

  1. рдПрдирд╛рдХреЛрдВрдбрд╛ рдФрд░ рдкрд╛рдпрдерди рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд▓ рд╕рд╛рдордЧреНрд░реА рддреИрдпрд╛рд░ рдХрд░реЗрдВ
  2. рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ (рдлрд╝рд╛рдЗрд▓реЗрдВ) рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ рдореЗрдЯрд╛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдбрд╛рд▓реЗрдВ
  3. рд╕рд░рд▓ рдЯрд╛рд░ рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕рд▓ рдмрдирд╛рдПрдВ
  4. Cloudera рд╕реЗ рд╡реИрдз рдкрд╛рд░реНрд╕рд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧреАрдерд╣рдм рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд╡рд╣рд╛рдВ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛрдб рднреА рд╣реИред рд╣рдордиреЗ рдХреНрд▓рд╛рдЙрдбрд░рд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдирд╛рдХреЛрдВрдбрд╛ рдкрд╛рд░реНрд╕рд▓ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛, рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ред

рдбреЙрдХрд░ рдореЗрдВ рдкрд╛рд░реНрд╕рд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдпрд╣ рдЕрднреНрдпрд╛рд╕ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИ:

  • рд╕реНрдкрд╛рд░реНрдХ рд╕рдВрдЪрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ - рдПрдирд╛рдХреЛрдВрдбрд╛ рдХреЛ рдкрд╛рд░реНрд╕рд▓ рдХреЗ рдмрд┐рдирд╛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ
  • рд╕реНрдкрд╛рд░реНрдХ 2 рдХреЛ рдХреЗрд╡рд▓ рдкрд╛рд░реНрд╕рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛:

  • Hadoop рдФрд░ Spark рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА - рдЬрдм Docker рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рдорд╛рди рдкрд╛рд░реНрд╕рд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓рд╕реНрдЯрд░ рдФрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрде рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ
  • рдХрдВрдЯреЗрдирд░ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА - рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЛ рдмрд╕ рдЙрд╕реА рдкрд╛рд░реНрд╕рд▓ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

Docker рдореЗрдВ рдкрд╛рд░реНрд╕рд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Cloudera Manager рдХреЛ рдкрд╣рд▓реЗ RPM рд╕рдВрдХреБрд▓ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рд░реНрд╕рд▓ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдХреБрдЫ рдПрдХрд░реВрдкрддрд╛ рдЦреЛрдиреА рдкрдбрд╝реА), рдЬрд┐рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╣рддреЗ рд╣реИрдВред

рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ / рд╕реНрдерд╛рдкрд┐рдд-рдкрд╛рд░реНрд╕рд▓ / src / InstallParcels.java

 ParcelsResourceV5 parcels = clusters.getParcelsResource(clusterName); for (int i = 1; i < args.length; i += 2) {   result = installParcel(api, parcels, args[i], args[i + 1], pause);   if (!result) {       System.exit(1);   } } 

рдореЗрдЬрдмрд╛рди рд╕рдВрд╕рд╛рдзрди рд╕реАрдорд╛


рдореЗрдЬрдмрд╛рди рдорд╢реАрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЙрдХрд░рд╕реНрдкрд╛рд╡рд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдШрдЯрдХ рдЬреЛ рдЬреБрдкрд┐рдЯрд░ рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ - рдФрд░ cgroups - рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рддрдВрддреНрд░ред DockerSpawner Docker API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдореВрд▓ cgroup рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рдбреЙрдХрдкрд░реНрд╕рдирд░ рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рд╕рд░рд▓ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬреЛ рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдбреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕рдореВрд╣ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ / jupyterhub / dsai.py

 def set_extra_host_config(self):       extra_host_config = {}       if self.user.name in self.user_cgroup_parent:           cgroup_parent = self.user_cgroup_parent[self.user.name]       else:           pw_name = pwd.getpwnam(self.user.name).pw_name           group_found = False           for g in grp.getgrall():               if pw_name in g.gr_mem and g.gr_name in self.group_cgroup_parent:                   cgroup_parent = self.group_cgroup_parent[g.gr_name]                   group_found = True                   break           if not group_found:               cgroup_parent = self.cgroup_parent extra_host_config['cgroup_parent'] = cgroup_parent 

рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╢реЛрдзрди рднреА рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЬреБрдкрд┐рдЯрд░ рдХреЛ рдЙрд╕реА рдЫрд╡рд┐ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЬреНрдпреВрдкрд┐рдЯрд░рд╣рдм рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ / jupyterhub / dsai.py

 current_container = None host_name = socket.gethostname() for container in self.client.containers():   if container['Id'][0:12] == host_name:       current_container = container       break self.image = current_container['Image'] 

рдХрдВрдЯреЗрдирд░, рдЬреБрдкрд┐рдЯрд░ рдпрд╛ рдЬреБрдкрд╛рдЗрдЯрд░ рд╣реВрдм рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ, рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ / jupyterhub / dsai.py

 #!/bin/bash ANACONDA_PATH="/opt/cloudera/parcels/Anaconda/" DEFAULT_ENV=`cat ${ANACONDA_PATH}/envs/default` source activate ${DEFAULT_ENV} if [ -z "${JUPYTERHUB_CLIENT_ID}" ]; then   while true; do       jupyterhub -f /etc/jupyterhub/jupyterhub_config.py   done else   HOME=`su ${JUPYTERHUB_USER} -c 'echo ~'`   cd ~   su ${JUPYTERHUB_USER} -p -c "jupyterhub-singleuser --KernelSpecManager.ensure_native_kernel=False --ip=0.0.0.0" fi 

рдЬреБрдкрд┐рдЯрд░ рд╣реЙрдХрд░ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдЬреНрдпреВрдкрд┐рдЯрд░ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреНрдпреВрдкреНрдЯрд░рд╣рдм рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдбреЙрдХрд░ рдбреЗрдорди рд╕реЙрдХреЗрдЯ рдмрдврд╝рддреЗ рд╣реБрдП рд╣рд╛рд╕рд┐рд▓ рдХреА рдЬрд╛рддреА рд╣реИред

start-hub.sh

 VOLUMES="-<b>v/var/run/docker.sock:/var/run/docker.sock:Z -v/var/lib/pbis/.lsassd:/var/lib/pbis/.lsassd:Z</b> -v/var/lib/pbis/.netlogond:/var/lib/pbis/.netlogond:Z -v/var/jupyterhub/home:/home/BANK/:Z -v/u00/:/u00/:Z -v/tmp:/host/tmp:Z -v${CONFIG_DIR}/krb5.conf:/etc/krb5.conf:ro -v${CONFIG_DIR}/hadoop/:/etc/hadoop/conf.cloudera.yarn/:ro -v${CONFIG_DIR}/spark/:/etc/spark/conf.cloudera.spark_on_yarn/:ro -v${CONFIG_DIR}/spark2/:/etc/spark2/conf.cloudera.spark2_on_yarn/:ro -v${CONFIG_DIR}/jupyterhub/:/etc/jupyterhub/:ro" docker run -p0.0.0.0:8000:8000/tcp ${VOLUMES} -e VOLUMES="${VOLUMES}" -e HOST_HOSTNAME=`hostname -f` dsai1.2 

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ssh рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрдгрдп рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред

рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдбреЙрдХрд░рд╕реНрдкрд╛рд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: рд╕реНрдкрд╛рд░реНрдХ рдЪрд╛рд▓рдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреЛрд░реНрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реНрд░рдорд┐рдХ рдлрд┐рд░ рдПрдХ рдмрд╛рд╣рд░реА рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкреЛрд░реНрдЯ рдирдВрдмрд░реЛрдВ рдХреА рдЙрд╕ рд╕реАрдорд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдЗрди рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕реНрдкрд╛рд░реНрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реЗрдЯ рдХрд░рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпреЗ рд░реЗрдВрдЬ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдЬреБрдкрд┐рдЯрд░ рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХреЗрд╡рд▓ JupyterHub рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдпреВрдЬрд░ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдкреЛрд░реНрдЯ рд░реЗрдВрдЬ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ:

рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ / jupyterhub / dsai.py

 def set_extra_create_kwargs(self):       user_spark_driver_port, user_spark_blockmanager_port, user_spark_ui_port, user_spark_max_retries = self.get_spark_ports()       if user_spark_driver_port == 0 or user_spark_blockmanager_port == 0 or user_spark_ui_port == 0 or user_spark_max_retries == 0:           return       ports = {}       for p in range(user_spark_driver_port, user_spark_driver_port + user_spark_max_retries):           ports['%d/tcp' % p] = None       for p in range(user_spark_blockmanager_port, user_spark_blockmanager_port + user_spark_max_retries):           ports['%d/tcp' % p] = None       for p in range(user_spark_ui_port, user_spark_ui_port + user_spark_max_retries):           ports['%d/tcp' % p] = None self.extra_create_kwargs = { 'ports' : ports } 

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдХрдВрдЯреЗрдирд░ рдХреЛ рдЬреБрдкрд┐рдЯрд░рд╣рдм рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣рд╛рдирд┐ рдХреЗ рдХрд╛рд░рдг рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк JupyterHub рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди, рд╣рдо рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдЫреВрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдВрджрд░ JupyterHub рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред

restart-hub.sh

 #!/bin/bash docker ps | fgrep 'dsai1.2' | fgrep -v 'jupyter-' | awk '{ print $1; }' | while read ID; do docker exec $ID /bin/bash -c "kill \$( cat /root/jupyterhub.pid )"; done 

Cgroups рдЦреБрдж рдХреЛ рдорд╛рдирдХ рд▓рд┐рдирдХреНрд╕ рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ AD рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ cgroups рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

 <b>config-example/jupyterhub/jupyterhub_config.py</b> c.DSAISpawner.user_cgroup_parent = {   'bank\\user1'    : '/jupyter-cgroup-1', # user 1   'bank\\user2'    : '/jupyter-cgroup-1', # user 2   'bank\\user3'    : '/jupyter-cgroup-2', # user 3 } c.DSAISpawner.cgroup_parent = '/jupyter-cgroup-3' 

Git рдХреЛрдб


рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ GitHub: https://github.com/DS-AI/dsai/ (DSAI - Data Science and Artificial Intelligence) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕рднреА рдХреЛрдбреЛрдВ рдХреЛ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдХреЛрдб рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдбреЛрдХрд░ рдЫрд╡рд┐ рд╣реЛрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ:

  • рдПрд╕реЗрдЯреНрд╕.рд╢ - рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг (рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдпрд╛ рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛)
  • build.sh - рдирд┐рд░реНрдорд╛рдг
  • clean.sh - рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдлрд╛рдИ

рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ рдХреНрд▓реАрди.рд╢, рдПрд╕реЗрдЯреНрд╕.рд╢, рдмрд┐рд▓реНрдб.рд╢ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП, рд╣рдо Linux RedHat 7.4, Docker 17.05.0-Ce рдХреЗ рд╕рд╛рде рдПрдХ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдорд╢реАрди рдореЗрдВ 8 рдХреЛрд░, 32 рдЬреАрдмреА рд░реИрдо рдФрд░ 250 рдЬреАрдмреА рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рд╣реИред рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд░реИрдо рдФрд░ рдПрдЪрдбреАрдбреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдЬрдмрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

рдпрд╣рд╛рдБ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рд╣реИ:

  • 01-рд╕реНрдкрд╛рд░реНрдХ-рдкреИрдЪреЗрдб - RPM рд╕реНрдкрд╛рд░реНрдХ 1.6.1 рдиреЗ рджреЛ рдкреИрдЪ рдХреЗ рд╕рд╛рде SPARK-4563 рдФрд░ SPARK-19019 рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред
  • 02-рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ - рдкрд╛рд░реНрд╕рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛
  • 03-рдПрдирд╛рдХреЛрдВрдбрд╛-рдбреАрдПрд╕рдИ-рдкрд╛рд░реНрд╕рд▓-1.0 - рдкрд╛рд░реНрд╕рд▓ рдПрдирд╛рдХреЛрдВрдбрд╛ рд╕рд╣реА рдкрд╛рдпрдерди (2, 3.5 рдЗрдВрдЪ рдФрд░ 3.6 рдЗрдВрдЪ) рдХреЗ рд╕рд╛рде
  • 04-рдХреНрд▓рд╛рдЙрдбрдбрд░-рдореИрдиреЗрдЬрд░-рдПрдкреАрдЖрдИ - рдХреНрд▓рд╛рдЙрдбрд░рд╛ рдкреНрд░рдмрдВрдзрдХ рдПрдкреАрдЖрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
  • 05-dsai1.2-offline - рдЕрдВрддрд┐рдо рдЫрд╡рд┐

рдХрд╛рд╢, рдЕрд╕реЗрдВрдмрд▓реА рдЙрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдереЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рд░реНрд╕рд▓ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдЯрд╛рд░ рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреИрдиреНрд╕рд▓ рдЕрд╕реЗрдВрдмрд▓реА рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдХреНрд▓рд╛рдЙрдбрд░рд╛, рдЬреЛ рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐)ред

рдПрдХ рдФрд░ рдХрдореА рдкрд╛рд░реНрд╕рд▓ рдЕрд╕реЗрдВрдмрд▓реА irreproducible рд╣реИред рдЪреВрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рднрд┐рдиреНрди рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддреА рд╣реИред

рдЧреНрд░реИрдВрдб рдлрд┐рдирд╛рд▓реЗ


рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдИ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдмрдврд╝рдирд╛ рдЬрд╛рд░реА рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо JupyterLab рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ GPU рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рджреЛ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрди рдЕрдм рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред

Source: https://habr.com/ru/post/hi443294/


All Articles