เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เชšเชฒเชพเชตเชตเซเช‚

เชชเซเชฐเชฟเชฏ เชตเชพเชšเช•เซ‹, เชถเซเชญ เชฌเชชเซ‹เชฐ. เช†เชœเซ‡ เช†เชชเชฃเซ‡ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เช…เชจเซ‡ เชคเซ‡เชจเชพ เชตเชฟเช•เชพเชธเชจเซ€ เชธเช‚เชญเชพเชตเชจเชพเช“ เชตเชฟเชถเซ‡ เชฅเซ‹เชกเซ€ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เชšเชฒเชพเชตเชตเซเช‚

เชฌเชฟเช— เชกเซ‡เชŸเชพเชจเชพ เช†เชงเซเชจเชฟเช• เชตเชฟเชถเซเชตเชฎเชพเช‚, เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เช เชฌเซ‡เชš เชกเซ‡เชŸเชพ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เช•เชพเชฐเซเชฏเซ‹ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชตเชพเชธเซเชคเชตเชฟเช• เชงเซ‹เชฐเชฃ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹ เชฌเซ‡เชš เช•เซ‹เชจเซเชธเซ‡เชชเซเชŸเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เชจเชพเชจเชพ เชญเชพเช—เซ‹เชฎเชพเช‚ เชกเซ‡เชŸเชพ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เช…เชจเซ‡ เชถเชฟเชชเชฟเช‚เช— เช•เชฐเซ‡ เช›เซ‡ (เชธเซเชชเชพเชฐเซเช• เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชก เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช—). เช…เชจเซ‡ เชชเชฐเช‚เชชเชฐเชพเช—เชค เชฐเซ€เชคเซ‡ เชคเซ‡ เชธเช‚เชธเชพเชงเชจ เชธเช‚เชšเชพเชฒเช• เชคเชฐเซ€เช•เซ‡ YARN (เช…เชฅเชตเชพ เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ Apache Mesos) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเช•เช‚เชฆเชฐ Hadoop เชธเซเชŸเซ‡เช•เชจเซ‹ เชญเชพเช— เชฐเชนเซเชฏเซ‹ เช›เซ‡. 2020 เชธเซเชงเซ€เชฎเชพเช‚, เชคเซ‡เชจเชพ เชชเชฐเช‚เชชเชฐเชพเช—เชค เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฏเซ‹เช—เซเชฏ Hadoop เชตเชฟเชคเชฐเชฃเชจเชพ เช…เชญเชพเชตเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เช•เช‚เชชเชจเซ€เช“ เชฎเชพเชŸเซ‡ เชชเซเชฐเชถเซเชจเชฎเชพเช‚ เช›เซ‡ - HDP เช…เชจเซ‡ CDHเชจเซ‹ เชตเชฟเช•เชพเชธ เช…เชŸเช•เซ€ เช—เชฏเซ‹ เช›เซ‡, CDH เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชตเชฟเช•เชธเชฟเชค เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชค เชŠเช‚เชšเซ€ เช›เซ‡, เช…เชจเซ‡ เชฌเชพเช•เซ€เชจเชพ Hadoop เชธเชชเซเชฒเชพเชฏเชฐเซเชธ เชชเชพเชธเซ‡ เช›เซ‡. เช•เซเชฏเชพเช‚ เชคเซ‹ เช…เชธเซเชคเชฟเชคเซเชต เชฌเช‚เชง เชฅเชˆ เช—เชฏเซเช‚ เช›เซ‡ เช…เชฅเชตเชพ เชงเซ‚เช‚เชงเชณเซเช‚ เชญเชตเชฟเชทเซเชฏ เช›เซ‡. เชคเซ‡เชฅเซ€, เช•เซเชฌเชฐเชจเซ‡เชŸเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช•เชจเซเช‚ เชฒเซ‹เชจเซเชšเชฟเช‚เช— เชธเชฎเซเชฆเชพเชฏ เช…เชจเซ‡ เชฎเซ‹เชŸเซ€ เช•เช‚เชชเชจเซ€เช“เชฎเชพเช‚ เชตเชงเซ เชฐเชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡ - เช–เชพเชจเช—เซ€ เช…เชจเซ‡ เชœเชพเชนเซ‡เชฐ เชตเชพเชฆเชณเซ‹เชฎเชพเช‚ เช•เชจเซเชŸเซ‡เชจเชฐ เช“เชฐเซเช•เซ‡เชธเซเชŸเซเชฐเซ‡เชถเชจ เช…เชจเซ‡ เชธเช‚เชธเชพเชงเชจ เชธเช‚เชšเชพเชฒเชจเชฎเชพเช‚ เชฎเชพเชจเช• เชฌเชจเซ€เชจเซ‡, เชคเซ‡ YARN เชชเชฐ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเชพ เช…เชธเซเชตเชฟเชงเชพเชœเชจเช• เชธเช‚เชธเชพเชงเชจ เชถเซ‡เชกเซเชฏเซเชฒเชฟเช‚เช—เชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชนเชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เชคเชฎเชพเชฎ เช•เชฆ เช…เชจเซ‡ เชชเชŸเซเชŸเชพเช“เชจเซ€ เช•เช‚เชชเชจเซ€เช“ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชตเซเชฏเชตเชธเชพเชฏเชฟเช• เช…เชจเซ‡ เช–เซเชฒเซเชฒเชพ เชตเชฟเชคเชฐเชฃเซ‹ เชธเชพเชฅเซ‡ เชธเชคเชค เชตเชฟเช•เชพเชธเชถเซ€เชฒ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ. เชตเชงเซเชฎเชพเช‚, เชฒเซ‹เช•เชชเซเชฐเชฟเชฏเชคเชพเชจเซ‡ เชชเช—เชฒเซ‡, เชฎเซ‹เชŸเชพ เชญเชพเช—เชจเชพเช เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชคเซ‡เชฎเชจเชพ เชชเซ‹เชคเชพเชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชธเซเชฅเชพเชชเชจเซ‹ เชนเชธเซเชคเช—เชค เช•เชฐเซ€ เชฒเซ€เชงเชพ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชคเซ‡เชฎเชจเซ€ เช•เซเชถเชณเชคเชพ เชตเชงเชพเชฐเซ€ เช›เซ‡, เชœเซ‡ เชšเชพเชฒเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เชตเชฐเซเชเชจ 2.3.0 เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเซ€เชจเซ‡, Apache Spark เช Kubernetes เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชšเชพเชฒเชคเชพ เช•เชพเชฐเซเชฏเซ‹ เชฎเชพเชŸเซ‡ เชธเชคเซเชคเชพเชตเชพเชฐ เชธเชฎเชฐเซเชฅเชจ เชฎเซ‡เชณเชตเซเชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡ เช†เชœเซ‡, เช…เชฎเซ‡ เช† เช…เชญเชฟเช—เชฎเชจเซ€ เชตเชฐเซเชคเชฎเชพเชจ เชชเชฐเชฟเชชเช•เซเชตเชคเชพ, เชคเซ‡เชจเชพ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡เชจเชพ เชตเชฟเชตเชฟเชง เชตเชฟเช•เชฒเซเชชเซ‹ เช…เชจเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช†เชตเชคเซ€ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚.

เชธเซŒ เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ Apache Spark เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช•เชพเชฐเซเชฏเซ‹ เช…เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชตเชฟเช•เชธเชพเชตเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชœเซ‹เชˆเช เช…เชจเซ‡ เชฒเชพเช•เซเชทเชฃเชฟเช• เช•เซ‡เชธเซ‹เชจเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช เชœเซ‡เชฎเชพเช‚ เชคเชฎเชพเชฐเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เชชเซ‹เชธเซเชŸเชจเซ€ เชคเซˆเชฏเชพเชฐเซ€เชฎเชพเช‚, OpenShift เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเชฟเชคเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ (oc) เชจเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เช†เชฆเซ‡เชถเซ‹ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เช…เชจเซเชฏ Kubernetes เชตเชฟเชคเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡, เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค Kubernetes เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ (kubectl) เช…เชฅเชตเชพ เชคเซ‡เชฎเชจเชพ เชเชจเชพเชฒเซ‹เช— (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, oc adm เชจเซ€เชคเชฟ เชฎเชพเชŸเซ‡) เชจเชพ เช…เชจเซเชฐเซ‚เชช เช†เชฆเซ‡เชถเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชชเซเชฐเชฅเชฎ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชธ - เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ

