{"id":92305,"date":"2020-08-25T19:42:16","date_gmt":"2020-08-25T17:42:16","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow"},"modified":"2020-08-25T19:42:16","modified_gmt":"2020-08-25T17:42:16","slug":"rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow","title":{"rendered":"Espandere le funzionalit\u00e0 di Spark con MLflow","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438, \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 OTUS \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h8IZ\/\">\u0431\u0430\u0437\u043e\u0432\u044b\u0439<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/jut8\/\">\u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439<\/a><\/noindex>. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c.<\/i><\/b><\/p>\n<p>\n\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/\">MLflow<\/a><\/noindex>.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0431\u0437\u043e\u0440 <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/tracking.html\">MLflow<\/a><\/noindex> \u0441 \u0435\u0433\u043e tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f Spark \u0441 MLflow \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e UDF. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/h3>\n<p>\n\u041c\u044b \u0432 <noindex><a rel=\"nofollow\" href=\"http:\/\/alpha.company\/moonshots\/alpha-health\">Alpha Health<\/a><\/noindex> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043b\u044e\u0434\u044f\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u0441\u0432\u043e\u0435\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438 \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043b\u0435\u0436\u0430\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u043b\u0430 MLflow \u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. <\/p>\n<h3>MLflow<\/h3>\n<p>\n\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c MLflow \u2013 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0431\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c \u043f\u043e data science \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043b\u044e\u0431\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/h2oai\">h2o<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/keras.io\/\">keras<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/mleap-docs.combust.ml\/\">mleap<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/pytorch.org\/\">pytorch<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/scikit-learn.org\/stable\/\">sklearn<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/\">tensorflow<\/a><\/noindex>), \u0432\u044b\u0432\u043e\u0434\u044f \u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c.<\/p>\n<p>MLflow \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430:<\/p>\n<ul>\n<li><b>Tracking <\/b>\u2013 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c: \u043a\u043e\u0434, \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0421\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e.<\/li>\n<li><b>Projects<\/b> \u2013 \u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/sagemaker\/\">SageMaker<\/a><\/noindex>)<\/li>\n<li><b>Models<\/b> \u2013 \u043e\u0431\u0449\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p>MLflow (\u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 alpha-\u0432\u0435\u0440\u0441\u0438\u0438) \u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c.<\/p><\/blockquote>\n<p><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MLflow<\/h3>\n<p>\n\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MLflow \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u044e \u0441\u0440\u0435\u0434\u0443 Python, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pyenv\/pyenv\">PyEnv<\/a><\/noindex> (\u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Python \u043d\u0430 Mac, \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 <noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/chris-zen\/9e61db6924bd37fbe414f648614ca4c5\">\u0441\u044e\u0434\u0430<\/a><\/noindex>). \u0422\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443, \u043a\u0443\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<pre><code class=\"python\">```\npyenv install 3.7.0\npyenv global 3.7.0 # Use Python 3.7\nmkvirtualenv mlflow # Create a Virtual Env with Python 3.7\nworkon mlflow\n```<\/code><\/pre>\n<p>\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<pre><code class=\"python\">```\npip install mlflow==0.7.0 \n            Cython==0.29  \n            numpy==1.14.5 \n            pandas==0.23.4 \n            pyarrow==0.11.0\n```<\/code><\/pre>\n<p><\/p>\n<blockquote><p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c PyArrow \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0430\u043a\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u0430\u043a UDF. \u0412\u0435\u0440\u0441\u0438\u0438 PyArrow \u0438 Numpy \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439.<\/p><\/blockquote>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Tracking UI<\/h3>\n<p>\nMLflow Tracking \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/rest-api.html#rest-api\">REST<\/a><\/noindex> API. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0438 (localhost, <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/tracking.html#amazon-s3\">Amazon S3<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/tracking.html#azure-blob-storage\">Azure Blob Storage<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/tracking.html#google-cloud-storage\">Google Cloud Storage<\/a><\/noindex> \u0438\u043b\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/tracking.html#sftp-server\">SFTP-\u0441\u0435\u0440\u0432\u0435\u0440<\/a><\/noindex>). \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 Alpha Health \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f AWS, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 S3.<\/p>\n<pre><code class=\"python\"># Running a Tracking Server\nmlflow server \n    --file-store \/tmp\/mlflow\/fileStore \n    --default-artifact-root s3:\/\/&lt;bucket&gt;\/mlflow\/artifacts\/ \n    --host localhost\n    --port 5000<\/code><\/pre>\n<p>\nMLflow \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u0424\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u2013 \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u0417\u0434\u0435\u0441\u044c \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>\/tmp<\/code>.<\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 mlflow \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0438 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 UDF, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u0442\u044c \u0434\u043e \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<blockquote><p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e Tracking UI \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Tracking UI \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 EC2, \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 MLflow \u0443 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a S3 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432. <\/p><\/blockquote>\n<p>\n<img decoding=\"async\" alt=\"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow\" src=\"\/wp-content\/uploads\/2020\/08\/8450cf4261e0009bbf6af543cd5d7ad2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Tracking UI \u0445\u0440\u0430\u043d\u0438\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 S3<\/i><\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/h3>\n<p>\n\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c Tracking-\u0441\u0435\u0440\u0432\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 wine \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 MLflow \u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mlflow\/mlflow\/blob\/master\/examples\/sklearn_elasticnet_wine\/train.py\">Sklearn<\/a><\/noindex>.<\/p>\n<pre><code class=\"xml\">MLFLOW_TRACKING_URI=http:\/\/localhost:5000 python wine_quality.py \n  --alpha 0.9\n  --l1_ration 0.5\n  --wine_file .\/data\/winequality-red.csv<\/code><\/pre>\n<p>\n\u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, MLflow \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043b\u0443\u0447\u0448\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0438\u0441\u044c \u0432 Tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438\u043b\u0438 \u043f\u043e\u043d\u044f\u0432, \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u043b\u043e\u0433\u0430\u043c\u0438 git hash \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432. <\/p>\n<pre><code class=\"python\">with mlflow.start_run():\n\n    ... model ...\n\n    mlflow.log_param(&quot;source&quot;, wine_path)\n    mlflow.log_param(&quot;alpha&quot;, alpha)\n    mlflow.log_param(&quot;l1_ratio&quot;, l1_ratio)\n\n    mlflow.log_metric(&quot;rmse&quot;, rmse)\n    mlflow.log_metric(&quot;r2&quot;, r2)\n    mlflow.log_metric(&quot;mae&quot;, mae)\n\n    mlflow.set_tag('domain', 'wine')\n    mlflow.set_tag('predict', 'quality')\n    mlflow.sklearn.log_model(lr, &quot;model&quot;)<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow\" src=\"\/wp-content\/uploads\/2020\/08\/2717b6428a6895c179725a0e1882d67b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u0418\u0442\u0435\u0440\u0430\u0446\u0438\u0438 wine<\/i><\/p>\n<h3>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p><\/p>\n<blockquote><p>Tracking-\u0441\u0435\u0440\u0432\u0435\u0440 MLflow, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u201cmlflow server\u201d, \u0438\u043c\u0435\u0435\u0442 REST API \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u00abMLFLOW_TRACKING_URI\u00bb \u0438 tracking API MLflow \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0436\u0435\u0442\u0441\u044f \u0441 tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c\/\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043b\u043e\u0433\u043e\u0432 \u0438 \u0442.\u0434.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/tracking.html#running-a-tracking-server\">Docs\/\/ Running a tracking server<\/a><\/noindex><\/p><\/blockquote>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 tracking-\u0441\u0435\u0440\u0432\u0435\u0440 (\u0441\u043c. \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430) \u0438 Run ID \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p><img decoding=\"async\" alt=\"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow\" src=\"\/wp-content\/uploads\/2020\/08\/63060882817edfbc4fc33c649978eec6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Run ID<\/i><\/p>\n<pre><code class=\"xml\"># Serve a sklearn model through 127.0.0.0:5005\nMLFLOW_TRACKING_URI=http:\/\/0.0.0.0:5000 mlflow sklearn serve \n  --port 5005  \n  --run_id 0f8691808e914d1087cf097a08730f17 \n  --model-path model<\/code><\/pre>\n<p>\n\u0414\u043b\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 MLflow serve, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a Tracking UI, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0432 <code>--run_id<\/code>.<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 Tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<pre><code class=\"python\"># Query Tracking Server Endpoint\ncurl -X POST \n  http:\/\/127.0.0.1:5005\/invocations \n  -H 'Content-Type: application\/json' \n  -d '[\n\t{\n\t\t&quot;fixed acidity&quot;: 3.42, \n\t\t&quot;volatile acidity&quot;: 1.66, \n\t\t&quot;citric acid&quot;: 0.48, \n\t\t&quot;residual sugar&quot;: 4.2, \n\t\t&quot;chloridessssss&quot;: 0.229, \n\t\t&quot;free sulfur dsioxide&quot;: 19, \n\t\t&quot;total sulfur dioxide&quot;: 25, \n\t\t&quot;density&quot;: 1.98, \n\t\t&quot;pH&quot;: 5.33, \n\t\t&quot;sulphates&quot;: 4.39, \n\t\t&quot;alcohol&quot;: 10.8\n\t}\n]'\n\n&gt; {&quot;predictions&quot;: [5.825055635303461]}<\/code><\/pre>\n<p><\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u0437 Spark<\/h3>\n<p>\n\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e Tracking-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438\u0445 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430serve (\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <noindex><a rel=\"nofollow\" href=\"https:\/\/mlflow.org\/docs\/latest\/models.html#local\">mlflow \/\/ docs \/\/ models # local<\/a><\/noindex>), \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 Spark (batch \u0438\u043b\u0438 streaming) \u2013 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0432 \u043e\u0444\u0444\u043b\u0430\u0439\u043d\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u0432\u0430\u0448\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 Spark \u0438 MLflow \u043f\u043e\u043a\u0430\u0436\u0443\u0442 \u0441\u0435\u0431\u044f \u0441 \u043b\u0443\u0447\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c PySpark + Jupyter + Spark<\/h3>\n<p><\/p>\n<blockquote><p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.sicara.com\/get-started-pyspark-jupyter-guide-tutorial-ae2fe84f594f\">Get started PySpark \u2014 Jupyter<\/a><\/noindex><\/p><\/blockquote>\n<p>\n\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438 MLflow \u043a \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u043c Spark, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 Jupyter notebooks \u0441 PySpark.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/downloads.html\">Apache Spark<\/a><\/noindex>:<\/p>\n<pre><code class=\"python\">cd ~\/Downloads\/\ntar -xzf spark-2.4.3-bin-hadoop2.7.tgz\nmv ~\/Downloads\/spark-2.4.3-bin-hadoop2.7 ~\/\nln -s ~\/spark-2.4.3-bin-hadoop2.7 ~\/spark\u0300<\/code><\/pre>\n<p>\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 PySpark \u0438 Jupyter \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443:<\/p>\n<pre><code class=\"python\">pip install pyspark jupyter<\/code><\/pre>\n<p>\n\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b:<\/p>\n<pre><code class=\"python\">export SPARK_HOME=~\/spark\nexport PATH=$SPARK_HOME\/bin:$PATH\nexport PYSPARK_DRIVER_PYTHON=jupyter\nexport PYSPARK_DRIVER_PYTHON_OPTS=&quot;notebook --notebook-dir=${HOME}\/Projects\/notebooks&quot;<\/code><\/pre>\n<p>\n\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 <code>notebook-dir<\/code>, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0448\u0438 notebook-\u0438 \u0432 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u043f\u043a\u0435.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Jupyter \u0438\u0437 PySpark<\/h3>\n<p>\n\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Jupiter \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 PySpark, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c Jupyter notebook \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 PySpark.<\/p>\n<pre><code class=\"python\">(mlflow) afranzi:~$ pyspark\n[I 19:05:01.572 NotebookApp] sparkmagic extension enabled!\n[I 19:05:01.573 NotebookApp] Serving notebooks from local directory: \/Users\/afranzi\/Projects\/notebooks\n[I 19:05:01.573 NotebookApp] The Jupyter Notebook is running at:\n[I 19:05:01.573 NotebookApp] http:\/\/localhost:8888\/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745\n[I 19:05:01.573 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).\n[C 19:05:01.574 NotebookApp]\n\n    Copy\/paste this URL into your browser when you connect for the first time,\n    to login with a token:\n        http:\/\/localhost:8888\/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow\" src=\"\/wp-content\/uploads\/2020\/08\/0414e814e9c250b9934442d06418a78a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, MLflow \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 S3. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0430\u0441 \u0432 \u0440\u0443\u043a\u0430\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c, \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u043a\u0430\u043a UDF \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f <code>mlflow.pyfunc<\/code>.<\/p>\n<pre><code class=\"python\">import mlflow.pyfunc\n\nmodel_path = 's3:\/\/&lt;bucket&gt;\/mlflow\/artifacts\/1\/0f8691808e914d1087cf097a08730f17\/artifacts\/model'\nwine_path = '\/Users\/afranzi\/Projects\/data\/winequality-red.csv'\nwine_udf = mlflow.pyfunc.spark_udf(spark, model_path)\n\ndf = spark.read.format(&quot;csv&quot;).option(&quot;header&quot;, &quot;true&quot;).option('delimiter', ';').load(wine_path)\ncolumns = [ &quot;fixed acidity&quot;, &quot;volatile acidity&quot;, &quot;citric acid&quot;,\n            &quot;residual sugar&quot;, &quot;chlorides&quot;, &quot;free sulfur dioxide&quot;,\n            &quot;total sulfur dioxide&quot;, &quot;density&quot;, &quot;pH&quot;,\n            &quot;sulphates&quot;, &quot;alcohol&quot;\n          ]\n          \ndf.withColumn('prediction', wine_udf(*columns)).show(100, False)<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow\" src=\"\/wp-content\/uploads\/2020\/08\/cd590c09722033404a70f0f2a3942015.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <i>PySpark \u2013 \u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0438\u043d\u0430<\/i><\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PySpark \u0441 MLflow, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0438\u043d\u0430 \u043d\u0430 \u0432\u0441\u0435\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 wine. \u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 Python MLflow \u0438\u0437 Scala Spark?<\/p>\n<p>\u041c\u044b \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438 \u044d\u0442\u043e, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 Spark \u043c\u0435\u0436\u0434\u0443 Scala \u0438 Python. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 MLflow UDF \u0432 Python, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0438\u0437 Scala (\u0434\u0430, \u0432\u043e\u0437\u043e\u0436\u043d\u043e, \u043d\u0435 \u043b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u043c).<\/p>\n<h4>Scala Spark + MLflow<\/h4>\n<p>\n\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/toree.apache.org\/\">Toree Kernel<\/a><\/noindex> \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 Jupiter. <\/p>\n<h4>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Spark + Toree + Jupyter<\/h4>\n<p><\/p>\n<pre><code class=\"python\">pip install toree\njupyter toree install --spark_home=${SPARK_HOME} --sys-prefix\njupyter kernelspec list\n```\n```\nAvailable kernels:\n  apache_toree_scala    \/Users\/afranzi\/.virtualenvs\/mlflow\/share\/jupyter\/kernels\/apache_toree_scala\n  python3               \/Users\/afranzi\/.virtualenvs\/mlflow\/share\/jupyter\/kernels\/python3\n```<\/code><\/pre>\n<p>\n\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u0433\u043e notebook-\u0430, UDF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e Spark \u0438 PySpark. \u041c\u044b \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0442\u0435\u043c, \u043a\u0442\u043e \u043b\u044e\u0431\u0438\u0442 Scala \u0438 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435. <\/p>\n<pre><code class=\"scala\">import org.apache.spark.sql.functions.col\nimport org.apache.spark.sql.types.StructType\nimport org.apache.spark.sql.{Column, DataFrame}\nimport scala.util.matching.Regex\n\nval FirstAtRe: Regex = &quot;^_&quot;.r\nval AliasRe: Regex = &quot;[\\s_.:@]+&quot;.r\n\ndef getFieldAlias(field_name: String): String = {\n    FirstAtRe.replaceAllIn(AliasRe.replaceAllIn(field_name, &quot;_&quot;), &quot;&quot;)\n}\n\ndef selectFieldsNormalized(columns: List[String])(df: DataFrame): DataFrame = {\n    val fieldsToSelect: List[Column] = columns.map(field =&gt;\n        col(field).as(getFieldAlias(field))\n    )\n    df.select(fieldsToSelect: _*)\n}\n\ndef normalizeSchema(df: DataFrame): DataFrame = {\n    val schema = df.columns.toList\n    df.transform(selectFieldsNormalized(schema))\n}\n\nFirstAtRe = ^_\nAliasRe = [s_.:@]+\n\ngetFieldAlias: (field_name: String)String\nselectFieldsNormalized: (columns: List[String])(df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame\nnormalizeSchema: (df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame\nOut[1]:\n[s_.:@]+\nIn [2]:\nval winePath = &quot;~\/Research\/mlflow-workshop\/examples\/wine_quality\/data\/winequality-red.csv&quot;\nval modelPath = &quot;\/tmp\/mlflow\/artifactStore\/0\/96cba14c6e4b452e937eb5072467bf79\/artifacts\/model&quot;\n\nwinePath = ~\/Research\/mlflow-workshop\/examples\/wine_quality\/data\/winequality-red.csv\nmodelPath = \/tmp\/mlflow\/artifactStore\/0\/96cba14c6e4b452e937eb5072467bf79\/artifacts\/model\nOut[2]:\n\/tmp\/mlflow\/artifactStore\/0\/96cba14c6e4b452e937eb5072467bf79\/artifacts\/model\nIn [3]:\nval df = spark.read\n              .format(&quot;csv&quot;)\n              .option(&quot;header&quot;, &quot;true&quot;)\n              .option(&quot;delimiter&quot;, &quot;;&quot;)\n              .load(winePath)\n              .transform(normalizeSchema)\n\ndf = [fixed_acidity: string, volatile_acidity: string ... 10 more fields]\nOut[3]:\n[fixed_acidity: string, volatile_acidity: string ... 10 more fields]\nIn [4]:\n%%PySpark\nimport mlflow\nfrom mlflow import pyfunc\n\nmodel_path = &quot;\/tmp\/mlflow\/artifactStore\/0\/96cba14c6e4b452e937eb5072467bf79\/artifacts\/model&quot;\nwine_quality_udf = mlflow.pyfunc.spark_udf(spark, model_path)\n\nspark.udf.register(&quot;wineQuality&quot;, wine_quality_udf)\nOut[4]:\n&lt;function spark_udf.&lt;locals&gt;.predict at 0x1116a98c8&gt;\nIn [6]:\ndf.createOrReplaceTempView(&quot;wines&quot;)\nIn [10]:\n%%SQL\nSELECT \n    quality,\n    wineQuality(\n        fixed_acidity,\n        volatile_acidity,\n        citric_acid,\n        residual_sugar,\n        chlorides,\n        free_sulfur_dioxide,\n        total_sulfur_dioxide,\n        density,\n        pH,\n        sulphates,\n        alcohol\n    ) AS prediction\nFROM wines\nLIMIT 10\nOut[10]:\n+-------+------------------+\n|quality|        prediction|\n+-------+------------------+\n|      5| 5.576883967129615|\n|      5|  5.50664776916154|\n|      5| 5.525504822954496|\n|      6| 5.504311247097457|\n|      5| 5.576883967129615|\n|      5|5.5556903912725755|\n|      5| 5.467882654744997|\n|      7| 5.710602976324739|\n|      7| 5.657319539336507|\n|      5| 5.345098606538708|\n+-------+------------------+\n\nIn [17]:\nspark.catalog.listFunctions.filter('name like &quot;%wineQuality%&quot;).show(20, false)\n\n+-----------+--------+-----------+---------+-----------+\n|name       |database|description|className|isTemporary|\n+-----------+--------+-----------+---------+-----------+\n|wineQuality|null    |null       |null     |true       |\n+-----------+--------+-----------+---------+-----------+\n<\/code><\/pre>\n<p><\/p>\n<h3>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438<\/h3>\n<p>\n\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 MLflow \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Alpha-\u0432\u0435\u0440\u0441\u0438\u0438, \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435. \u041e\u0434\u043d\u0430 \u043b\u0438\u0448\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. <\/p>\n<p>\u041a \u0442\u043e\u043c\u0443 \u0436\u0435, MLflow \u0441\u0431\u043b\u0438\u0436\u0430\u0435\u0442 Data-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u043f\u043e Data Science, \u043f\u0440\u043e\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043e\u0431\u0449\u0438\u0439 \u0441\u043b\u043e\u0439. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f MLflow, \u043c\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 Spark \u0438 \u0432 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445.<\/p>\n<p>\u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043c\u0435\u0441\u0442\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0422\u0430\u043a \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 <noindex><a rel=\"nofollow\" href=\"https:\/\/prestodb.io\/\">Presto<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/athena\/\">Athena<\/a><\/noindex> \u0441 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 Glue metastore.<\/p>\n<p>\u041f\u043e\u0434\u0432\u043e\u0434\u044f \u0438\u0442\u043e\u0433\u0438, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 MLFlow \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043d\u0430\u0448\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0433\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0441 MLflow, \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u0432\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435, \u0438 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435.<\/p>\n<p>\n\u0423\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043a\u0443\u0440\u0441\u0430\u0445:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h8IZ\/\">Machine Learning. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/jut8\/\">Machine Learning. \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u043a\u0443\u0440\u0441<\/a><\/noindex><\/p>\n<p>\n\u0427\u0438\u0442\u0430\u0442\u044c \u0435\u0449\u0451:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/515046\/\">\u0420\u0438\u0441\u043a\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u0443\u0447\u0438\u0442\u0435\u043b\u0435\u043c<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/513672\/\">\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 Docker \u2013 \u0427\u0430\u0441\u0442\u044c 1<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/515514\/\">\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 Docker \u2013 \u0427\u0430\u0441\u0442\u044c 2<\/a><\/noindex>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/516420\/\">habr.com<\/a> <\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438, \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 OTUS \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MLflow. \u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0431\u0437\u043e\u0440 MLflow \u0441 \u0435\u0433\u043e tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92306,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92305","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438, \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 OTUS \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MLflow. \u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0431\u0437\u043e\u0440 MLflow \u0441 \u0435\u0433\u043e tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438, \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 OTUS \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MLflow. \u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0431\u0437\u043e\u0440 MLflow \u0441 \u0435\u0433\u043e tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-25T17:42:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-25T17:42:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Potenze di Spark con MLflow | ProHoster","description":"Ciao, amici di Habr. Come abbiamo gi\u00e0 scritto, questo mese OTUS lancia due corsi di machine learning, ovvero uno base e uno avanzato. Per questo motivo continuiamo a condividere materiali utili. L'obiettivo di questo articolo \u00e8 raccontare la nostra prima esperienza con MLflow. Inizieremo la panoramica di MLflow con il suo server di tracciamento e registreremo tutte le iterazioni della ricerca. Successivamente condivideremo","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Spark \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MLflow | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b\u0438, \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 OTUS \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MLflow. \u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0431\u0437\u043e\u0440 MLflow \u0441 \u0435\u0433\u043e tracking-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u043c\u0441\u044f","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/rasshirenie-vozmozhnostej-spark-s-pomoshhyu-mlflow","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-25T17:42:16+00:00","article:modified_time":"2020-08-25T17:42:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92305","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:11:27","updated":"2022-10-04 22:52:40"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/92305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=92305"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/92305\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/92306"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=92305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=92305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=92305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}