কিভাবে স্পার্কে ইনফো লগিং বন্ধ করবেন?


144

আমি এডাব্লুএস ইসি 2 গাইড ব্যবহার করে স্পার্ক ইনস্টল করেছি bin/pysparkএবং স্পার্ক প্রম্পটে পৌঁছানোর জন্য স্ক্রিপ্টটি ব্যবহার করে আমি প্রোগ্রামটি সূক্ষ্মভাবে চালু করতে পারি এবং দ্রুত শুরু কুইড সফলভাবে করতে পারি।

তবে, INFOপ্রতিটি কমান্ডের পরে কীভাবে সমস্ত ভার্বোজ লগিং বন্ধ করা যায় তা আমি আমার জীবনের জন্য অনুধাবন করতে পারি না ।

আমি নীচের কোডটিতে প্রায় প্রতিটি সম্ভাব্য দৃশ্যের চেষ্টা করেছি ( ফোল্ডারে যেখানে আমি প্রতিটি নোডের সাথে সাথে অ্যাপ্লিকেশনটি লঞ্চ করেছি এবং সেখানে কোনও কিছুই করছে না ) ফোল্ডারে আমার log4j.propertiesফাইলের মধ্যে মন্তব্য করে (মন্তব্য করা, বন্ধ করে দেওয়া)) confআমি এখনও INFOপ্রতিটি বিবৃতি কার্যকর করার পরে লগিং স্টেটমেন্ট মুদ্রণ পেতে ।

এটি কীভাবে কাজ করার কথা তা নিয়ে আমি খুব বিভ্রান্ত।

#Set everything to be logged to the console log4j.rootCategory=INFO, console                                                                        
log4j.appender.console=org.apache.log4j.ConsoleAppender 
log4j.appender.console.target=System.err     
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

আমি যখন ব্যবহার করি তখন আমার সম্পূর্ণ ক্লাসপথটি এখানে SPARK_PRINT_LAUNCH_COMMAND:

স্পার্ক কমান্ড: / লাইবারি / জাভা / জাভা ভার্চুয়ালম্যাচাইনস / জেডকি 1.8.0_05.jdk/Conttents/Home/bin/java -cp: /root/spark-1.0.1-bin-hadoop2/conf: /root/spark-1.0.1 -bin-hadoop2 / সার্ভার: /root/spark-1.0.1-bin-hadoop2/lib/spark-assembly-1.0.1-hadoop2.2.0.jar: /root/spark-1.0.1-bin-hadoop2/lib /datanucleus-api-jdo-3.2.1.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-core-3.2.2.jar:/root/spark-1.0.1-bin-hadoop2 /lib/datanucleus-rdbms-3.2.1.jar -XX: MaxPermSize = 128m -Djava.library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit স্পার্ক-শেল - ক্লাস org.apache.spark। repl.Main

বিষয়বস্তু spark-env.sh:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
# Copy it as spark-env.sh and edit that to configure Spark for your site.

# Options read when launching programs locally with 
# ./bin/run-example or ./bin/spark-submit
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public dns name of the driver program
# - SPARK_CLASSPATH=/root/spark-1.0.1-bin-hadoop2/conf/

# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program
# - SPARK_CLASSPATH, default classpath entries to append
# - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos

# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests (Default: ‘default’)
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.

# Options for the daemons used in the standalone deploy mode:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
# - SPARK_MASTER_OPTS, to set config properties only for the master (e.g. "-Dx=y")
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node
# - SPARK_WORKER_DIR, to set the working directory of worker processes
# - SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. "-Dx=y")
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers

export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"

সেশন তৈরির পরে স্পার্ক প্রোগ্রামে আপনি জাভা স্পার্কসেশন স্পার্ক = স্পার্কসেশন.বিল্ডার ()। মাস্টার ("স্থানীয়")। GetOrCreate () জন্য নীচে প্রদত্ত লগ স্তর নির্ধারণ করতে পারেন; spark.sparkContext () setLogLevel ( "তথ্য")।
আইকিং