เช•เชพเชฐเซเชฏเซ‹ เช…เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹เชจเชพ เชตเชฟเช•เชพเชธ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเซ‹เชฐเซเชฎเซ‡เชถเชจเชจเซ‡ เชกเซ€เชฌเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชฐเซ€เชคเซ‡, เช† เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เชธเซเชŸเชฌเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เช‚เชคเชฟเชฎ เชชเซเชฐเชฃเชพเชฒเซ€เช“เชจเชพ เชตเชพเชธเซเชคเชตเชฟเช• (เชชเชฐเซ€เช•เซเชทเชฃ เช›เชคเชพเช‚) เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ€ เชญเชพเช—เซ€เชฆเชพเชฐเซ€ เชธเชพเชฅเซ‡ เชตเชฟเช•เชพเชธ เช† เชตเชฐเซเช—เชจเชพ เช•เชพเชฐเซเชฏเซ‹เชฎเชพเช‚ เชเชกเชชเซ€ เช…เชจเซ‡ เชฌเชนเซ‡เชคเชฐ เชธเชพเชฌเชฟเชค เชฅเชฏเซ‹ เช›เซ‡. เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เช…เช‚เชคเชฟเชฎ เชธเชฟเชธเซเชŸเชฎเซ‹เชจเชพ เชตเชพเชธเซเชคเชตเชฟเช• เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชชเชฐ เชกเซ€เชฌเช— เช•เชฐเซ€เช เช›เซ€เช, เชคเซเชฏเชพเชฐเซ‡ เชฌเซ‡ เชฆเซƒเชถเซเชฏเซ‹ เชถเช•เซเชฏ เช›เซ‡:

  • เชกเซ‡เชตเชฒเชชเชฐ เชธเซเชŸเซ‡เชจเซเชกเช…เชฒเซ‹เชจ เชฎเซ‹เชกเชฎเชพเช‚ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเซ‡ เช›เซ‡;

    เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เชšเชฒเชพเชตเชตเซเช‚

  • เชกเซ‡เชตเชฒเชชเชฐ เชŸเซ‡เชธเซเชŸ เชฒเซ‚เชชเชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เชŸเชพเชธเซเช• เชšเชฒเชพเชตเซ‡ เช›เซ‡.

    เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เชšเชฒเชพเชตเชตเซเช‚

เชชเซเชฐเชฅเชฎ เชตเชฟเช•เชฒเซเชชเชจเซ‡ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชฐเชนเซ‡เชตเชพเชจเซ‹ เช…เชงเชฟเช•เชพเชฐ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชพเช‚ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช—เซ‡เชฐเชซเชพเชฏเชฆเชพ เชถเชพเชฎเซ‡เชฒ เช›เซ‡:

  • เชฆเชฐเซ‡เช• เชกเซ‡เชตเชฒเชชเชฐเชจเซ‡ เช•เชพเชฐเซเชฏเชธเซเชฅเชณเชฅเซ€ เชคเซ‡เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เช…เช‚เชคเชฟเชฎ เชธเชฟเชธเซเชŸเชฎเซเชธเชจเชพ เชคเชฎเชพเชฎ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ€ เชเช•เซเชธเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡;
  • เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชฎเชถเซ€เชจ เชชเชฐ เชตเชฟเช•เชธเชฟเชค เช•เชพเชฐเซเชฏเชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชฌเซ€เชœเชพ เชตเชฟเช•เชฒเซเชชเชฎเชพเช‚ เช† เช—เซ‡เชฐเชซเชพเชฏเชฆเชพเช“ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชคเชฎเชจเซ‡ เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชธเช‚เชธเชพเชงเชจ เชชเซ‚เชฒ เชซเชพเชณเชตเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช…เช‚เชคเชฟเชฎ เชธเชฟเชธเซเชŸเชฎ เชฆเชพเช–เชฒเชพเช“ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชเช•เซเชธเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡, เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฐเซ‹เชฒ เชฎเซ‹เชกเซ‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเชตเชšเซ€เช• เชฐเซ€เชคเซ‡ เชคเซ‡เชจเซ€ เชเช•เซเชธเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เชตเชฟเช•เชพเชธ เชŸเซ€เชฎเชจเชพ เชคเชฎเชพเชฎ เชธเชญเซเชฏเซ‹. เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชชเซเชฐเชฅเชฎ เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เซ‡เชธ เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช - เชŸเซ‡เชธเซเชŸ เชฒเซ‚เชชเชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เชธเซเชฅเชพเชจเชฟเช• เชกเซ‡เชตเชฒเชชเชฐ เชฎเชถเซ€เชจเชฎเชพเช‚เชฅเซ€ เชธเซเชชเชพเชฐเซเช• เชŸเชพเชธเซเช• เชฒเซ‹เช‚เชš เช•เชฐเชตเซเช‚.

เชšเชพเชฒเซ‹ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชพเชฐเซเช• เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชตเชฟเชถเซ‡ เชตเชงเซ เชตเชพเชค เช•เชฐเซ€เช. เชธเซเชชเชพเชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

mkdir /opt/spark
cd /opt/spark
wget http://mirror.linux-ia64.org/apache/spark/spark-2.4.5/spark-2.4.5.tgz
tar zxvf spark-2.4.5.tgz
rm -f spark-2.4.5.tgz

เช…เชฎเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเซ‡เช•เซ‡เชœเซ‹ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€เช เช›เซ€เช:

cd spark-2.4.5/
./build/mvn -Pkubernetes -DskipTests clean package

เชธเช‚เชชเซ‚เชฐเซเชฃ เชฌเชฟเชฒเซเชกเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ‡ เช›เซ‡, เช…เชจเซ‡ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช–เชฐเซ‡เช–เชฐ เชซเช•เซเชค "เชเชธเซ‡เชฎเซเชฌเชฒเซ€/" เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชœเชพเชฐ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡เชฅเซ€ เชคเชฎเซ‡ เชซเช•เซเชค เช† เชธเชฌเชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹:

./build/mvn -f ./assembly/pom.xml -Pkubernetes -DskipTests clean package

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เชœเซ‹เชฌเซเชธ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชฌเซ‡เช เชˆเชฎเซ‡เชœ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช…เชนเซ€เช‚ 2 เชธเช‚เชญเชตเชฟเชค เช…เชญเชฟเช—เชฎเซ‹ เช›เซ‡:

  • เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชฎเชพเช‚ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชธเซเชชเชพเชฐเซเช• เชŸเชพเชธเซเช• เช•เซ‹เชกเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡;
  • เชฌเชจเชพเชตเซ‡เชฒ เช‡เชฎเซ‡เชœเชฎเชพเช‚ เชซเช•เซเชค เชธเซเชชเชพเชฐเซเช• เช…เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชถเชพเชฎเซ‡เชฒ เช›เซ‡, เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เช•เซ‹เชก เชฐเชฟเชฎเซ‹เชŸเชฒเซ€ เชนเซ‹เชธเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, HDFS เชฎเชพเช‚).

เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช‰เชฆเชพเชนเชฐเชฃ เชงเชฐเชพเชตเชคเซ€ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœ เชฌเชจเชพเชตเซ€เช. เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชธเซเชชเชพเชฐเซเช• เชชเชพเชธเซ‡ "เชกเซ‹เช•เชฐ-เช‡เชฎเซ‡เชœ-เชŸเซ‚เชฒ" เชจเชพเชฎเชจเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเชพ เชชเชฐ เชฎเชฆเชฆเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€เช:

./bin/docker-image-tool.sh --help

เชคเซ‡เชจเซ€ เชฎเชฆเชฆ เชตเชกเซ‡, เชคเชฎเซ‡ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชเชฎเชพเช‚ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ เชคเซ‡เชจเชพ เช˜เชฃเชพ เช—เซ‡เชฐเชซเชพเชฏเชฆเชพ เช›เซ‡:

  • เชจเชฟเชทเซเชซเชณ เชตเชฟเชจเชพ เชเช• เชœ เชธเชฎเชฏเซ‡ 3 เชกเซ‹เช•เชฐ เช›เชฌเซ€เช“ เชฌเชจเชพเชตเซ‡ เช›เซ‡ - เชธเซเชชเชพเชฐเซเช•, เชชเชพเชฏเชธเซเชชเชพเชฐเซเช• เช…เชจเซ‡ เช†เชฐ เชฎเชพเชŸเซ‡;
  • เชคเชฎเชจเซ‡ เช›เชฌเซ€เชจเซเช‚ เชจเชพเชฎ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชคเซเช‚ เชจเชฅเซ€.

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เชจเซ€เชšเซ‡ เช†เชชเซ‡เชฒ เช† เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเชพ เชธเช‚เชถเซ‹เชงเชฟเชค เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚:

vi bin/docker-image-tool-upd.sh

#!/usr/bin/env bash

function error {
  echo "$@" 1>&2
  exit 1
}

if [ -z "${SPARK_HOME}" ]; then
  SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
. "${SPARK_HOME}/bin/load-spark-env.sh"

function image_ref {
  local image="$1"
  local add_repo="${2:-1}"
  if [ $add_repo = 1 ] && [ -n "$REPO" ]; then
    image="$REPO/$image"
  fi
  if [ -n "$TAG" ]; then
    image="$image:$TAG"
  fi
  echo "$image"
}

function build {
  local BUILD_ARGS
  local IMG_PATH

  if [ ! -f "$SPARK_HOME/RELEASE" ]; then
    IMG_PATH=$BASEDOCKERFILE
    BUILD_ARGS=(
      ${BUILD_PARAMS}
      --build-arg
      img_path=$IMG_PATH
      --build-arg
      datagram_jars=datagram/runtimelibs
      --build-arg
      spark_jars=assembly/target/scala-$SPARK_SCALA_VERSION/jars
    )
  else
    IMG_PATH="kubernetes/dockerfiles"
    BUILD_ARGS=(${BUILD_PARAMS})
  fi

  if [ -z "$IMG_PATH" ]; then
    error "Cannot find docker image. This script must be run from a runnable distribution of Apache Spark."
  fi

  if [ -z "$IMAGE_REF" ]; then
    error "Cannot find docker image reference. Please add -i arg."
  fi

  local BINDING_BUILD_ARGS=(
    ${BUILD_PARAMS}
    --build-arg
    base_img=$(image_ref $IMAGE_REF)
  )
  local BASEDOCKERFILE=${BASEDOCKERFILE:-"$IMG_PATH/spark/docker/Dockerfile"}

  docker build $NOCACHEARG "${BUILD_ARGS[@]}" 
    -t $(image_ref $IMAGE_REF) 
    -f "$BASEDOCKERFILE" .
}

