স্পার্কে পাইথন চালানোর বিষয়ে অগণিত নিবন্ধ এবং ফোরাম পোস্ট রয়েছে, তবে বেশিরভাগই মনে করে যে জমা দেওয়ার কাজটি এক .py ফাইলের মধ্যে রয়েছে:
spark-submit wordcount.py
- সম্পন্ন!
আপনার পাইথন প্রোগ্রামটি যদি শুধুমাত্র একটি স্ক্রিপ্টের চেয়ে বেশি হয় তবে কী হবে? সম্ভবত এটি স্পার্কের গতিশীল এসকিউএল তৈরি করে এবং স্পার্কের আউটপুট ব্যবহার করে মডেলগুলি রিফ্রেশ করে। যেহেতু আপনার পাইথন কোডটি একটি অ্যাপ্লিকেশন (ডিরেক্টরি গঠন, কনফিগারেশন ফাইল এবং লাইব্রেরি নির্ভরতাগুলির সাথে) হয়ে ওঠে, স্পার্কে জমা দেওয়ার জন্য এটি আরও বেশি বিবেচনার প্রয়োজন হয়।
নীচের বিকল্পগুলি আমি সম্প্রতি বিবেচনা করেছি যখন স্পার্ক 2.3 ব্যবহার করে এমন একটি পাইথন অ্যাপ্লিকেশন উৎপাদন করার সময় গ্রহণ করা হয়। এই প্রথম নিবন্ধ স্পার্ক একক ক্লাস্টার উপর দৃষ্টি নিবদ্ধ করে। একটি পৃথক নিবন্ধ EMR স্পার্ক (YARN) কভার।
আমি স্পিকারকে কর্তৃপক্ষের কাছ থেকে অনেক দূরে পাইথনকে ছেড়ে দেই। আমার সিদ্ধান্তগুলি স্থাপনার সহজে এবং ক্লাস্টারগুলির সাথে অ্যাপ দ্বারা আরোপিত সীমাবদ্ধতার সাথে সঠিকতা সামঞ্জস্য করার চেষ্টা করেছিল। আমার সম্পর্কে আপনি কী মনে করেন জানি।
প্রবণতা এআই নিবন্ধ:
নমুনা পাইথন অ্যাপ্লিকেশন
একটি সম্পূর্ণ অ্যাপ্লিকেশন অনুকরণ করার জন্য নিচের পরিস্থিতিগুলি নিম্নলিখিত কাঠামোর সাথে একটি পাইথন 3 অ্যাপ্লিকেশন অনুমান করে:
project.py
data /
data_source.py
data_source.ini
data_source.ini বিভিন্ন কনফিগারেশন পরামিতি রয়েছে:
[spark]
app_name = My PySpark App
master_url = spark://sparkmaster:707
data_source.py একটি মডিউল যা স্পার্কে ডেটা উত্স এবং প্রক্রিয়াকরণের জন্য দায়ী, NumPy এর সাথে গণিত রূপান্তর তৈরি করে এবং ক্লায়েন্টকে একটি প্যান্ডাস ডেটাফ্রেম প্রদান করে। নির্ভরতা:
from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, FloatTypeimport pandas as pd
import numpy as np
import configparser
এটি একটি ডেটাসোর্স ক্লাসকে সংজ্ঞায়িত করে যা শুরু করে
SparkContext
এবং SparkSession
শুরুতে ...ক্লাস ডেটাসোর্স: def __init __ (স্ব): config = configparser.conffigParser () config.read ('./ data / data_source.ini') master_url = config ['spark'] ['master_url'] app_name = config ['spark' ] ['app_name'] conf = SparkConf ()। setAppName (app_name) \ .setmaster (master_url) self.sc = স্পার্ককন্টেস্ট (conf = conf) self.spark = SparkSession.builder \ .config (conf = conf) \ .getOrCreate ()
... এবং একটি get_data () পদ্ধতি যা:
- একটি NumPy স্বাভাবিক বিতরণ থেকে একটি RDD তৈরি করে।
- প্রতিটি উপাদান মান দ্বিগুণ একটি ফাংশন প্রয়োগ করে।
- RDD একটি স্পার্ক ডেটাফ্রেমে রূপান্তরিত করে এবং উপরে একটি টেম্প ভিউ সংজ্ঞায়িত করে।
- এসকিউএল ব্যবহার করে প্রতিটি ডাটাফ্রেম উপাদান বিষয়বস্তু squares যে একটি পাইথন UDF প্রযোজ্য।
- প্যান্ডাস ডাটাফ্রেম হিসাবে ক্লায়েন্টকে ফলাফলগুলি প্রদান করে।
class DataSource:
def __init__(self): config = configparser.ConfigParser()
config.read('./data/data_source.ini')
master_url = config['spark']['master_url']
app_name = config['spark']['app_name'] conf = SparkConf().setAppName(app_name) \
.setMaster(master_url) self.sc = SparkContext(conf=conf)
self.spark = SparkSession.builder \
.config(conf=conf) \
.getOrCreate()
project.py হল আমাদের প্রধান প্রোগ্রাম, উপরের মডিউল ক্লায়েন্ট হিসাবে কাজ করে:
data.data_source থেকে ডেটাসোর্স ডিফ মুখ্য (): src = ডেটাসোর্স () df = src.get_data (num_elements = 100000) মুদ্রণ করুন (f "{df.size} উপাদানের সাথে পান্ডাস ডেটাফ্রেম পেয়েছেন") মুদ্রণ করুন (df.head (10) ) প্রধান ()
রেপো ক্লোন করুন: https://bitbucket.org/calidoteam/pyspark.git
আমরা শুরু করার আগে, স্পার্কে কাজ জমা দেওয়ার সময় উপলব্ধ বিকল্পগুলির পর্যালোচনা করি।
স্পার্ক জমা, ক্লায়েন্ট এবং ক্লাস্টার মোড
- স্পার্ক বিভিন্ন ক্লাস্টার ম্যানেজারকে সমর্থন করে : স্ট্যান্ডলোন (স্পার্কে নির্মিত), হাদপের YARN, Mesos, Kubernetes, যা সমস্ত আপনার সংস্থানগুলির একটি সেটের উপর সঞ্চালিত হয় তা নিয়ন্ত্রণ করে।
spark-submit
একমাত্র ইন্টারফেস যা সমস্ত ক্লাস্টার পরিচালকদের সাথে সামঞ্জস্যপূর্ণভাবে কাজ করে। পাইথন অ্যাপ্লিকেশনগুলির জন্য,spark-submit
যখন প্রয়োজন হয় তখন আপনি .py, .zip বা .egg ফাইল হিসাবে সরবরাহ করা সমস্ত নির্ভরতা আপলোড এবং মঞ্চ করতে পারেন।- ইন ক্লায়েন্ট মোড , আপনার পাইথন প্রোগ্রাম (অর্থাত চালক ) একই হোস্ট যেখানে চলবে
spark-submit
চালায়। নেটওয়ার্ক হোয়াইটেন্সি হ্রাস করার জন্য আপনার হোস্টের কাছাকাছি থাকা হোস্টের কাছাকাছি থাকা নিশ্চিত করার জন্য এটি আপনার সেরা আগ্রহের মধ্যে রয়েছে। - ইন ক্লাস্টার মোড , আপনার পাইথন প্রোগ্রাম (অর্থাত চালক ) এবং নির্ভরতা পূর্ণ করার উদ্দেশ্যে আপলোড করা হয়েছিল এবং থেকে চালানো হবে কিছুকর্মী নোড। একটি দূরবর্তী হোস্ট থেকে কাজ জমা যখন এটি দরকারী। স্পার্ক ২.0.0 ক্লাস্টার মোড স্পার্ক স্ট্যান্ডলোন চলাকালীন চলাকালীন একটি বিকল্প নয়।
- বিকল্পরূপে, ক্লাস্টারের সাথে সংযোগ স্থাপনের জন্য আপনার পাইথন অ্যাপ্লিকেশনটি
spark-submit
কনফিগার করে বাইপাস করা সম্ভবSparkSession
। এটি সঠিক কনফিগারেশন এবং মেমরি পাইপার্ক বার্নারির প্রয়োজন। আপনার পাইথন অ্যাপ্লিকেশনটি কার্যকরভাবে ক্লায়েন্ট মোডেচলবে: এটি হোস্ট যেখানেই আপনি এটি চালু করবেন।
নিচের বিভাগগুলি বিভিন্ন স্থাপনার বিকল্পগুলি এবং প্রতিটিতে কোন কনফিগারেশন প্রয়োজন ছিল তা বর্ণনা করে।
# 1: স্পার্কে সরাসরি সংযোগ করুন (ক্লায়েন্ট মোড, কোন স্পার্ক জমা দিন)