উত্তর:


158

স্পার্ক ডিরেক্টরিতে এই কমান্ডটি কার্যকর করুন:

cp conf/log4j.properties.template conf/log4j.properties

Log4j.properties সম্পাদনা করুন:

# Set everything to be logged to the console
log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

প্রথম লাইনে প্রতিস্থাপন করুন:

log4j.rootCategory=INFO, console

দ্বারা:

log4j.rootCategory=WARN, console

আপনার শেলটি সংরক্ষণ করুন এবং পুনরায় চালু করুন। এটি আমার জন্য স্পার্ক 1.1.0 এবং ওএস এক্স-এর স্পার্ক 1.5.1 এর জন্য কাজ করে


1
এটি সহায়তা করেছে, এটি বুঝতে গুরুত্বপূর্ণ যে লগ 4j.properties বিদ্যমান না থাকলে আপনি এটি তৈরি না করে। উবুন্টুতে, এই পরিবর্তনগুলি প্রভাবিত করার জন্য আমার পুনরায় আরম্ভ করার দরকার নেই।
বিঘ্নিত

আমার পক্ষে কাজ করেনি। স্পার্ক ০.০ RHEL 6. সিডিএইচ 5.5। নতুন ফাইল / ওপ্ট / ক্লাউডেরা / পার্সেলস / সিডিএইচ / জেট / স্পার্ক / কনফ.ডিসট / লোগোজেজে.প্রপার্টি তৈরি করার চেষ্টা করেছে এবং উপরে বর্ণিত মত পরিবর্তন করা হচ্ছে। এবং বিদ্যমান ফাইল /etc/spark/conf/log4j.properties সম্পাদনা করার চেষ্টা করেছি। পাইপার্ক শেল বা পাইপর্ক-শেলের জন্য কোনও প্রভাব নেই।
তাগর

স্পার্ক ক্লাস্টারের সমস্ত নোডের জন্য আমাদের কি এটি করা দরকার?
মেঘ

54

Pyspark / টেস্ট.পি দ্বারা অনুপ্রাণিত হয়েছি

def quiet_logs(sc):
    logger = sc._jvm.org.apache.log4j
    logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
    logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )

স্পারকন্টেক্সট কমিয়ে দেওয়া স্টার্ডার লাইন তৈরি করার পরে এটি কল করা আমার পরীক্ষার জন্য লগইন 2647 থেকে 163. তবে স্পার্ককন্টেক্সট নিজে তৈরি করে 163 পর্যন্ত লগ হয়

15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0

এবং কীভাবে প্রোগ্রামগুলি এগুলিকে সামঞ্জস্য করতে হয় তা আমার কাছে পরিষ্কার নয়।


2
এই লাইনগুলি কীভাবে সামঞ্জস্য করবেন সে সম্পর্কে আপনার যদি কোনও ধারণা থাকে তবে দয়া করে ভাগ করুন
আইরিন

আমি মনে করি পাইস্পার্কে ডিফল্ট ডিবাগিং স্তর পরিবর্তন করার সরাসরি কোনও সমাধান নেই .. যতক্ষণ না স্পার্ককন্টেক্সট শুরু হয়। কারণ sc._jvm এসসি তৈরি হওয়ার পরে তৈরি হয়। অন্যান্য উত্তরে যেমন আলোচনা করা হয়েছে ততক্ষণ আপনি log4j.properies ফাইলের মাধ্যমে এটি পরিবর্তন করতে পারেন। স্পার্কের উদাহরণস্বরূপ স্পার্ক.ডেফল্ট.লগিং ভেরিয়েবল তৈরি করা উচিত যা ডিফল্ট রুট লগার স্তরকে ওভাররাইড করার বিকল্প হিসাবে স্পার্ককনফে যেতে পারে।
তাগর

37

স্পার্ক ২.০ এ আপনি সেটলগলিভেল ব্যবহার করে আপনার অ্যাপ্লিকেশনটির জন্য এটি গতিশীলভাবে কনফিগার করতে পারেন :

    from pyspark.sql import SparkSession
    spark = SparkSession.builder.\
        master('local').\
        appName('foo').\
        getOrCreate()
    spark.sparkContext.setLogLevel('WARN')