function push {
  docker push "$(image_ref $IMAGE_REF)"
}

function usage {
  cat <<EOF
Usage: $0 [options] [command]
Builds or pushes the built-in Spark Docker image.

Commands:
  build       Build image. Requires a repository address to be provided if the image will be
              pushed to a different registry.
  push        Push a pre-built image to a registry. Requires a repository address to be provided.

Options:
  -f file               Dockerfile to build for JVM based Jobs. By default builds the Dockerfile shipped with Spark.
  -p file               Dockerfile to build for PySpark Jobs. Builds Python dependencies and ships with Spark.
  -R file               Dockerfile to build for SparkR Jobs. Builds R dependencies and ships with Spark.
  -r repo               Repository address.
  -i name               Image name to apply to the built image, or to identify the image to be pushed.  
  -t tag                Tag to apply to the built image, or to identify the image to be pushed.
  -m                    Use minikube's Docker daemon.
  -n                    Build docker image with --no-cache
  -b arg      Build arg to build or push the image. For multiple build args, this option needs to
              be used separately for each build arg.

Using minikube when building images will do so directly into minikube's Docker daemon.
There is no need to push the images into minikube in that case, they'll be automatically
available when running applications inside the minikube cluster.

Check the following documentation for more information on using the minikube Docker daemon:

  https://kubernetes.io/docs/getting-started-guides/minikube/#reusing-the-docker-daemon

Examples:
  - Build image in minikube with tag "testing"
    $0 -m -t testing build

  - Build and push image with tag "v2.3.0" to docker.io/myrepo
    $0 -r docker.io/myrepo -t v2.3.0 build
    $0 -r docker.io/myrepo -t v2.3.0 push
EOF
}

if [[ "$@" = *--help ]] || [[ "$@" = *-h ]]; then
  usage
  exit 0
fi

REPO=
TAG=
BASEDOCKERFILE=
NOCACHEARG=
BUILD_PARAMS=
IMAGE_REF=
while getopts f:mr:t:nb:i: option
do
 case "${option}"
 in
 f) BASEDOCKERFILE=${OPTARG};;
 r) REPO=${OPTARG};;
 t) TAG=${OPTARG};;
 n) NOCACHEARG="--no-cache";;
 i) IMAGE_REF=${OPTARG};;
 b) BUILD_PARAMS=${BUILD_PARAMS}" --build-arg "${OPTARG};;
 esac
done

case "${@: -1}" in
  build)
    build
    ;;
  push)
    if [ -z "$REPO" ]; then
      usage
      exit 1
    fi
    push
    ;;
  *)
    usage
    exit 1
    ;;
esac

เชคเซ‡เชจเซ€ เชฎเชฆเชฆเชฅเซ€, เช…เชฎเซ‡ เชธเซเชชเชพเชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Pi เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชชเชฐเซ€เช•เซเชทเชฃ เช•เชพเชฐเซเชฏ เชงเชฐเชพเชตเชคเซ€ เชฎเซ‚เชณเชญเซ‚เชค เชธเซเชชเชพเชฐเซเช• เช‡เชฎเซ‡เชœเชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€เช เช›เซ€เช (เช…เชนเซ€เช‚ {docker-registry-url} เช เชคเชฎเชพเชฐเซ€ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซเช‚ URL เช›เซ‡, {repo} เช เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซ€ เช…เช‚เชฆเชฐเชจเชพ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซเช‚ เชจเชพเชฎ เช›เซ‡, เชœเซ‡ OpenShift เชฎเชพเช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชฏ เช›เซ‡, {image-name} - เช‡เชฎเซ‡เชœเชจเซเช‚ เชจเชพเชฎ (เชœเซ‹ เช‡เชฎเซ‡เชœเชจเชพ เชคเซเชฐเชฃ-เชธเซเชคเชฐเชจเชพ เชตเชฟเชญเชพเชœเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, Red Hat OpenShift เช‡เชฎเซ‡เชœเชจเซ€ เชธเช‚เช•เชฒเชฟเชค เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚), {tag} - เช†เชจเซ‹ เชŸเซ‡เช— เช›เชฌเซ€เชจเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ):

./bin/docker-image-tool-upd.sh -f resource-managers/kubernetes/docker/src/main/dockerfiles/spark/Dockerfile -r {docker-registry-url}/{repo} -i {image-name} -t {tag} build

เช•เชจเซเชธเซ‹เชฒ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ OKD เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชฒเซ‹เช— เช‡เชจ เช•เชฐเซ‹ (เช…เชนเซ€เช‚ {OKD-API-URL} OKD เช•เซเชฒเชธเซเชŸเชฐ API URL เช›เซ‡):

oc login {OKD-API-URL}

เชšเชพเชฒเซ‹ เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซเช‚ เชŸเซ‹เช•เชจ เชฎเซ‡เชณเชตเซ€เช:

oc whoami -t

OKD เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เช†เช‚เชคเชฐเชฟเช• เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชฒเซ‰เช— เช‡เชจ เช•เชฐเซ‹ (เช…เชฎเซ‡ เชชเชพเชธเชตเชฐเซเชก เชคเชฐเซ€เช•เซ‡ เช…เช—เชพเช‰เชจเชพ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเซ‡เชณเชตเซ‡เชฒ เชŸเซ‹เช•เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช):

docker login {docker-registry-url}

เชšเชพเชฒเซ‹ เชเชธเซ‡เชฎเซเชฌเชฒ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชจเซ‡ เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ OKD เชชเชฐ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€เช:

./bin/docker-image-tool-upd.sh -r {docker-registry-url}/{repo} -i {image-name} -t {tag} push

เชšเชพเชฒเซ‹ เชคเชชเชพเชธเซ€เช เช•เซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ‡เชฒเซ€ เช›เชฌเซ€ OKD เชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชธเช‚เชฌเช‚เชงเชฟเชค เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เช›เชฌเซ€เช“เชจเซ€ เชธเซ‚เชšเชฟ เชธเชพเชฅเซ‡ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ URL เช–เซ‹เชฒเซ‹ (เช…เชนเซ€เช‚ {project} OpenShift เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เช…เช‚เชฆเชฐเชจเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชจเชพเชฎ เช›เซ‡, {OKD-WEBUI-URL} เช OpenShift เชตเซ‡เชฌ เช•เชจเซเชธเซ‹เชฒเชจเซเช‚ URL เช›เซ‡. ) - https://{OKD-WEBUI-URL}/console /project/{project}/browse/images/{image-name}.

เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชชเซ‹เชกเซเชธเชจเซ‡ เชฐเซ‚เชŸ เชคเชฐเซ€เช•เซ‡ เชšเชฒเชพเชตเชตเชพเชจเชพ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เชพเชฐเซ‹ เชธเชพเชฅเซ‡ เชธเซ‡เชตเชพ เช–เชพเชคเซเช‚ เชฌเชจเชพเชตเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ (เช† เชฎเซเชฆเซเชฆเชพ เชชเชฐ เช…เชฎเซ‡ เชชเช›เซ€เชฅเซ€ เชšเชฐเซเชšเชพ เช•เชฐเซ€เชถเซเช‚):

oc create sa spark -n {project}
oc adm policy add-scc-to-user anyuid -z spark -n {project}

เชšเชพเชฒเซ‹ OKD เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเซ€เช, เชฌเชจเชพเชตเซ‡เชฒ เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เช:

 /opt/spark/bin/spark-submit --name spark-test --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL}  local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar

เช…เชนเซ€เช‚:

โ€”เชจเชพเชฎ โ€” เช•เชพเชฐเซเชฏเชจเซเช‚ เชจเชพเชฎ เชœเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซ€เชธ เชถเซ€เช‚เช—เซ‹เชจเชพ เชจเชพเชฎเชจเซ€ เชฐเชšเชจเชพเชฎเชพเช‚ เชญเชพเช— เชฒเซ‡เชถเซ‡;

โ€”เช•เซเชฒเชพเชธ โ€” เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเช‡เชฒเชจเซ‹ เชตเชฐเซเช—, เชœเซเชฏเชพเชฐเซ‡ เช•เชพเชฐเซเชฏ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡;

โ€”conf โ€” เชธเซเชชเชพเชฐเซเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชชเชฐเชฟเชฎเชพเชฃเซ‹;

spark.executor.instances โ€” เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชพเชฐเซเช• เชเช•เซเชเชฟเช•เซเชฏเซเชŸเชฐเซเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ;

spark.kubernetes.authenticate.driver.serviceAccountName - เชชเซ‹เชกเซเชธ เชฒเซ‹เชจเซเชš เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸเชจเซเช‚ เชจเชพเชฎ (เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ API เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชธเซเชฐเช•เซเชทเชพ เชธเช‚เชฆเชฐเซเชญ เช…เชจเซ‡ เช•เซเชทเชฎเชคเชพเช“เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพ);

spark.kubernetes.namespace โ€” Kubernetes เชจเซ‡เชฎเชธเซเชชเซ‡เชธ เชœเซ‡เชฎเชพเช‚ เชกเซเชฐเชพเช‡เชตเชฐ เช…เชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเชฐ เชชเซ‹เชกเซเชธ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡;

spark.submit.deployMode โ€” เชธเซเชชเชพเชฐเซเช• เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟ (เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ โ€œเช•เซเชฒเชธเซเชŸเชฐโ€ เชฎเชพเชŸเซ‡, เชธเซเชชเชพเชฐเซเช• เช“เชชเชฐเซ‡เชŸเชฐ เช…เชจเซ‡ เชธเซเชชเชพเชฐเซเช• โ€œเช•เซเชฒเชพเชฏเชจเซเชŸโ€เชจเชพ เชชเช›เซ€เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡);