এটি সহজতম স্থাপনার দৃশ্যকল্প: পাইথন অ্যাপ্লিকেশন স্পার্ক মাস্টার URL টি নির্দেশ করে সরাসরি স্পার্ক প্রসঙ্গ স্থাপন করে এবং এটি জমা দেওয়ার জন্য এটি ব্যবহার করে:
conf = SparkConf ()। setAppName ("আমার পাইস্পার্ক অ্যাপ") \ .setMaster ("spark: //192.168.1.10: 7077") sc = SparkContext (conf = conf) spark = SparkSession.builder \ .config (conf = conf ) \ .getOrCreate ()
একটি স্বতন্ত্র ক্লাস্টারে , সংস্থার চাকুরীর জন্য বরাদ্দ করা হয় এবং ডিফল্ট কনফিগারেশন ক্লায়েন্ট অ্যাপ্লিকেশনগুলিকে সমস্ত উপলব্ধ সংস্থান দেয়, এভাবে মাল্টি-ভাড়ােন্ট পরিবেশগুলির জন্য ক্ষুদ্র টিউনিংয়ের প্রয়োজন হয়। এক্সিকিউটিভ প্রসেস (JVM বা Python) প্রতিটি নোড স্থানীয় কর্মী প্রক্রিয়া দ্বারা চালু করা হয় ।
এটি একটি প্রথাগত ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশনের অনুরূপ যা ক্লায়েন্ট কেবল "দূরবর্তী" ক্লাস্টারে "সংযোগ করে"। প্রস্তাবনা:
আপনার ড্রাইভার এবং ক্লাস্টারের মধ্যে প্রচুর ব্যান্ডউইথ রয়েছে তা নিশ্চিত করুন । বেশিরভাগ নেটওয়ার্ক কার্যকলাপ ড্রাইভার এবং এর নির্বাহকদের মধ্যে ঘটে থাকে, তাই এই "রিমোট" ক্লাস্টারটি প্রকৃতপক্ষে ঘনিষ্ঠ প্রক্সিমিটি (LAN) এর মধ্যে থাকা উচিত।
আপাচি এ্যারো সক্ষম করে জাভা-পাইথন সিরিয়ালাইজেশান উন্নত করুন: পাইথন ওয়ার্কলোডস (নুমপি, পান্ডাস এবং স্পার্ক আরডিডি, ডেটাফ্রেম এবং ডেটাসেটগুলিতে প্রয়োগ করা অন্যান্য রূপান্তরগুলি) জাভা এবং পাইথন প্রসেসগুলি থেকে এবং এর থেকে ডিফলিয়াল অনেকগুলি সিরিয়ালাইজেশান এবং ডেসারিয়ালাইজেশন দ্বারা প্রয়োজন এবং দ্রুত কর্মক্ষমতা হ্রাস পাবে। স্পার্ক 2.3 দিয়ে শুরু করা, অ্যাপাচি অ্যারো সক্ষম করা (নীচে তালিকাভুক্ত পদক্ষেপগুলিতে অন্তর্ভুক্ত) এই স্থানান্তরগুলিকে আরও কার্যকর করে তোলে ।
সমস্ত ক্লাস্টার নোড এবং ড্রাইভার হোস্ট জুড়ে নির্ভরতা স্থাপন করুন।এতে পাইথন 3 টি ডাউনলোড এবং ইনস্টল করা , পাইপ-ইনস্টল করা পাইস্পার্ক (লক্ষ্য ক্লাস্টারটির সংস্করণটি অবশ্যই মেলে), পাইআরো, পাশাপাশি অন্যান্য লাইব্রেরি নির্ভরতাগুলিও অন্তর্ভুক্ত রয়েছে:
sudo yum install python36 পিপ ইনস্টল pyspark [sql]pip install pyspark==2.3.1
pip install numpy pandas msgpack sklearn
দ্রষ্টব্য: PySpark (~ 200MB) মত একটি বড় লাইব্রেরি ইনস্টল করার সময়, আপনি "
MemoryError
" এ শেষ হওয়া একটি ত্রুটির মধ্যে দৌড়াতে পারেন। যদি তাই হয় তবে চেষ্টা করুন:pip install --no-cache-dir pyspark==2.3.1
কনফিগারেশন এবং পরিবেশ ভেরিয়েবল: ক্লায়েন্ট পার্শ্বে,
$SPARK_HOME
পিপ্সার্ক ইনস্টল করা অবস্থান যেখানে পয়েন্ট নির্দেশ করতে হবে:$ পিপ শো পিস্পার্ক নাম: পিস্পার্ক সংস্করণ: 2.3.1 সারসংক্ষেপ: অ্যাপাচি স্পার্ক পাইথন API হোম পৃষ্ঠা: https://github.com/apache/spark/tree/master/python লেখক: স্পার্ক ডেভেলপারদের লেখক-ইমেল: dev @ spark .apache.org লাইসেন্স: http://www.apache.org/licenses/LICENSE-2.0 অবস্থান: /opt/anaconda/lib/python3.6/site-packages প্রয়োজনীয়: py4j $ export SPARK_HOME = / opt / anaconda / lib /python3.6/site-packages
প্রতিটি ক্লাস্টার নোডের উপর, অতিরিক্ত ডিফল্ট প্যারামিটার এবং পরিবেশ ভেরিয়েবল সেট করুন। বিশেষত, পাইথন অ্যাপ্লিকেশনের জন্য:
$SPARK_HOME/conf/spark-defaults.sh
spark.sql.execution.arrow.enabled true
$SPARK_HOME/conf/spark-env.sh
export PYSPARK_PYTHON=/usr/bin/python3
পাইথন এক্সিকিউটেবল, সব নোড।export PYSPARK_DRIVER_PYTHON=/usr/bin/python3
: নির্বাহক নোড থেকে ভিন্ন ড্রাইভার, ড্রাইভার জন্য এক্সিকিউটেবল পাইথন।
দ্রষ্টব্য: পরিবেশ ভেরিয়েবলগুলিকে যেখানেই চালু করা
spark-submit
হয় থেকে পড়তে হয় , ক্লাস্টার হোস্টগুলির মধ্যে থেকে অগত্যা নয়।এটা চলমান
ক্লাস্টারে কাজটি জমা দেওয়ার পদ্ধতিটি কেবল পাইথন অ্যাপ্লিকেশন চালানোর ব্যাপার (যেমন
spark-submit
প্রয়োজন নেই):$ cd my-project-dir /
$ python3 project.py
রানটাইম এ, চাকরির জন্য কাজ করা একাধিক python3 প্রক্রিয়া চালানো স্লেভ নোড দেখতে সম্ভব :