ইন pyspark কনসোল, একটি ডিফল্ট sparkঅধিবেশন ইতিমধ্যে উপলব্ধ করা হবে।


আপনি সবেমাত্র লগ বার্তা দমন করেছেন। তবে আসল কোডটি পটভূমিতে চলছে। আপনি যদি সিপিইউ ব্যবহার দেখতে পান। নিষ্ক্রিয় অবস্থায়ও প্রচুর সিপিইউ ব্যবহার করে স্পার্ক করুন।
হুরেলহায়াগ

এটি পাইসপার্ক কাজের ঠিক হ'ল সমাধান যেখানে log4jঅ্যাক্সেসযোগ্য নয়।
yeliabsalohcin

35

আপনার কনফারেন্স / লগ 4j.properties ফাইল সম্পাদনা করুন এবং নিম্নলিখিত লাইনটি পরিবর্তন করুন:

   log4j.rootCategory=INFO, console

প্রতি

    log4j.rootCategory=ERROR, console

আর একটি পদ্ধতি হ'ল:

ফায়ারআপ স্পার্ক-শেল এবং নিম্নলিখিত টাইপ করুন:

import org.apache.log4j.Logger
import org.apache.log4j.Level

Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

আপনি এর পরে কোনও লগ দেখতে পাবেন না।


3
পরবর্তী বিকল্পটি স্পার্ক-শেল (স্কেলা) এর জন্য কাজ করে তবে লগ 4 জ ফাইল পরিবর্তন না করে পাইপপার্কের ক্ষেত্রে আপনার কী করা উচিত?
hmi2015

"সতর্ক" করার log4j বৈশিষ্ট্য ফাইল পরিবর্তন করা বাঞ্ছনীয় হতে পারে, কিন্তু অন্যথায় wannik দ্বারা এই উত্তর লগ স্তর পরিবর্তন pyspark জন্য সান্ত্বনা দেয়ার জন্য কাজ করে stackoverflow.com/a/34487962/127971
মাইকেল

32
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

আমি এটি পাইপার্কের জন্য ব্যবহার করেছি। ওয়ান-লাইনার হ্যাক হিসাবে দুর্দান্ত কাজ করে। আমি এখনও মূর্খ YarnExecutor মৃত বার্তা পেয়েছি, যা কোনও ত্রুটি হওয়া উচিত নয়, ইমো। এবং তাই এটি যায় ...
জাটল

2
এটি লগিংটি কার্যকর করার পরে দমন করে তবে দুর্ভাগ্যক্রমে অনেকগুলি আইএনএফও লগ রয়েছে।
ডেভিডজে

28

পাইস্পার্কের জন্য, আপনি এর সাথে আপনার স্ক্রিপ্টগুলিতে লগ স্তরটি সেট করতে পারেন sc.setLogLevel("FATAL")ডক্স থেকে :

আমাদের লগ লেভেল নিয়ন্ত্রণ করুন। এটি কোনও ব্যবহারকারী-সংজ্ঞায়িত লগ সেটিংসকে ওভাররাইড করে। বৈধ লগ স্তরের মধ্যে রয়েছে: সমস্ত, DEBUG, ERROR, FATAL, INFO, অফ, ট্র্যাক, সতর্কতা


দুর্দান্ত সমাধান যা স্পার্কের সংস্করণগুলিতে 1.4 এর চেয়েও বেশি নতুন (২০১৫ সালের মাঝামাঝি থেকে) নতুন সংস্করণের জন্য কাজ করে।
জেলি

আমি স্পার্ক 1.6.2 এবং স্কালা দিয়ে এটি চেষ্টা করেছি এবং এটি কাজ করছে বলে মনে হচ্ছে না
ইয়াইকেল