spark.kubernetes.container.image - เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชชเซ‹เชกเซเชธ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡;

spark.master โ€” Kubernetes API URL (เชฌเชพเชนเซเชฏ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช›เซ‡ เชคเซ‡เชฅเซ€ เชเช•เซเชธเซ‡เชธ เชธเซเชฅเชพเชจเชฟเช• เชฎเชถเซ€เชจเชฅเซ€ เชฅเชพเชฏ เช›เซ‡);

local:// เช เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœเชจเซ€ เช…เช‚เชฆเชฐ เชเช•เซเชเซ‡เช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชธเซเชชเชพเชฐเซเช•เชจเซ‹ เชฎเชพเชฐเซเช— เช›เซ‡.

เช…เชฎเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค OKD เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชฐ เชœเชˆเช เช›เซ€เช เช…เชจเซ‡ เชฌเชจเชพเชตเซ‡เชฒ เชชเซ‹เชกเซเชธเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€เช เช›เซ€เช - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods.

เชตเชฟเช•เชพเชธ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช…เชจเซเชฏ เชตเชฟเช•เชฒเซเชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช•เชจเซ€ เชเช• เชธเชพเชฎเชพเชจเซเชฏ เชฌเซ‡เช เชˆเชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชคเชฎเชพเชฎ เช•เชพเชฐเซเชฏเซ‹ เชฆเซเชตเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเช‡เชฒเซ‹เชจเชพ เชธเซเชจเซ‡เชชเชถเซ‹เชŸเชจเซ‡ เชฌเชพเชนเซเชฏ เชธเซเชŸเซ‹เชฐเซ‡เชœ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, Hadoop) เชชเชฐ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชเช• เชฒเชฟเช‚เช• เชคเชฐเซ€เช•เซ‡ เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ เช•เชฐเซ‹. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชคเชฎเซ‡ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœเซ€เชธเชจเซ‡ เชชเซเชจเชƒเชจเชฟเชฐเซเชฎเชพเชฃ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเชพ เชตเชฟเชตเชฟเชง เชตเชฐเซเชเชจ เชšเชฒเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช›เชฌเซ€เช“ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ WebHDFS เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡. เช…เชฎเซ‡ เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเซ€เช เช›เซ€เช (เช…เชนเซ€เช‚ {host} เช WebHDFS เชธเซ‡เชตเชพเชจเซเช‚ เชนเซ‹เชธเซเชŸ เช›เซ‡, {port} เช WebHDFS เชธเซ‡เชตเชพเชจเซเช‚ เชชเซ‹เชฐเซเชŸ เช›เซ‡, {path-to-file-on-hdfs} เชซเชพเช‡เชฒเชจเซ‹ เช‡เชšเซเช›เชฟเชค เชฎเชพเชฐเซเช— เช›เซ‡ HDFS เชชเชฐ):

curl -i -X PUT "http://{host}:{port}/webhdfs/v1/{path-to-file-on-hdfs}?op=CREATE

เชคเชฎเชจเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡ (เช…เชนเซ€เช‚ {location} เช URL เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชซเชพเช‡เชฒ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡):

HTTP/1.1 307 TEMPORARY_REDIRECT
Location: {location}
Content-Length: 0

เชธเซเชชเชพเชฐเซเช• เชเช•เซเชเซ‡เช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเช‡เชฒเชจเซ‡ HDFS เชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‹ (เช…เชนเซ€เช‚ {path-to-local-file} เชตเชฐเซเชคเชฎเชพเชจ เชนเซ‹เชธเซเชŸ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเช‡เชฒเชจเซ‹ เชชเชพเชฅ เช›เซ‡):

curl -i -X PUT -T {path-to-local-file} "{location}"

เช† เชชเช›เซ€, เช…เชฎเซ‡ HDFS เชชเชฐ เช…เชชเชฒเซ‹เชก เช•เชฐเซ‡เชฒเซ€ เชธเซเชชเชพเชฐเซเช• เชซเชพเช‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช (เช…เชนเซ€เช‚ {class-name} เช เชตเชฐเซเช—เชจเซเช‚ เชจเชพเชฎ เช›เซ‡ เชœเซ‡เชจเซ‡ เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡):

/opt/spark/bin/spark-submit --name spark-test --class {class-name} --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL}  hdfs://{host}:{port}/{path-to-file-on-hdfs}

เช เชจเซ‹เช‚เชงเชตเซเช‚ เชœเซ‹เชˆเช เช•เซ‡ HDFS เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เช…เชจเซ‡ เช•เชพเชฐเซเชฏ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ Dockerfile เช…เชจเซ‡ entrypoint.sh เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ€ เชถเช•เซ‡ เช›เซ‡ - /opt/spark/jars เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช†เชถเซเชฐเชฟเชค เชฒเชพเชˆเชฌเซเชฐเซ‡เชฐเซ€เช“เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ Dockerfile เชฎเชพเช‚ เชเช• เชจเชฟเชฐเซเชฆเซ‡เชถ เช‰เชฎเซ‡เชฐเซ‹ เช…เชจเซ‡ เชเชจเซเชŸเซเชฐเซ€เชชเซ‹เช‡เชจเซเชŸเชฎเชพเช‚ SPARK_CLASSPATH เชฎเชพเช‚ HDFS เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เช•เชฐเซ‹.

เชฌเซ€เชœเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชธ - เช…เชชเชพเชšเซ‡ เชฒเชฟเชตเซ€

เชตเชงเซเชฎเชพเช‚, เชœเซเชฏเชพเชฐเซ‡ เช•เซ‹เชˆ เช•เชพเชฐเซเชฏ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ CI/CD เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเชพ เช…เชฎเชฒเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชถเซเชจ เชŠเชญเซ‹ เชฅเชพเชฏ เช›เซ‡. เช…เชฒเชฌเชคเซเชค, เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชšเชฒเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ เช† CI/CD เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ‡ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เชจเซ‡ CI เชธเชฐเซเชตเชฐ เชเชœเชจเซเชŸเซเชธ/เชฐเชจเชฐเซเชธ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เช…เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ API เชจเซ€ เชเช•เซเชธเซ‡เชธ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฒเช•เซเชทเซเชฏ เช…เชฎเชฒเซ€เช•เชฐเชฃเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชนเซ‹เชธเซเชŸ เช•เชฐเซ‡เชฒเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ REST API เชคเชฐเซ€เช•เซ‡ Apache Livy เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชชเชธเช‚เชฆ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เชคเซ‡เชจเซ€ เชฎเชฆเชฆ เชตเชกเซ‡, เชคเชฎเซ‡ เชจเชฟเชฏเชฎเชฟเชค เช•เชฐเซเชเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡ เช•เซ‹เชˆเชชเชฃ CI เชธเซ‹เชฒเซเชฏเซเชถเชจเชจเชพ เช†เชงเชพเชฐเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชคเซ‡เชจเซเช‚ เชชเซเชฒเซ‡เชธเชฎเซ‡เชจเซเชŸ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ API เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชนเชฒ เช•เชฐเซ‡ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เชšเชฒเชพเชตเชตเซเช‚

เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชฌเซ€เชœเชพ เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เซ‡เชธ เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช - เชŸเซ‡เชธเซเชŸ เชฒเซ‚เชชเชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ CI/CD เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเซเช‚.

Apache Livy เชตเชฟเชถเซ‡ เชฅเซ‹เชกเซเช‚ - เชคเซ‡ เชเช• HTTP เชธเชฐเซเชตเชฐ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชตเซ‡เชฌ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช…เชจเซ‡ RESTful API เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเชธเชพเชฐ เช•เชฐเซ€เชจเซ‡ เชฐเชฟเชฎเซ‹เชŸเชฒเซ€ เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชชเชฐเช‚เชชเชฐเชพเช—เชค เชฐเซ€เชคเซ‡ เชคเซ‡ HDP เชตเชฟเชคเชฐเชฃเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฏเซ‹เช—เซเชฏ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœเซ‹เชจเชพ เชธเชฎเซ‚เชนเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ OKD เช…เชฅเชตเชพ เช…เชจเซเชฏ เช•เซ‹เชˆเชชเชฃ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชฎเชพเช‚ เชชเชฃ เชœเชฎเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช† เชเช• - github.com/ttauveron/k8s-big-data-experiments/tree/master/livy-spark-2.3. เช…เชฎเชพเชฐเชพ เช•เซ‡เชธ เชฎเชพเชŸเซ‡, เชจเซ€เชšเซ‡เชจเซ€ เชกเซ‹เช•เชฐเชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชธเซเชชเชพเชฐเซเช• เชธเช‚เชธเซเช•เชฐเชฃ 2.4.5 เชธเชนเชฟเชค, เชธเชฎเชพเชจ เชกเซ‹เช•เชฐ เช›เชฌเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€:

FROM java:8-alpine

ENV SPARK_HOME=/opt/spark
ENV LIVY_HOME=/opt/livy
ENV HADOOP_CONF_DIR=/etc/hadoop/conf
ENV SPARK_USER=spark

WORKDIR /opt

RUN apk add --update openssl wget bash && 
    wget -P /opt https://downloads.apache.org/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz && 
    tar xvzf spark-2.4.5-bin-hadoop2.7.tgz && 
    rm spark-2.4.5-bin-hadoop2.7.tgz && 
    ln -s /opt/spark-2.4.5-bin-hadoop2.7 /opt/spark