# 2: কনটেইনারাইজড অ্যাপ্লিকেশন (ক্লায়েন্ট মোড, কোন স্পার্ক জমা দিন)

এটি পূর্বের দৃশ্যকল্পের একটি এক্সটেনশান যা পীথন অ্যাপ্লিকেশানটি একটি সিআইডি / সিডি পাইপলাইনের অংশ হিসাবে ডকার কন্টেইনার হিসাবে পোর্টেবিলিটি কারণে, ইত্যাদি চালাতে পছন্দসই।
পূর্ববর্তী দৃশ্যকল্প জন্য প্রস্তাবিত কনফিগারেশন ছাড়াও, নিম্নলিখিত আবশ্যক:
সমস্ত নির্ভরতাগুলি অন্তর্ভুক্ত করতে কন্টেইনারটি তৈরি করুন: একটি চিত্র থেকে শুরু করুন যা পাইথন 3 এবং / অথবা জাভা 8 ওপেনজেডিকে অন্তর্ভুক্ত করে, তারপর অ্যাপ্লিকেশন দ্বারা প্রয়োজনীয় পাইপ-ইনস্টল, পাইস্পার্ক, পাইআরো এবং অন্যান্য সমস্ত লাইব্রেরিগুলি অন্তর্ভুক্ত করুন।
স্পার্ক ড্রাইভার হোস্ট এবং পোর্টগুলি কনফিগার করুন, কনটেইনারে সেগুলি খুলুন: নির্বাহকরা কন্টেইনারে ড্রাইভারের কাছে পৌঁছানোর জন্য এটি প্রয়োজন। ড্রাইভারের জন্য স্পার্ক বৈশিষ্ট্য প্রোগ্রাম্যাটিকভাবে সেট করা যেতে পারে (
spark.conf.set(“property”, “value”)
):spark.driver.host : host_ip_address (e.g. 192.168.1.10)
spark.driver.port : static_port (e.g. 51400)
spark.driver.bindAddress : container_internal_ip (e.g. 10.192.6.81)
spark.driver.blockManagerPort : static_port (e.g. 51500)
Docker সালে পোর্ট তারপর -p বিকল্প ব্যবহার করে কম্যান্ড লাইন থেকে বাহিরে উন্মুক্ত করা যেতে পারে:
-p 51400:51400 -p 51500:51500
। অন্যান্য নিবন্ধ কেবল এই পোর্ট পরিসীমা প্রকাশ করা পরামর্শ:-p 5000–5010:5000–5010
এটা চলমান
পূর্ববর্তী দৃশ্যকল্প হিসাবে, কন্টেইনারটি চালানো পাইথন ড্রাইভার প্রোগ্রামটি শুরু করবে:
ডকার রান-পি 51400: 51400-পি 51500: 51500
# 3: স্পার্ক-জমা (ক্লায়েন্ট মোড) এর মাধ্যমে পাইথন অ্যাপ্লিকেশন
এই দৃশ্যকল্পটি দৃশ্যত # 1 পরিদৃশ্য এবং একই সাথে স্বচ্ছতার জন্য এখানে অন্তর্ভুক্ত। একমাত্র পার্থক্য হ'ল পাইথন অ্যাপ্লিকেশন
spark-submit
প্রক্রিয়াটি ব্যবহার করে চালু করা হয় । ক্লাস্টার ইভেন্ট লগ ফাইল ছাড়া stdout এ পাঠানো হয় :$ cd my-project-dir / $ ls -l rwxrwxr-x। 3 সেন্ট শত শত 70 ফেব্রুয়ারী ২5 02:11 তথ্য -আরডব্লু-রউ-র--। 1 সেন্টস সেন্ট্রো 220 ফেব্রুয়ারী 25 01:09 project.py $ spark-submit project.py
নোট:
- আমার অভিজ্ঞতায়, যখন
spark-submit
এটি প্রকল্প মূল ডিরেক্টরি (my-project-dir/
) থেকে আহ্বান করা হয় তখন এটি কল করার সময় নির্ভরশীল সাবডিরেক্টরি / ফাইলগুলি পাস করার প্রয়োজন ছিল না । - যেহেতু নমুনা অ্যাপ্লিকেশন ইতিমধ্যে একটি মাস্টার URL নির্দিষ্ট করে, তাই এটি পাস করতে হবে না
spark-submit
। অন্যথায়, একটি সম্পূর্ণ কমান্ড হবে:
$ spark-submit --master spark: // sparkcas1: 7077 --deploy-mode ক্লায়েন্ট project.py
- স্পার্ক 2.3 এর মতো, ক্লাস্টার মোডে পাইথন অ্যাপ্লিকেশনগুলি একটি স্বতন্ত্র স্পার্ক ক্লাস্টারে জমা দেওয়া সম্ভব নয়। তাই করছেন একটি ত্রুটি উত্পাদিত:
$ spark-submit --master spark: // sparkcas1: 7077 --deploy-mode cluster project.py ত্রুটি: ক্লাস্টার স্থাপনের মোড বর্তমানে স্ট্যান্ডলোন ক্লাস্টারগুলিতে পাইথন অ্যাপ্লিকেশনগুলির জন্য সমর্থিত নয়।
Takeaways- স্পার্ক একক ক্লাস্টার উপর পাইথন:
- যদিও স্ট্যান্ডলোন ক্লাস্টারগুলি উৎপাদনে জনপ্রিয় নয় (সম্ভবত বাণিজ্যিকভাবে সমর্থিত বিতরণগুলিতে ক্লাস্টার ম্যানেজার অন্তর্ভুক্ত থাকে) তবে তাদের একটি ছোট পদাঙ্ক রয়েছে এবং মাল্টি-টেনেন্সি এবং ডায়নামিক রিসোর্স বরাদ্দের প্রয়োজন নেই এমন একটি ভাল কাজ করে।
- পাইথন অ্যাপ্লিকেশনের জন্য, স্থাপনার বিকল্পগুলি ক্লায়েন্ট মোডে সীমাবদ্ধ।
- পাইথন অ্যাপ্লিকেশনটি ধারণ করার জন্য ডকার ব্যবহার করা সমস্ত প্রত্যাশিত সুবিধা এবং ক্লায়েন্ট মোড স্থাপনার জন্য উপযুক্ত।
0 comments:
Post a Comment