@ ইয়াইকেল এই সমাধানটি পাইস্পার্কের জন্য। দুঃখিত যে এটি পরিষ্কার করা হয়নি - আমি এখনই উত্তরটি সম্পাদনা করব।
গ্যালেন লং

15

আপনি সেটলগলিভেল ব্যবহার করতে পারেন

val spark = SparkSession
      .builder()
      .config("spark.master", "local[1]")
      .appName("TestLog")
      .getOrCreate()

spark.sparkContext.setLogLevel("WARN")

14

এটি স্পার্কের ক্লাসপথের গণনা করার কারণে হতে পারে। আমার কুণ্ডলীটি হল যে হাদুপের log4j.propertiesফাইলটি স্পার্কের আগে ক্লাসপথে উপস্থিত হবে, আপনার পরিবর্তনগুলি কার্যকর হতে আটকাচ্ছে।

আপনি যদি চালান

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

তারপরে স্পার্ক শেলটি প্রবর্তন করতে ব্যবহৃত পুরো ক্লাসপথটি মুদ্রণ করবে; আমার ক্ষেত্রে, আমি দেখতে

Spark Command: /usr/lib/jvm/java/bin/java -cp :::/root/ephemeral-hdfs/conf:/root/spark/conf:/root/spark/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/root/spark/lib/datanucleus-api-jdo-3.2.1.jar:/root/spark/lib/datanucleus-core-3.2.2.jar:/root/spark/lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize=128m -Djava.library.path=:/root/ephemeral-hdfs/lib/native/ -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark.repl.Main

/root/ephemeral-hdfs/confক্লাসপাথের মাথায় কোথায় ।

পরের রিলিজে এটি ঠিক করার জন্য আমি একটি সমস্যা [স্পার্ক -২৯১13] খুলেছি (আমার খুব শীঘ্রই একটি প্যাচ বেরিয়ে আসা উচিত)।

এরই মধ্যে, এখানে বেশ কয়েকটি কাজের চাপ রয়েছে:

  • যোগ export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"করুন spark-env.sh
  • মুছে ফেলুন (বা নাম পরিবর্তন করুন) /root/ephemeral-hdfs/conf/log4j.properties

ধন্যবাদ. আমি এটিকে আমার স্পার্ক-এন.ভি.এস ফাইলে যুক্ত করার চেষ্টা করেছি এবং লগ 4j.properties ফাইলটি মুছতে চেষ্টা করেছি কিন্তু এখনও ইনফো আউটপুট পাচ্ছি। আমি আমার পূর্ণ ক্লাসপথ প্রশ্নের সাথে যুক্ত করেছি।
horatio1701d

অতিরিক্ত তথ্যের জন্য ধন্যবাদ। আপনি কি স্পার্ক-en.v.sh এর বিষয়বস্তু পোস্ট করতে পারেন (আপনি হোস্টনামের মতো ব্যক্তিগত তথ্য পুনরায় যোগাযোগ করতে পারেন)?
জোশ রোসেন

ধন্যবাদ. পোস্ট spark-env.sh। দুঃখিত যদি আমি কীভাবে বেস সেটআপটি যাব তা ভুল বুঝতে পারছি। আমি এখনই কিছু পরীক্ষার চেষ্টা করার জন্য যথাসম্ভব সবকিছু ডিফল্ট হিসাবে রেখেছি।
horatio1701d

9

স্পার্ক 1.6.2:

log4j = sc._jvm.org.apache.log4j
log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

স্পার্ক ২.x:

spark.sparkContext.setLogLevel('WARN')

(স্পার্কসেশন হচ্ছে স্পার্কসেশন)

বিকল্পভাবে পুরানো পদ্ধতি,

পুনঃনামকরণ conf/log4j.properties.templateকরতে conf/log4j.propertiesস্পার্ক দির।

ইন log4j.propertiesপরিবর্তন log4j.rootCategory=INFO, consoleকরতেlog4j.rootCategory=WARN, console