RUN wget http://mirror.its.dal.ca/apache/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip && 
    unzip apache-livy-0.7.0-incubating-bin.zip && 
    rm apache-livy-0.7.0-incubating-bin.zip && 
    ln -s /opt/apache-livy-0.7.0-incubating-bin /opt/livy && 
    mkdir /var/log/livy && 
    ln -s /var/log/livy /opt/livy/logs && 
    cp /opt/livy/conf/log4j.properties.template /opt/livy/conf/log4j.properties

ADD livy.conf /opt/livy/conf
ADD spark-defaults.conf /opt/spark/conf/spark-defaults.conf
ADD entrypoint.sh /entrypoint.sh

ENV PATH="/opt/livy/bin:${PATH}"

EXPOSE 8998

ENTRYPOINT ["/entrypoint.sh"]
CMD ["livy-server"]

เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒ เช‡เชฎเซ‡เชœ เชคเชฎเชพเชฐเชพ เชนเชพเชฒเชจเชพ เชกเซ‹เช•เชฐ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชฌเชจเชพเชตเซ€ เช…เชจเซ‡ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช†เช‚เชคเชฐเชฟเช• OKD เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€. เชคเซ‡เชจเซ‡ เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชจเซ€เชšเซ‡เชจเชพ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ ({registry-url} - เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซเช‚ URL, {image-name} - เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชจเซเช‚ เชจเชพเชฎ, {tag} - Docker เช‡เชฎเซ‡เชœ เชŸเซ…เช—, {livy-url} - เช‡เชšเซเช›เชฟเชค URL เชœเซเชฏเชพเช‚ เชธเชฐเซเชตเชฐ เชธเซเชฒเชญ Livy เชนเชถเซ‡; เชœเซ‹ Red Hat OpenShift เชจเซ‹ เช‰เชชเชฏเซ‹เช— Kubernetes เชตเชฟเชคเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‹ โ€œเชฐเซ‚เชŸโ€ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซเชฏเชฅเชพ เชจเซ‹เชกเชชเซ‹เชฐเซเชŸ เชชเซเชฐเช•เชพเชฐเชจเชพ เช…เชจเซเชฐเซ‚เชช เชชเซเชฐเชตเซ‡เชถ เช…เชฅเชตเชพ เชธเซ‡เชตเชพ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡):

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    component: livy
  name: livy
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      component: livy
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        component: livy
    spec:
      containers:
        - command:
            - livy-server
          env:
            - name: K8S_API_HOST
              value: localhost
            - name: SPARK_KUBERNETES_IMAGE
              value: 'gnut3ll4/spark:v1.0.14'
          image: '{registry-url}/{image-name}:{tag}'
          imagePullPolicy: Always
          name: livy
          ports:
            - containerPort: 8998
              name: livy-rest
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /var/log/livy
              name: livy-log
            - mountPath: /opt/.livy-sessions/
              name: livy-sessions
            - mountPath: /opt/livy/conf/livy.conf
              name: livy-config
              subPath: livy.conf
            - mountPath: /opt/spark/conf/spark-defaults.conf
              name: spark-config
              subPath: spark-defaults.conf
        - command:
            - /usr/local/bin/kubectl
            - proxy
            - '--port'
            - '8443'
          image: 'gnut3ll4/kubectl-sidecar:latest'
          imagePullPolicy: Always
          name: kubectl
          ports:
            - containerPort: 8443
              name: k8s-api
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: spark
      serviceAccountName: spark
      terminationGracePeriodSeconds: 30
      volumes:
        - emptyDir: {}
          name: livy-log
        - emptyDir: {}
          name: livy-sessions
        - configMap:
            defaultMode: 420
            items:
              - key: livy.conf
                path: livy.conf
            name: livy-config
          name: livy-config
        - configMap:
            defaultMode: 420
            items:
              - key: spark-defaults.conf
                path: spark-defaults.conf
            name: livy-config
          name: spark-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: livy-config
data:
  livy.conf: |-
    livy.spark.deploy-mode=cluster
    livy.file.local-dir-whitelist=/opt/.livy-sessions/
    livy.spark.master=k8s://http://localhost:8443
    livy.server.session.state-retain.sec = 8h
  spark-defaults.conf: 'spark.kubernetes.container.image        "gnut3ll4/spark:v1.0.14"'
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: livy
  name: livy
spec:
  ports:
    - name: livy-rest
      port: 8998
      protocol: TCP
      targetPort: 8998
  selector:
    component: livy
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: livy
  name: livy
spec:
  host: {livy-url}
  port:
    targetPort: livy-rest
  to:
    kind: Service
    name: livy
    weight: 100
  wildcardPolicy: None

เชคเซ‡เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช…เชจเซ‡ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซ‹เชก เชฒเซ‹เชจเซเชš เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฒเชฟเชตเซ€ เช—เซเชฐเชพเชซเชฟเช•เชฒ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชฒเชฟเช‚เช• เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช›เซ‡: http://{livy-url}/ui. เชฒเชฟเชตเซ€ เชธเชพเชฅเซ‡, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเชจเซ‡ REST เชตเชฟเชจเช‚เชคเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชชเซ‹เชธเซเชŸเชฎเซ‡เชจ. เชตเชฟเชจเช‚เชคเซ€เช“ เชธเชพเชฅเซ‡เชจเชพ เชธเช‚เช—เซเชฐเชนเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชจเซ€เชšเซ‡ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ (เชฒเซ‰เชจเซเชš เช•เชฐเซ‡เชฒเชพ เช•เชพเชฐเซเชฏเชจเชพ เช‘เชชเชฐเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชšเชฒเซ‹ เชธเชพเชฅเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชฆเชฒเซ€เชฒเซ‹ "args" เชเชฐเซ‡เชฎเชพเช‚ เชชเชธเชพเชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡):

{
    "info": {
        "_postman_id": "be135198-d2ff-47b6-a33e-0d27b9dba4c8",
        "name": "Spark Livy",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "item": [
        {
            "name": "1 Submit job with jar",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{nt"file": "local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar", nt"className": "org.apache.spark.examples.SparkPi",nt"numExecutors":1,nt"name": "spark-test-1",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt}n}"
                },
                "url": {
                    "raw": "http://{livy-url}/batches",
                    "protocol": "http",
                    "host": [
                        "{livy-url}"
                    ],
                    "path": [
                        "batches"
                    ]
                }
            },
            "response": []
        },
        {
            "name": "2 Submit job without jar",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{nt"file": "hdfs://{host}:{port}/{path-to-file-on-hdfs}", nt"className": "{class-name}",nt"numExecutors":1,nt"name": "spark-test-2",nt"proxyUser": "0",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt},nt"args": [ntt"HADOOP_CONF_DIR=/opt/spark/hadoop-conf",ntt"MASTER=k8s://https://kubernetes.default.svc:8443"nt]n}"
                },
                "url": {
                    "raw": "http://{livy-url}/batches",
                    "protocol": "http",
                    "host": [
                        "{livy-url}"
                    ],
                    "path": [
                        "batches"
                    ]
                }
            },
            "response": []
        }
    ],
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "id": "41bea1d0-278c-40c9-ad42-bf2e6268897d",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        },
        {
            "listen": "test",
            "script": {
                "id": "3cdd7736-a885-4a2d-9668-bd75798f4560",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        }
    ],
    "protocolProfileBehavior": {}
}

เชšเชพเชฒเซ‹ เชธเช‚เช—เซเชฐเชนเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชฅเชฎ เชตเชฟเชจเช‚เชคเซ€เชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ€เช, OKD เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชœเชพเช“ เช…เชจเซ‡ เชคเชชเชพเชธเซ‹ เช•เซ‡ เช•เชพเชฐเซเชฏ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชถเชฐเซ‚ เชฅเชฏเซเช‚ เช›เซ‡ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เชฒเชฟเชตเซ€ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ (http://{livy-url}/ui) เชฎเชพเช‚ เชเช• เชธเชคเซเชฐ เชฆเซ‡เช–เชพเชถเซ‡, เชœเซ‡เชฎเชพเช‚ เชฒเชฟเชตเซ€ API เช…เชฅเชตเชพ เช—เซเชฐเชพเชซเชฟเช•เชฒ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เช•เชพเชฐเซเชฏเชจเซ€ เชชเซเชฐเช—เชคเชฟเชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชธเชคเซเชฐเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชฒเซ‹เช—

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชฌเชคเชพเชตเซ€เช เช•เซ‡ เชฒเชฟเชตเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชฒเชฟเชตเซ€ เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡ เชชเซ‹เชกเชจเซ€ เช…เช‚เชฆเชฐ เชฒเชฟเชตเซ€ เช•เชจเซเชŸเซ‡เชจเชฐเชจเชพ เชฒเซ‹เช—เชจเซ€ เชคเชชเชพเชธ เช•เชฐเซ€เช - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab=logs. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เช†เชชเชฃเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ โ€œlivyโ€ เชจเชพเชฎเชจเชพ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ Livy REST API เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชเช• เชธเซเชชเชพเชฐเซเช•-เชธเชฌเชฎเชฟเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช†เชชเชฃเซ‡ เช‰เชชเชฐ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เช›เซ‡ (เช…เชนเซ€เช‚ {livy-pod-name} เช เชฌเชจเชพเชตเซ‡เชฒ เชชเซ‹เชกเชจเซเช‚ เชจเชพเชฎ เช›เซ‡. เชฒเชฟเชตเซ€ เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡). เชธเช‚เช—เซเชฐเชน เชเช• เชฌเซ€เชœเซ€ เช•เซเชตเซ‡เชฐเซ€ เชชเชฃ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชเชตเชพ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ เชœเซ‡ เชฒเชฟเชตเซ€ เชธเชฐเซเชตเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซเชชเชพเชฐเซเช• เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒเชจเซ‡ เชฐเชฟเชฎเซ‹เชŸเชฒเซ€ เชนเซ‹เชธเซเชŸ เช•เชฐเซ‡ เช›เซ‡.

เชคเซเชฐเซ€เชœเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชธ - เชธเซเชชเชพเชฐเซเช• เช“เชชเชฐเซ‡เชŸเชฐ

เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ เช•เชพเชฐเซเชฏเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เชจเชฟเชฏเชฎเชฟเชคเชชเชฃเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชถเซเชจ เชŠเชญเซ‹ เชฅเชพเชฏ เช›เซ‡. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชจเชฟเชฏเชฎเชฟเชคเชชเชฃเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฎเซ‚เชณ เชฐเซ€เชค เช เช•เซเชฐเซ‹เชจเชœเซ‹เชฌ เชเชจเซเชŸเชฟเชŸเซ€ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชชเชฐเช‚เชคเซ เช† เช•เซเชทเชฃเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช“เชชเชฐเซ‡เชŸเชฐเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช–เซ‚เชฌ เชœ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เช›เซ‡ เช…เชจเซ‡ เชธเซเชชเชพเชฐเซเช• เชฎเชพเชŸเซ‡ เชเช•เชฆเชฎ เชชเชฐเชฟเชชเช•เซเชต เช“เชชเชฐเซ‡เชŸเชฐ เช›เซ‡, เชœเซ‡ เชชเชฃ เช›เซ‡. เชเชจเซเชŸเชฐเชชเซเชฐเชพเช‡เช-เชฒเซ‡เชตเชฒ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธเชฎเชพเช‚ เชตเชชเชฐเชพเชฏ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฒเชพเช‡เชŸเชฌเซ‡เชจเซเชก เชซเชพเชธเซเชŸเชกเซ‡เชŸเชพ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ). เช…เชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ€เช เช›เซ€เช - เชธเซเชชเชพเชฐเซเช•เชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชฅเชฟเชฐ เชธเช‚เชธเซเช•เชฐเชฃ (2.4.5)เชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชตเชฟเช•เชฒเซเชชเซ‹ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เช†เช—เชพเชฎเซ€ เชฎเซเช–เซเชฏ เชธเช‚เชธเซเช•เชฐเชฃ (3.0.0) เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเชฎเชฐเซเชฅเชจ เชœเชพเชนเซ‡เชฐ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ€ เชชเซเชฐเช•เชพเชถเชจ เชคเชพเชฐเซ€เช– เช…เชœเชพเชฃ เช›เซ‡. . เชธเซเชชเชพเชฐเซเช• เช“เชชเชฐเซ‡เชŸเชฐ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชตเชฟเช•เชฒเซเชชเซ‹ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชธเซเชชเชพเชฐเซเช• เชชเซ‹เชกเซเชธเชฎเชพเช‚ Hadoop เชเช•เซเชธเซ‡เชธ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเชพเชฅเซ‡ เช•เซ‹เชจเซเชซเชฟเช—เชฎเซ‡เชชเชจเซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ€เชจเซ‡) เช…เชจเซ‡ เชจเชฟเชฏเชฎเชฟเชค เชฐเซ€เชคเซ‡ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เช† เช–เชพเชฎเซ€เชจเซ‡ เชตเชณเชคเชฐ เช†เชชเซ‡ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เช…เชชเชพเชšเซ‡ เชธเซเชชเชพเชฐเซเช• เชšเชฒเชพเชตเชตเซเช‚
เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชคเซเชฐเซ€เชœเชพ เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เซ‡เชธ เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ€เช - เช‰เชคเซเชชเชพเชฆเชจ เชฒเซ‚เชชเชฎเชพเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชจเชฟเชฏเชฎเชฟเชคเชชเชฃเซ‡ เชšเชฒเชพเชตเซ‹.

เชธเซเชชเชพเชฐเซเช• เช“เชชเชฐเซ‡เชŸเชฐ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เช›เซ‡ เช…เชจเซ‡ เช—เซ‚เช—เชฒ เช•เซเชฒเชพเช‰เชก เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎเชจเซ€ เช…เช‚เชฆเชฐ เชตเชฟเช•เชธเชฟเชค เช›เซ‡ - github.com/GoogleCloudPlatform/spark-on-k8s-operator. เชคเซ‡เชจเซ€ เชธเซเชฅเชพเชชเชจเชพ 3 เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

  1. เชฒเชพเช‡เชŸเชฌเซ‡เชจเซเชก เชซเชพเชธเซเชŸเชกเซ‡เชŸเชพ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ/เช•เซเชฒเชพเช‰เชกเชซเซเชฒเซ‹เชจเชพ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡;
  2. เชนเซ‡เชฒเซเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช—:
    helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
    helm install incubator/sparkoperator --namespace spark-operator
    	

  3. เชธเชคเซเชคเชพเชตเชพเชฐ เชญเช‚เชกเชพเชฐเชฎเชพเช‚เชฅเซ€ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ (https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/tree/master/manifest). เชคเซ‡ เชจเซ€เชšเซ‡เชจเชพเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡ - เช•เซเชฒเชพเช‰เชกเชซเซเชฒเซ‹เชฎเชพเช‚ API เชธเช‚เชธเซเช•เชฐเชฃ v1beta1 เชธเชพเชฅเซ‡ เช“เชชเชฐเซ‡เชŸเชฐ เชถเชพเชฎเซ‡เชฒ เช›เซ‡. เชœเซ‹ เช† เชชเซเชฐเช•เชพเชฐเชจเชพ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‹ เชธเซเชชเชพเชฐเซเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชตเชฐเซเชฃเชจเซ‹ เชฏเซ‹เช—เซเชฏ API เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฅเซ‡ Git เชฎเชพเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชŸเซ…เช—เซเชธ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชนเซ‹เชตเชพ เชœเซ‹เชˆเช, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, "v1beta1-0.9.0-2.4.0". เช“เชชเชฐเซ‡เชŸเชฐเชจเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ "เชธเช‚เชธเซเช•เชฐเชฃ" เชถเชฌเซเชฆเช•เซ‹เชถเชฎเชพเช‚ เช“เชชเชฐเซ‡เชŸเชฐเชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ CRD เชจเชพ เชตเชฐเซเชฃเชจเชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡:
    oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
    	

เชœเซ‹ เช‘เชชเชฐเซ‡เชŸเชฐ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เชนเซ‹เชฏ, เชคเซ‹ เชธเช‚เชฌเช‚เชงเชฟเชค เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช• เช‘เชชเชฐเซ‡เชŸเชฐ เชธเชพเชฅเซ‡เชจเซ‹ เชเช• เชธเช•เซเชฐเชฟเชฏ เชชเซ‹เชก เชฆเซ‡เช–เชพเชถเซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซเชฒเชพเช‰เชกเชซเซเชฒเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช•เซเชฒเชพเช‰เชกเชซเซเชฒเซ‹ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เช•เซเชฒเชพเช‰เชกเชซเซเชฒเซ‹-เชเชซเชกเซ€เชชเซ€-เชธเซเชชเชพเชฐเซเช•เซ‹เชชเชฐเซ‡เชŸเชฐ) เช…เชจเซ‡ "เชธเซเชชเชพเชฐเซเช• เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเซเชธ" เชจเชพเชฎเชจเชพ เช…เชจเซเชฐเซ‚เชช เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฐเชฟเชธเซ‹เชฐเซเชธ เชชเซเชฐเช•เชพเชฐ เชฆเซ‡เช–เชพเชถเซ‡. . เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เช‰เชชเชฒเชฌเซเชง เชธเซเชชเชพเชฐเซเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹เชจเซเช‚ เช…เชจเซเชตเซ‡เชทเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

oc get sparkapplications -n {project}