বিভিন্ন লগ স্তর উপলব্ধ:

  • বন্ধ (সুনির্দিষ্ট, লগিং নেই)
  • FATAL (সুনির্দিষ্ট, অল্প ডেটা)
  • ত্রুটি - শুধুমাত্র ত্রুটির ক্ষেত্রে লগইন করুন
  • সতর্কতা - কেবল সতর্কতা বা ত্রুটির ক্ষেত্রে লগইন করুন
  • তথ্য (ডিফল্ট)
  • ডিবগ - লগ বিশদ পদক্ষেপ (এবং উপরে বর্ণিত সমস্ত লগ)
  • ট্র্যাক (কমপক্ষে নির্দিষ্ট, প্রচুর ডেটা)
  • সমস্ত (কমপক্ষে নির্দিষ্ট, সমস্ত ডেটা)


5

আমি এটিকে অ্যামাজন ইসি 2 এর সাথে 1 মাস্টার এবং 2 ক্রীতদাস এবং স্পার্ক 1.2.1 দিয়ে ব্যবহার করেছি।

# Step 1. Change config file on the master node
nano /root/ephemeral-hdfs/conf/log4j.properties

# Before
hadoop.root.logger=INFO,console
# After
hadoop.root.logger=WARN,console

# Step 2. Replicate this change to slaves
~/spark-ec2/copy-dir /root/ephemeral-hdfs/conf/

4

আপনার স্পার্ক-জমা কমান্ডটিতে কেবল পরমকে যুক্ত করুন

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

এটি কেবলমাত্র সেই কাজের জন্য অস্থায়ীভাবে সিস্টেমের মানকে ওভাররাইড করে। Log4j.properties ফাইল থেকে যথাযথ সম্পত্তির নাম (log4jspark.root.logger এখানে) দেখুন।

আশা করি এটি সাহায্য করবে, চিয়ার্স!


: অন্য এক আমি দরকারী পাওয়া যে আপনার log4j.properties ফাইল নির্দিষ্ট করতে পারেন হয়--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
Selle

2

স্কাল ব্যবহারকারীদের জন্য এই নীচে কোড স্নিপেট:

বিকল্প 1 :

স্নিপেটের নীচে আপনি ফাইল স্তরে যুক্ত করতে পারেন

import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)

বিকল্প 2:

দ্রষ্টব্য: যা স্পার্ক সেশন ব্যবহার করছে এমন সমস্ত অ্যাপ্লিকেশনের জন্য প্রযোজ্য।

import org.apache.spark.sql.SparkSession

  private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()

spark.sparkContext.setLogLevel("WARN")

বিকল্প 3:

দ্রষ্টব্য: এই কনফিগারেশনটি আপনার লগ 4j.properties- এ যুক্ত করা উচিত .. (যেহেতু /etc/spark/conf/log4j.properties (যেখানে স্পার্ক ইনস্টলেশন রয়েছে) বা আপনার প্রকল্প ফোল্ডার স্তরের লগ 4j.properties হতে পারে) যেহেতু আপনি এখানে পরিবর্তন করছেন মডিউল স্তর। এটি সমস্ত আবেদনের জন্য প্রযোজ্য হবে।

log4j.rootCategory=ERROR, console

আইএমএইচও, অপশন 1 হ'ল বুদ্ধিমান উপায়, যেহেতু এটি ফাইল স্তরে স্যুইচ অফ করা যায়।


1

আমি যেভাবে এটি করি তা হ'ল:

লোকেশন আমি spark-submitস্ক্রিপ্ট চালাতে না

$ cp /etc/spark/conf/log4j.properties .
$ nano log4j.properties

INFOআপনি যে কোন পর্যায়ে লগিং চান তা পরিবর্তন করুন এবং তারপরে আপনার চালনা করুনspark-submit


cp /etc/spark/conf/log4j.properties.template .
গভীরতা

0

আমি আপনাকে লগিং ব্যবহার করতে চাই (পাইথনের লগিং সুবিধা) আপনি নিজের অ্যাপ্লিকেশন এবং স্পার্কের জন্য বিভাজনকারী কনফিগারেশনগুলি চেষ্টা করতে পারেন:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.