เชธเซเชชเชพเชฐเซเช• เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ 3 เชตเชธเซเชคเซเช“ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  • เชเช• เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœ เชฌเชจเชพเชตเซ‹ เชœเซ‡เชฎเชพเช‚ เชคเชฎเชพเชฎ เชœเชฐเซ‚เชฐเซ€ เชฒเชพเชˆเชฌเซเชฐเซ‡เชฐเซ€เช“ เชคเซ‡เชฎเชœ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช…เชจเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชซเชพเชˆเชฒเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชฒเช•เซเชทเซเชฏ เชšเชฟเชคเซเชฐเชฎเชพเช‚, เช† เชเช• เช›เชฌเซ€ เช›เซ‡ เชœเซ‡ CI/CD เชธเซเชŸเซ‡เชœ เชชเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เช•เซเชฒเชธเซเชŸเชฐ เชชเชฐ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡;
  • เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚เชฅเซ€ เชธเซเชฒเชญ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‹;
  • "SparkApplication" เชชเซเชฐเช•เชพเชฐ เชธเชพเชฅเซ‡ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‹ เช…เชจเซ‡ เชฒเซ‹เช‚เชš เช•เชฐเชตเชพเชจเชพ เช•เชพเชฐเซเชฏเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‹. เช‰เชฆเชพเชนเชฐเชฃ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชธเชคเซเชคเชพเชตเชพเชฐ เชญเช‚เชกเชพเชฐเชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ (เชฆเชพ.เชค. github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/v1beta1-0.9.0-2.4.0/examples/spark-pi.yaml). เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเซ‹ เชตเชฟเชถเซ‡ เชจเซ‹เช‚เชงเชตเชพ เชฎเชพเชŸเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชฎเซเชฆเซเชฆเชพเช“ เช›เซ‡:
    1. "apiVersion" เชถเชฌเซเชฆเช•เซ‹เชถเชฎเชพเช‚ เช‘เชชเชฐเซ‡เชŸเชฐ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เช…เชจเซเชฐเซ‚เชช API เชธเช‚เชธเซเช•เชฐเชฃ เชธเซ‚เชšเชตเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡;
    2. "metadata.namespace" เชถเชฌเซเชฆเช•เซ‹เชถ เช เชจเชพเชฎเชจเซ€ เชœเช—เซเชฏเชพ เชธเซ‚เชšเชตเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡;
    3. "spec.image" เชถเชฌเซเชฆเช•เซ‹เชถเชฎเชพเช‚ เชธเซเชฒเชญ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชฌเชจเชพเชตเซ‡เชฒ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชจเซเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡;
    4. โ€œspec.mainClassโ€ เชถเชฌเซเชฆเช•เซ‹เชถเชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช• เชŸเชพเชธเซเช• เช•เซเชฒเชพเชธ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช เชœเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡;
    5. เชเช•เซเชเซ‡เช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชœเชพเชฐ เชซเชพเช‡เชฒเชจเซ‹ เชชเชพเชฅ "spec.mainApplicationFile" เชถเชฌเซเชฆเช•เซ‹เชถเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชนเซ‹เชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡;
    6. "spec.sparkVersion" เชถเชฌเซเชฆเช•เซ‹เชทเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ Sparkเชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เชฆเชฐเซเชถเชพเชตเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡;
    7. โ€œspec.driver.serviceAccountโ€ เชกเชฟเช•เซเชถเชจเชฐเซ€เช เช…เชจเซเชฐเซ‚เชช เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชจเซ€ เช…เช‚เชฆเชฐ เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡;
    8. "spec.executor" เชถเชฌเซเชฆเช•เซ‹เชถเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชซเชพเชณเชตเซ‡เชฒ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฆเชฐเซเชถเชพเชตเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡;
    9. "spec.volumeMounts" เชถเชฌเซเชฆเช•เซ‹เชถเชฎเชพเช‚ เชธเซเชฅเชพเชจเชฟเช• เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชธเซเชฅเชพเชจเชฟเช• เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏ เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ (เช…เชนเซ€เช‚ {spark-service-account} เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชธเซ‡เชตเชพ เช–เชพเชคเซเช‚ เช›เซ‡):

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: {project}
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v2.4.0"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 0.1
    coreLimit: "200m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: {spark-service-account}
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

เช† เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชเช• เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชคเชฎเชพเชฐเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฐเซ‹เชฒ เชฌเชพเชˆเชจเซเชกเชฟเช‚เช—เซเชธ เชฌเชจเชพเชตเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡ เชœเซ‡ เชธเซเชชเชพเชฐเซเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ API (เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹) เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชเช•เซเชธเซ‡เชธ เช…เชงเชฟเช•เชพเชฐเซ‹ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชชเซ‹เชกเซเชธ เชฌเชจเชพเชตเชตเชพเชจเชพ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชšเชพเชฒเซ‹ เชœเชฐเซ‚เชฐเซ€ เชญเซ‚เชฎเชฟเช•เชพ เชฌเช‚เชงเชจเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ€เช:

oc adm policy add-role-to-user edit system:serviceaccount:{project}:{spark-service-account} -n {project}

เช เชจเซ‹เช‚เชงเชตเซเช‚ เชชเชฃ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เช† เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃเชฎเชพเช‚ "hadoopConfigMap" เชชเชฐเชฟเชฎเชพเชฃ เชถเชพเชฎเซ‡เชฒ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡ เชคเชฎเชจเซ‡ เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœเชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เชซเชพเช‡เชฒเชจเซ‡ เชชเซเชฐเชฅเชฎ เชธเซเชฅเชพเชจ เช†เชชเซเชฏเชพ เชตเชฟเชจเชพ Hadoop เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเชพเชฅเซ‡ ConfigMap เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชคเซ‡ เชจเชฟเชฏเชฎเชฟเชคเชชเชฃเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เชฏเซ‹เช—เซเชฏ เช›เซ‡ - "เชถเซ‡เชกเซเชฏเซ‚เชฒ" เชชเชฐเชฟเชฎเชพเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เช†เชชเซ‡เชฒ เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชถเซ‡เชกเซเชฏเซ‚เชฒ เชจเชฟเชฐเซเชฆเชฟเชทเซเชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชคเซ‡ เชชเช›เซ€, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‡ spark-pi.yaml เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเชพเชšเชตเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช…เชฎเชพเชฐเชพ Kubernetes เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชฒเชพเช—เซ เช•เชฐเซ€เช เช›เซ€เช:

oc apply -f spark-pi.yaml

เช† "sparkapplications" เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชถเซ‡:

oc get sparkapplications -n {project}
> NAME       AGE
> spark-pi   22h

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชพเชฅเซ‡เชจเซ‹ เชชเซ‹เชก เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชœเซ‡เชจเซ€ เชธเซเชฅเชฟเชคเชฟ เชฌเชจเชพเชตเซ‡เชฒ "เชธเซเชชเชพเชฐเซเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ" เชฎเชพเช‚ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชถเซ‡. เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹:

oc get sparkapplications spark-pi -o yaml -n {project}

เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€, POD "เชชเซ‚เชฐเซเชฃ" เชธเซเชฅเชฟเชคเชฟ เชชเชฐ เชœเชถเซ‡, เชœเซ‡ "เชธเซเชชเชพเชฐเซเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ" เชฎเชพเช‚ เชชเชฃ เช…เชชเชกเซ‡เชŸ เชฅเชถเซ‡. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเซ‹เช— เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เช…เชฅเชตเชพ เชจเซ€เชšเซ‡เชจเชพ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ (เช…เชนเซ€เช‚ {sparkapplications-pod-name} เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒเชพ เช•เชพเชฐเซเชฏเชจเชพ เชชเซ‹เชกเชจเซเช‚ เชจเชพเชฎ เช›เซ‡):

oc logs {sparkapplications-pod-name} -n {project}

เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ sparkctl เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเชฃ เชธเช‚เชšเชพเชฒเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เชคเซ‡เชจเชพ เชธเซเชฐเซ‹เชค เช•เซ‹เชก เชธเชพเชฅเซ‡ เช•เซเชฒเซ‹เชจ เช•เชฐเซ‹, Go เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ เช…เชจเซ‡ เช† เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชฌเชจเชพเชตเซ‹:

git clone https://github.com/GoogleCloudPlatform/spark-on-k8s-operator.git
cd spark-on-k8s-operator/
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar -xzf go1.13.3.linux-amd64.tar.gz
sudo mv go /usr/local
mkdir $HOME/Projects
export GOROOT=/usr/local/go
export GOPATH=$HOME/Projects
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go -version
cd sparkctl
go build -o sparkctl
sudo mv sparkctl /usr/local/bin

เชšเชพเชฒเซ‹ เชšเชพเชฒเชคเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชธเซ‚เชšเชฟเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€เช:

sparkctl list -n {project}

เชšเชพเชฒเซ‹ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชตเชฐเซเชฃเชจ เชฌเชจเชพเชตเซ€เช:

vi spark-app.yaml

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: {project}
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v2.4.0"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1000m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: spark
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

เชšเชพเชฒเซ‹ sparkctl เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชฐเซเชฃเชตเซ‡เชฒ เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเซ€เช:

sparkctl create spark-app.yaml -n {project}

เชšเชพเชฒเซ‹ เชšเชพเชฒเชคเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชธเซ‚เชšเชฟเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€เช:

sparkctl list -n {project}

เชšเชพเชฒเซ‹ เชฒเซ‹เช‚เชš เช•เชฐเชพเชฏเซ‡เชฒ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเชจเซ€ เช˜เชŸเชจเชพเช“เชจเซ€ เชธเซ‚เชšเชฟเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€เช:

sparkctl event spark-pi -n {project} -f

เชšเชพเชฒเซ‹ เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€เช:

sparkctl status spark-pi -n {project}

เชจเชฟเชทเซเช•เชฐเซเชทเชฎเชพเช‚, เชนเซเช‚ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช• (2.4.5) เชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชธเซเชฅเชฟเชฐ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เชถเซ‹เชงเชพเชฏเซ‡เชฒเชพ เช—เซ‡เชฐเชซเชพเชฏเชฆเชพเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚:

  1. เชชเซเชฐเชฅเชฎ เช…เชจเซ‡, เช•เชฆเชพเชš, เชฎเซเช–เซเชฏ เช—เซ‡เชฐเชฒเชพเชญ เช เชกเซ‡เชŸเชพ เชฒเซ‹เช•เซ‡เชฒเชฟเชŸเซ€เชจเซ‹ เช…เชญเชพเชต เช›เซ‡. YARN เชจเซ€ เชคเชฎเชพเชฎ เช–เชพเชฎเซ€เช“ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เชซเชพเชฏเชฆเชพ เชชเชฃ เชนเชคเชพ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชกเซ‡เชŸเชพเชจเซ‡ เช•เซ‹เชก เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพเชจเซ‹ เชธเชฟเชฆเซเชงเชพเช‚เชค (เชกเซ‡เชŸเชพเชฅเซ€ เช•เซ‹เชกเชจเซ‡ เชฌเชฆเชฒเซ‡). เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช†เชญเชพเชฐ, เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชจเซ‹เชกเซเชธ เชชเชฐ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ เชœเซเชฏเชพเช‚ เช—เชฃเชคเชฐเซ€เชฎเชพเช‚ เชธเชพเชฎเซ‡เชฒ เชกเซ‡เชŸเชพ เชธเซเชฅเชฟเชค เชนเชคเซ‹, เช…เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชกเซ‡เชŸเชพ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพเชฎเชพเช‚ เชœเซ‡ เชธเชฎเชฏ เชฒเชพเช—เซเชฏเซ‹ เชนเชคเซ‹ เชคเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช˜เชŸเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เช…เชฎเชจเซ‡ เชธเชฎเช—เซเชฐ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชธเชพเชฎเซ‡เชฒ เชกเซ‡เชŸเชพเชจเซ‡ เช–เชธเซ‡เชกเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซ‡ เช›เซ‡. เชœเซ‹ เชคเซ‡เช“ เชชเซ‚เชฐเชคเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชฎเซ‹เชŸเชพ เชนเซ‹เชฏ, เชคเซ‹ เช•เชพเชฐเซเชฏ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‹ เชธเชฎเชฏ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชตเชงเซ€ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เช•เชพเชฎเชšเชฒเชพเช‰ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฎเชพเชŸเซ‡ เชธเซเชชเชพเชฐเซเช• เชŸเชพเชธเซเช• เช‡เชจเซเชธเซเชŸเชจเซเชธเชจเซ‡ เชซเชพเชณเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชกเชฟเชธเซเช• เชธเซเชชเซ‡เชธเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡. เช† เช—เซ‡เชฐเชฒเชพเชญเชจเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช˜เชŸเชพเชกเซ€ เชถเช•เชพเชฏ เช›เซ‡ เชœเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเชฒเซเช•เซเชธเชฟเชฏเซ‹) เชฎเชพเช‚ เชกเซ‡เชŸเชพ เชธเซเชฅเชพเชจเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเชพ เชจเซ‹เชกเซเชธ เชชเชฐ เชกเซ‡เชŸเชพเชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชจเช•เชฒ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค เช›เซ‡.
  2. เชฌเซ€เชœเซ‹ เชฎเชนเชคเซเชตเชจเซ‹ เช—เซ‡เชฐเชฒเชพเชญ เช เชธเซเชฐเช•เซเชทเชพ เช›เซ‡. เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เชšเชพเชฒเชคเชพ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชฒเช—เชคเซ€ เชธเซเชฐเช•เซเชทเชพ-เชธเช‚เชฌเช‚เชงเชฟเชค เชธเซเชตเชฟเชงเชพเช“ เช…เช•เซเชทเชฎ เช›เซ‡, เช•เชฐเซเชฌเซ‡เชฐเซ‹เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเชคเซเชคเชพเชตเชพเชฐ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เชฎเชพเช‚ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชจเชฅเซ€ (เชœเซ‹เช•เซ‡ เช…เชจเซเชฐเซ‚เชช เชตเชฟเช•เชฒเซเชชเซ‹ เชธเช‚เชธเซเช•เชฐเชฃ 3.0.0 เชฎเชพเช‚ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ, เชœเซ‡เชจเซ‡ เชตเชงเชพเชฐเชพเชจเชพ เช•เชพเชฐเซเชฏเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡), เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชฎเชพเชŸเซ‡ Spark (https://spark.apache.org/docs/2.4.5/security.html) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเช•เซเชค เชฏเชพเชฐเซเชจ, เชฎเซ‡เชธเซ‹เชธ เช…เชจเซ‡ เชธเซเชŸเซ‡เชจเซเชกเช…เชฒเซ‹เชจ เช•เซเชฒเชธเซเชŸเชฐ เช•เซ€ เชธเซเชŸเซ‹เชฐ เชคเชฐเซ€เช•เซ‡ เชฆเซ‡เช–เชพเชฏ เช›เซ‡. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช•เซ‡ เชœเซ‡เชจเชพ เชนเซ‡เช เชณ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡ เชคเซ‡เชจเซ‹ เชธเซ€เชงเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€ - เช…เชฎเซ‡ เชซเช•เซเชค เชคเซ‡ เชธเซ‡เชตเชพ เชเช•เชพเช‰เชจเซเชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เชœเซ‡เชจเชพ เชนเซ‡เช เชณ เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชถเซ‡, เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เช—เซ‹เช เชตเซ‡เชฒ เชธเซเชฐเช•เซเชทเชพ เชจเซ€เชคเชฟเช“เชจเชพ เช†เชงเชพเชฐเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช† เชธเช‚เชฆเชฐเซเชญเซ‡, เช•เชพเช‚ เชคเซ‹ เชฐเซเชŸ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เช‰เชคเซเชชเชพเชฆเช• เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชธเชฒเชพเชฎเชค เชจเชฅเซ€, เช…เชฅเชตเชพ เชฐเซ‡เชจเซเชกเชฎ UID เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ, เชœเซ‡ เชกเซ‡เชŸเชพเชจเชพ เชเช•เซเชธเซ‡เชธ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซเช‚ เชตเชฟเชคเชฐเชฃ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชธเซเชตเชฟเชงเชพเชœเชจเช• เช›เซ‡ (เช† PodSecurity Policies เชฌเชจเชพเชตเซ€เชจเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฒเชฟเช‚เช• เช•เชฐเซ€เชจเซ‡ เช‰เช•เซ‡เชฒเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช…เชจเซเชฐเซ‚เชช เชธเซ‡เชตเชพ เชเช•เชพเช‰เชจเซเชŸเซเชธ). เชนเชพเชฒเชฎเชพเช‚, เช‰เช•เซ‡เชฒ เช เช›เซ‡ เช•เซ‡ เช•เชพเช‚ เชคเซ‹ เชฌเชงเซ€ เชœเชฐเซ‚เชฐเซ€ เชซเชพเชˆเชฒเซ‹เชจเซ‡ เชธเซ€เชงเซ€ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœเชฎเชพเช‚ เชฎเซ‚เช•เซ‹, เช…เชฅเชตเชพ เชคเชฎเชพเชฐเซ€ เชธเช‚เชธเซเชฅเชพเชฎเชพเช‚ เช…เชชเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชฐเชนเชธเซเชฏเซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชพเชฐเซเช• เชฒเซ‹เชจเซเชš เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ‹.
  3. เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซเชชเชพเชฐเซเช• เชœเซ‹เชฌเซเชธ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชธเชคเซเชคเชพเชตเชพเชฐ เชฐเซ€เชคเซ‡ เชนเชœเซ€ เชชเชฃ เชชเซเชฐเชพเชฏเซ‹เช—เชฟเช• เชฎเซ‹เชกเชฎเชพเช‚ เช›เซ‡ เช…เชจเซ‡ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเซ€ เช•เชฒเชพเช•เซƒเชคเชฟเช“เชฎเชพเช‚ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. เช…เชจเซ‡ เช–เชฐเซ‡เช–เชฐ, เชธเชพเชฎเช—เซเชฐเซ€ เชคเซˆเชฏเชพเชฐ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชธเช‚เชธเซเช•เชฐเชฃ 2.3.0 เช…เชจเซ‡ 2.4.5 เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚, เชตเชฐเซเชคเชจ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช…เชฒเช— เชนเชคเซเช‚.

เชšเชพเชฒเซ‹ เช…เชชเชกเซ‡เชŸเซเชธเชจเซ€ เชฐเชพเชน เชœเซ‹เชˆเช - เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชธเซเชชเชพเชฐเซเช• (3.0.0) เชจเซเช‚ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชฌเชนเชพเชฐ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚, เชœเซ‡เชฃเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เชธเซเชชเชพเชฐเซเช•เชจเชพ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช•เชฐเซเชฏเชพ เชนเชคเชพ, เชชเชฐเช‚เชคเซ เช† เชธเช‚เชธเชพเชงเชจ เชธเช‚เชšเชพเชฒเช• เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจเชจเซ€ เชชเซเชฐเชพเชฏเซ‹เช—เชฟเช• เชธเซเชฅเชฟเชคเชฟ เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ€ เชนเชคเซ€. เช•เชฆเชพเชš เช†เช—เชพเชฎเซ€ เช…เชชเชกเซ‡เชŸเซเชธ เชคเชฎเชพเชฐเซ€ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชธเซเชฐเช•เซเชทเชพ เชฎเชพเชŸเซ‡ เชกเชฐเซเชฏเชพ เชตเชฟเชจเชพ เช…เชจเซ‡ เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• เช˜เชŸเช•เซ‹เชจเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เชฐเซ€เชคเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชตเชฟเชจเชพ เชฏเชพเชฐเซเชจเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพ เช…เชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเชฐ เชธเซเชชเชพเชฐเซเช• เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชญเชฒเชพเชฎเชฃ เช•เชฐเชตเชพเชจเซเช‚ เช–เชฐเซ‡เช–เชฐ เชถเช•เซเชฏ เชฌเชจเชพเชตเชถเซ‡.

เชซเชฟเชจ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