Tüm Ürünler
Search
Belge Merkezi

:Spark SSS

Son Güncelleme:Oct 04, 2026

Bu konu, Spark kullanımıyla ilgili sıkça sorulan soruları açıklamaktadır.

Projemde nasıl kendi kendine kontrol yapabilirim?

Aşağıdaki öğeleri kontrol edin:

  • pom.xml dosyasını kontrol edin.

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope> // The scope of the spark-xxxx_${scala.binary.version} dependency must be provided.
    </dependency>
  • Ana sınıf spark.master parametresini kontrol edin.

    val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .config("spark.master", "local[4]") // If you submit a job in yarn-cluster mode, an error occurs if the local[N] configuration is in the code.
          .getOrCreate()
  • Ana sınıf Scala kodunu kontrol edin.

    object SparkPi { // This must be an object. If you define this as a class when you create the file in IntelliJ IDEA, the main function cannot be loaded.
      def main(args: Array[String]) {
        val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .getOrCreate()
  • Ana sınıf kod yapılandırmasını kontrol edin.

    val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .config("key1", "value1")
          .config("key2", "value2")
          .config("key3", "value3")
          ...  // If you hard-code MaxCompute configurations in the code for a local test, some configurations do not take effect.
          .getOrCreate()
    Not

    yarn-cluster modunda işleri gönderdiğinizde tüm yapılandırma öğelerini spark-defaults.conf dosyasına ekleyin.

DataWorks üzerinde bir ODPS Spark düğümünü çalıştırmak için hangi adımları izlemeliyim?

  1. Yerel Python ortamınızda Spark kodunu düzenleyip paketleyin. Python ortamı Python 2.7 olmalıdır.

  2. Kaynak paketini DataWorks'e yükleyin. Daha fazla bilgi için bkz. MaxCompute kaynakları oluşturma ve kullanma.

  3. DataWorks'te bir ODPS Spark düğümü oluşturun. Daha fazla bilgi için bkz. ODPS Spark düğümü oluşturma.

  4. Kodu yazın ve düğümü çalıştırın. Sonucu DataWorks konsolunda görüntüleyebilirsiniz.

MaxCompute üzerinde Spark'ı yerel olarak nasıl hata ayıklarım?

Yerel hata ayıklama için IntelliJ IDEA'yı kullanabilirsiniz. Daha fazla bilgi için bkz. Linux geliştirme ortamı kurma.

Spark kullanarak VPC ortamındaki hizmetlere nasıl erişebilirim?

Spark kullanarak VPC'deki hizmetlere erişme hakkında daha fazla bilgi için bkz. Spark'tan VPC bağlantılı örneklere erişim.

Bir JAR paketini kaynak olarak nasıl referans alabilirim?

Referans almak istediğiniz kaynakları belirtmek için spark.hadoop.odps.cupid.resources parametresini kullanabilirsiniz. Kaynaklar birden fazla proje tarafından paylaşılabilir. Veri güvenliğini sağlamak için ilgili izinleri ayarlayın. Aşağıdaki örnek, bir yapılandırma örneği göstermektedir.

spark.hadoop.odps.cupid.resources = projectname.xx0.jar,projectname.xx1.jar 

Spark kullanarak parametreleri nasıl aktarabilirim?

Parametre aktarma hakkında daha fazla bilgi için bkz. DataWorks üzerinde Spark.

Spark tarafından akış olarak okunan DataHub verilerini MaxCompute'a nasıl yazarım?

Örnek kod için bkz. DataHub.

Açık kaynaklı Spark kodunu MaxCompute üzerindeki Spark'a nasıl geçirebilirim?

İş senaryonıza göre bir geçiş çözümü seçebilirsiniz:

  • İşin MaxCompute tablolarına veya OSS'e erişmesi gerekmez.

    Mevcut JAR paketini doğrudan çalıştırabilirsiniz. Daha fazla bilgi için bkz. Linux geliştirme ortamı kurma. Spark veya Hadoop bağımlılığı provided olarak ayarlanmalıdır.

  • İşin MaxCompute tablolarına erişmesi gerekir.

    İlgili bağımlılıkları yapılandırıp yeniden paketleyin. Daha fazla bilgi için bkz. Linux geliştirme ortamı kurma.

  • İşin OSS'e erişmesi gerekir.

    OSS'e erişmek için gereken paketleri edinin ve ağ bağlantısı kurun. Ardından uygulamayı yeniden derleyip paketleyerek dağıtın ve çalıştırın. Daha fazla bilgi için bkz. Linux geliştirme ortamı kurma.

MaxCompute'taki tablo verilerini işlemek için Spark'ı nasıl kullanabilirim?

MaxCompute üzerindeki Spark; Local, Cluster ve DataWorks çalışma modlarını destekler. Üç modun yapılandırmaları farklıdır. Daha fazla bilgi için bkz. Çalışma zamanı modları.

Spark için kaynak paralelliğini nasıl ayarlarım?

Spark'ın kaynak paralelliği, yürütücü sayısı ve yürütücü başına CPU çekirdek sayısı ile belirlenir. Paralel olarak çalıştırılabilecek maksimum görev sayısı Yürütücü sayısı × Yürütücü başına CPU çekirdek sayısı şeklindedir.

  • Yürütücü sayısı

    • Parametre: spark.executor.instances.

    • Açıklama: İşin talep ettiği yürütücü sayısını ayarlar.

  • Yürütücü başına CPU çekirdek sayısı

    • Parametre: spark.executor.cores.

    • Açıklama: Her yürütücü işlemi için CPU çekirdek sayısını ayarlar. Bu parametre, her yürütücü işleminin görevleri paralel olarak yürütme kapasitesini belirler. Her CPU çekirdeği aynı anda yalnızca bir görev çalıştırabilir. Her yürütücü için CPU çekirdek sayısının 2 ila 4 arasında bir değere ayarlanması önerilir.

Bellek yetersizliği sorunlarını nasıl çözerim?

  • Yaygın hatalar:

    • java.lang.OutOfMemoryError: Java heap space.

    • java.lang.OutOfMemoryError: GC overhead limit exceeded.

    • Cannot allocate memory.

    • The job has been killed by "OOM Killer", please check your job's memory usage.

  • Çözümler:

    • Yürütücü belleğini ayarlayın.

      • Parametre: spark.executor.memory.

      • Parametre açıklaması: Bu parametre, her yürütücünün bellek boyutunu belirtir. Yürütücü belleği ile spark.executor.cores arasında 1:4 oranını korumanız önerilir. Örneğin, spark.executor.cores değeri 1 olarak ayarlanmışsa spark.executor.memory değerini 4 GB olarak ayarlayabilirsiniz. Bir yürütücü java.lang.OutOfMemoryError özel durumu oluşturuyorsa bu parametrenin değerini artırmanız gerekir.

    • Yürütücü yığın dışı belleğini ayarlayın.

      • Parametre: spark.executor.memoryOverhead.

      • Açıklama: Her yürütücü için ek belleği belirtir. Bu bellek, çoğunlukla JVM'nin kendisi, dizeler ve NIO arabellekleri gibi ek yükler için kullanılır. Varsayılan boyut spark.executor.memory × 0.1 olup minimum 384 MB'dır. Genellikle bu parametreyi ayarlamanız gerekmez. Yürütücü günlüğünde Cannot allocate memory veya OOM Killer hatası görünürse bu değeri artırabilirsiniz.

    • Sürücü belleğini ayarlayın.

      • Parametre: spark.driver.memory.

      • Parametre açıklaması: Bu parametre, sürücünün bellek boyutunu belirtir. spark.driver.cores ile sürücü belleği arasında 1:4 oranı önerilir. Sürücünün büyük miktarda veri toplaması gerekiyorsa veya java.lang.OutOfMemoryError hatası bildiriliyorsa bu değeri artırmanız gerekir.

    • Sürücü yığın dışı belleğini ayarlayın.

      • Parametre: spark.driver.memoryOverhead.

      • Açıklama: Sürücünün ek belleğini belirtir. Varsayılan boyut spark.driver.memory × 0.1 olup minimum 384 MB'dır. Sürücü günlüğünde Cannot allocate memory hatası görünürse bu değeri artırabilirsiniz.

Disk alanı yetersizliği sorunlarını nasıl çözerim?

  • Belirti

    No space left on device hatası oluşur.

  • Neden: Bu hata, yerel disk alanının yetersiz olduğunu gösterir. Hata genellikle bir yürütücüde meydana gelir ve yürütücünün çıkmasına neden olur.

  • Çözümler:

    • Disk boyutunu artırın.

      • Parametre: spark.hadoop.odps.cupid.disk.driver.device_size.

      • Varsayılan değer: %20 GB.

      • Açıklama: Varsayılan olarak sürücü ve her yürütücü için %20 GB yerel disk alanı sağlanır. Disk alanı yetersizse bu parametre değerini artırabilirsiniz. Bu parametrenin yalnızca spark-defaults.conf dosyasında veya DataWorks yapılandırma öğelerinde yapılandırıldığında etkili olduğunu unutmayın.

    • Yürütücü sayısını artırın.

      Yerel disk boyutunu 100 GB'a çıkardıktan sonra bu hata devam ediyorsa tek bir yürütücünün shuffle verileri üst sınırı aşmıştır. Bu durum veri eğriminden kaynaklanıyor olabilir. Böyle bir durumda verileri yeniden bölümlemeniz gerekir. Hata, veri hacminin çok büyük olmasından da kaynaklanabilir. Bu durumda yürütücü sayısını artırmak için spark.executor.instances parametresini ayarlamanız gerekir.

MaxCompute projesindeki kaynaklara nasıl referans verebilirim?

MaxCompute üzerindeki Spark, MaxCompute'taki kaynaklara erişmek için aşağıdaki iki yöntemi destekler:

  • Parametreleri yapılandırarak MaxCompute kaynaklarına doğrudan referans verme.

    • Parametre: spark.hadoop.odps.cupid.resources.

    • Biçim: <projectname>.<resourcename>[:<newresourcename>].

    • Açıklama: Bu yapılandırma öğesi, görevi çalıştırmak için gereken MaxCompute kaynaklarını belirtir. Daha fazla bilgi için bkz. Kaynakları yönetme. Belirtilen kaynaklar sürücünün ve yürütücülerin geçerli çalışma dizinine indirilir. Bir görev birden fazla kaynağa referans verebilir. Kaynakları virgül (,) ile ayırabilirsiniz. Bir kaynak çalışma dizinine indirildikten sonra varsayılan adı <projectname>.<resourcename> olur. Kaynağı <projectname>.<resourcename>:<newresourcename> biçimini kullanarak yeniden adlandırabilirsiniz. Bu yapılandırma öğesinin yalnızca spark-defaults.conf dosyasında veya DataWorks yapılandırma öğelerinde yapılandırıldığında etkili olduğunu unutmayın.

    • Örnek:

      ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
      
      ## Reference multiple resources at the same time: Reference both public.python-python-2.7-ucs4.zip and public.myjar.jar.
      spark.hadoop.odps.cupid.resources=public.python-python-2.7-ucs4.zip,public.myjar.jar
      
      ## Renaming example: Reference public.myjar.jar and rename it to myjar.jar.
      spark.hadoop.odps.cupid.resources=public.myjar.jar:myjar.jar
  • DataWorks'te kaynaklara referans verme.

    • DataWorks'teki Veri Geliştirme bölmesinde MaxCompute kaynaklarını iş akışına ekleyin. Daha fazla bilgi için bkz. MaxCompute kaynaklarını yönetme.

    • DataWorks'teki ODPS Spark düğümünde JAR, dosya ve arşiv kaynaklarını seçin.

    Not

    Bu yöntem, görev çalışırken kaynakları yükler. Büyük kaynaklar için 1. Yöntemi kullanın.

Bir VPC'ye nasıl erişebilirim?

MaxCompute üzerindeki Spark, Alibaba Cloud VPC'sindeki hizmetlere erişmek için aşağıdaki yöntemi destekler:

  • ENI bağlantısı üzerinden erişim

    • Sınırlamalar

      Aynı bölgedeki bir VPC'ye bağlanmak için esnek ağ arabirimi (ENI) kullanabilirsiniz. İşinizin birden fazla VPC'ye erişmesi gerekiyorsa ENI üzerinden zaten bağlı olan VPC'yi diğer VPC'lere bağlayabilirsiniz.

    • Prosedür:

      1. ENI tabanlı kiralık hat bağlantısını etkinleştirin. Daha fazla bilgi için bkz. Spark'tan VPC bağlantılı örneklere erişim.

      2. Erişmek istediğiniz hizmette, MaxCompute'u temsil eden güvenlik grubuna (önceki adımda sağladığınız güvenlik grubu) belirli bağlantı noktalarına erişim izni vermek için bir beyaz liste ekleyin.

        Örneğin, ApsaraDB RDS'e erişmek için RDS'de 1. Adımda oluşturulan güvenlik grubundan gelen erişime izin veren bir kural eklemeniz gerekir. Erişmek istediğiniz hizmet için bir güvenlik grubu ekleyemiyor ve yalnızca IP adresleri ekleyebiliyorsanız 1. Adımda kullanılan vSwitch CIDR bloğunu eklemeniz gerekir.

      3. İş için spark.hadoop.odps.cupid.eni.info ve spark.hadoop.odps.cupid.eni.enable parametrelerini yapılandırın.

        Aşağıdaki örnek bir yapılandırma örneği göstermektedir. Bölge Kimliği ve VPCID değerlerini gerçek değerlerinizle değiştirin.

        ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
        
        spark.hadoop.odps.cupid.eni.enable = true
        spark.hadoop.odps.cupid.eni.info = [regionid]:[vpcid]

İnternete nasıl erişebilirim?

MaxCompute üzerindeki Spark, genel hizmetlere erişmek için aşağıdaki iki yöntemi destekler:

  • ENI bağlantısı üzerinden erişim

    1. ENI tabanlı kiralık hat bağlantısını etkinleştirin. Daha fazla bilgi için bkz. Spark'tan VPC bağlantılı örneklere erişim.

    2. Kiralık hat için kullanılan VPC'nin İnternete erişebildiğinden emin olun. Daha fazla bilgi için bkz. İnternet NAT ağ geçidinin SNAT özelliğini kullanarak İnternete erişim.

    3. Spark işi düzeyinde bir genel erişim beyaz listesi yapılandırmak ve ENI'yi etkinleştirmek için aşağıdaki örnek komutları kullanın. Bölge Kimliği ve VPCID değerlerini gerçek değerlerinizle değiştirin.

       ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
      spark.hadoop.odps.cupid.internet.access.list=aliyundoc.com:443
      spark.hadoop.odps.cupid.eni.enable=true
      spark.hadoop.odps.cupid.eni.info=[region]:[vpcid]
  • SmartNAT üzerinden erişim

    Sınırlama: Bu yöntem Spark 3.4 ve sonraki sürümlerde desteklenmez.

    https://aliyundoc.com:443 adresine erişmeniz gerektiğini varsayalım. Aşağıdaki adımları izleyebilirsiniz:

    1. MaxCompute geliştirici topluluğuna katılmak için DingTalk grup kimliği 11782920'yi arayabilirsiniz. https://aliyundoc.com:443 adresini odps.security.outbound.internetlist listesine eklemek için MaxCompute teknik destek ekibiyle iletişime geçin.

    2. Spark işi düzeyinde bir genel erişim beyaz listesi yapılandırmak ve SmartNAT'yi etkinleştirmek için aşağıdaki örnek komutları kullanın.

    3. ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
      spark.hadoop.odps.cupid.internet.access.list=aliyundoc.com:443
      spark.hadoop.odps.cupid.smartnat.enable=true

OSS'e nasıl erişebilirim?

MaxCompute üzerindeki Spark, Jindo yazılım geliştirme kitini (SDK) kullanarak Alibaba Cloud OSS'e erişimi destekler. Aşağıdaki bilgileri yapılandırmanız gerekir:

  • Jindo SDK'yı ve bir OSS uç noktasını yapılandırın.

    Aşağıdaki kod bir örnek komut sağlar.

    ## Reference the JindoSDK JAR package. The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
    spark.hadoop.odps.cupid.resources=public.jindofs-sdk-3.7.2.jar
    
    ## Set the OSS implementation class.
    spark.hadoop.fs.AbstractFileSystem.oss.impl=com.aliyun.emr.fs.oss.OSS
    spark.hadoop.fs.oss.impl=com.aliyun.emr.fs.oss.JindoOssFileSystem
    
    ## Set the OSS Endpoint.
    spark.hadoop.fs.oss.endpoint=oss-[YourRegionId]-internal.aliyuncs.com
    
    ## You do not usually need to set a network whitelist for the OSS endpoint. If the network is disconnected when the job runs, you can add a whitelist using the following parameter.
    ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
    spark.hadoop.odps.cupid.trusted.services.access.list=[YourBucketName].oss-[YourRegionId]-internal.aliyuncs.com
    Not

    MaxCompute üzerindeki Spark cluster modunda çalıştığında yalnızca dahili OSS uç noktaları desteklenir. Genel OSS uç noktaları desteklenmez. OSS bölgeleri ve uç noktaları arasındaki eşlemeler hakkında daha fazla bilgi için bkz. OSS bölgeleri ve uç noktaları.

  • OSS kimlik doğrulama bilgilerini yapılandırın. Jindo SDK aşağıdaki iki kimlik doğrulama yöntemini destekler.

    • Kimlik doğrulama için bir AccessKey çifti kullanın. Aşağıdaki kod bir yapılandırma örneği gösterir:

      val conf = new SparkConf()
        .setAppName("jindo-sdk-demo")
        # Configure access key authentication parameters.
        .set("spark.hadoop.fs.oss.accessKeyId", "<YourAccessKeyId>")
        .set("spark.hadoop.fs.oss.accessKeySecret", "<YourAccessKeySecret>")
    • Kimlik doğrulama için bir Security Token Service (STS) belirteci kullanın. Aşağıdaki adımları izleyin:

      1. MaxCompute projesinin mevcut Alibaba Cloud hesabındaki OSS kaynaklarına STS belirteci kullanarak erişmesine izin vermek için Tek Tıkla Yetkilendirme seçeneğine tıklayın.

        Not

        Tek tıkla yetkilendirmeyi yalnızca MaxCompute projesi ve OSS kaynakları aynı Alibaba Cloud hesabına ait olduğunda kullanabilirsiniz.

      2. Yerel HTTP hizmetini yapılandırın ve etkinleştirin.

        Aşağıdaki kod bir örnek komut sağlar.

        ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
        spark.hadoop.odps.cupid.http.server.enable = true
      3. Kimlik doğrulama bilgilerini yapılandırın.

        Aşağıdaki komut bir örnektir.

        val conf = new SparkConf()
          .setAppName("jindo-sdk-demo")
          # Configure cloud service role authentication.
          # ${aliyun-uid} is the UID of the Alibaba Cloud account.
          # ${role-name} is the role name.
          .set("spark.hadoop.fs.jfs.cache.oss.credentials.provider", "com.aliyun.emr.fs.auth.CustomCredentialsProvider")
          .set("spark.hadoop.aliyun.oss.provider.url", "http://localhost:10011/sts-token-info?user_id=${aliyun-uid}&role=${role-name}")

Üçüncü taraf bir Python kitaplığına nasıl referans verebilirim?

  • Belirti: Bir PySpark işi çalıştırıldığında No module named 'xxx' özel durumu oluşur.

  • Neden: PySpark işi, MaxCompute platformunun varsayılan Python ortamında yüklü olmayan üçüncü taraf bir Python kitaplığına bağımlıdır.

  • Çözüm: Üçüncü taraf kitaplık bağımlılıklarını eklemek için aşağıdaki yöntemlerden birini kullanabilirsiniz.

    • MaxCompute'un genel Python ortamını kullanın.

      DataWorks yapılandırma öğelerine veya spark-defaults.conf dosyasına aşağıdaki yapılandırmaları eklemeniz yeterlidir. Aşağıdaki kod, farklı Python sürümleri için yapılandırmaları gösterir:

      • Python 2 yapılandırması

        ## Python 2.7.13 configuration
        ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
        spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz
        spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python
        
        ## List of third-party libraries
        https://odps-repo.oss-cn-hangzhou.aliyuncs.com/pyspark/py27/py27-default_req.txt
      • Python 3 yapılandırması

        ## Python 3.7.9 configuration
        ## The following configurations must be added to the DataWorks configuration items or the spark-defaults.conf file.
        spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz
        spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3
        
        ## List of third-party libraries
        https://odps-repo.oss-cn-hangzhou.aliyuncs.com/pyspark/py37/py37-default_req.txt
    • Tek bir WHEEL paketi yükleyin.

      Bu yöntem, az sayıda ve basit üçüncü taraf Python bağımlılığı olduğu senaryolar için uygundur. Aşağıda bir örnek komut verilmiştir:

      ## Rename the wheel package to a zip package. For example, rename the pymysql wheel package to pymysql.zip.
      ## Upload the renamed zip package (file type: archive).
      ## Reference the zip package on the DataWorks Spark node (archive type).
      ## Add the following configurations to the spark-defaults.conf file or DataWorks configuration items before you import the package.
      ## Configuration
      spark.executorEnv.PYTHONPATH=pymysql
      spark.yarn.appMasterEnv.PYTHONPATH=pymysql
      
      ## Upload code
      import pymysql
    • Tam bir özel Python ortamı yükleyin.

      Bu yöntem, karmaşık bağımlılıkların olduğu veya özel bir Python sürümünün gerekli olduğu senaryolar için uygundur. Tam Python ortamını paketleyip yüklemek için bir Docker konteyneri kullanmanız gerekir. Daha fazla bilgi için bkz. Bağımlılıkları paketleme.

JAR bağımlılık çakışmalarını nasıl çözerim?

  • Belirti: Çalışma zamanında bir NoClassDefFoundError or NoSuchMethodError özel durumu oluşur.

  • Neden: Bu sorun genellikle JAR paketindeki üçüncü taraf bağımlılığının sürümünün Spark bağımlılık sürümüyle çakışmasından kaynaklanır. Yüklenen ana JAR paketini ve üçüncü taraf bağımlılık kitaplıklarını kontrol ederek çakışan bağımlılıkları hariç tutabilirsiniz.

  • Çözüm:

    • pom.xml dosyasında kendi kendine kontrol yapın.

      • Spark topluluk sürümü bağımlılığını Provided olarak ayarlayın.

      • Hadoop topluluk sürümü bağımlılığını Provided olarak ayarlayın.

      • ODPS/Cupid bağımlılığını Provided olarak ayarlayın.

    • Çakışan bağımlılıkları hariç tutun.

    • Paket çakışmalarını çözmek için maven-shade-plugin relocation kullanın.

Yerel modda nasıl hata ayıklarım?

  • Spark 2.3.0

    1. Aşağıdaki yapılandırmaları spark-defaults.conf dosyasına ekleyin.

      spark.hadoop.odps.project.name =<Yourprojectname>
      spark.hadoop.odps.access.id =<YourAccessKeyID>
      spark.hadoop.odps.access.key =<YourAccessKeySecret>
      spark.hadoop.odps.end.point =<endpoint>
    2. Görevi yerel modda çalıştırın.

      ./bin/spark-submit --master local spark_sql.py
  • Spark 2.4.5/Spark 3.1.1

    1. odps.conf adlı bir dosya oluşturun ve aşağıdaki yapılandırmaları dosyaya ekleyin.

      odps.access.id=<YourAccessKeyID>
      odps.access.key=<YourAccessKeySecret>
      odps.end.point=<endpoint>
      odps.project.name=<Yourprojectname>
    2. odps.conf dosyasının konumunu işaret eden bir ortam değişkeni ekleyin.

      export ODPS_CONF_FILE=/path/to/odps.conf
    3. Görevi yerel modda çalıştırın.

      ./bin/spark-submit --master local spark_sql.py
  • Yaygın hatalar

    • Hata 1:

      • Hata mesajları:

        • Incomplete config, no accessId or accessKey.

        • Incomplete config, no odps.service.endpoint.

      • Neden: Yerel modda EventLog etkindir.

      • Çözüm: spark-defaults.conf dosyasından spark.eventLog.enabled=true parametresini silin.

    • Hata 2:

      • Hata mesajı: Cannot create CupidSession with empty CupidConf.

      • Neden: Spark 2.4.5 veya Spark 3.1.1 odps.access.id gibi bilgileri okuyamaz.

      • Çözüm: odps.conf dosyasını oluşturun, ortam değişkenini ekleyin ve ardından görevi çalıştırın.

    • Hata 3:

      • Hata mesajı: java.util.NoSuchElementException: odps.access.id.

      • Neden: Spark 2.3.0 odps.access.id gibi bilgileri okuyamaz.

      • Çözüm: spark-defaults.conf dosyasına spark.hadoop.odps.access.id gibi yapılandırma bilgilerini ekleyin.

Spark işi çalıştırırken "User signature does not match" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    Stack:
    com.aliyun.odps.OdpsException: ODPS-0410042:
    Invalid signature value - User signature does not match
  • Neden

    Kimlik doğrulama başarısız oldu. AccessKey ID veya AccessKey gizli anahtarı yanlış.

  • Çözüm

    spark-defaults.conf dosyasındaki AccessKey ID ve AccessKey gizli anahtarının Alibaba Cloud konsolundaki Kullanıcı Bilgileri Yönetimi içindeki AccessKey ID ve AccessKey Secret ile tutarlı olup olmadığını kontrol edin. Tutarlı değilse bunları tutarlı olacak şekilde değiştirin.

Spark işi çalıştırırken "You have NO privilege" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    Stack:
    com.aliyun.odps.OdpsException: ODPS-0420095: 
    Access Denied - Authorization Failed [4019], You have NO privilege 'odps:CreateResource' on {acs:odps:*:projects/*}
  • Nedenler

    Gerekli izne sahip değilsiniz.

  • Çözüm

    Proje sahibi, kaynak için Okuma ve Oluşturma izinlerini vermelidir. Yetkilendirme hakkında daha fazla bilgi için bkz. MaxCompute izinleri.

Spark işi çalıştırırken "Access Denied" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    Exception in thread "main" org.apache.hadoop.yarn.exceptions.YarnException: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - The task is not in release range: CUPID
  • Nedenler

    • Neden 1: spark-defaults.conf dosyasında yapılandırılan AccessKey ID veya AccessKey gizli anahtarı yanlış.

    • Neden 2: Projenin bulunduğu bölgede MaxCompute üzerindeki Spark kullanılamıyor.

  • Çözümler

    • Neden 1 için çözüm: spark-defaults.conf dosyasındaki yapılandırmayı kontrol edin. AccessKey ID ve AccessKey gizli anahtarını doğru değerlerle değiştirin. Daha fazla bilgi için bkz. Linux geliştirme ortamı kurma.

    • Neden 2 için çözüm: Projenin bulunduğu bölgede MaxCompute üzerindeki Spark'ın kullanılabilir olup olmadığını kontrol edin veya danışmanlık için DingTalk grubu 21969532'ye (MaxCompute üzerinde Spark desteği) katılın.

Spark işi çalıştırırken "No space left on device" hatası alırsam ne yapmalıyım?

Spark yerel depolama için diskleri kullanır. Shuffle verileri ve BlockManager'dan taşan veriler bu disklerde saklanır. Disk boyutu spark.hadoop.odps.cupid.disk.driver.device_size parametresi tarafından kontrol edilir. Varsayılan boyut %20 GB, maksimum boyut ise 100 GB'dır. Disk boyutunu 100 GB'a çıkardıktan sonra hata devam ederse nedeni analiz etmeniz gerekir. Yaygın bir neden, shuffle veya önbelleğe alma işlemi sırasında verilerin birkaç blokta yoğunlaştığı veri eğridir. Bu durumda yürütücü başına çekirdek sayısını (spark.executor.cores) azaltıp yürütücü sayısını (spark.executor.instances) artırabilirsiniz.

Spark işi çalıştırırken "Table or view not found" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    Table or view not found:xxx
  • Nedenler

    • Neden 1: Tablo veya görünüm mevcut değil.

    • Neden 2: Hive katalog yapılandırması etkin.

  • Çözümler

    • Neden 1 için çözüm: Tabloyu oluşturun.

    • Neden 2 için çözüm: Katalog yapılandırmasını kaldırın. Örneğin, aşağıdaki kodda enableHiveSupport() ifadesini kaldırın.

      spark = SparkSession.builder.appName(app_name).enableHiveSupport().getOrCreate()

Spark işi çalıştırırken "Shutdown hook called before final status was reported" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür:

    App Status: SUCCEEDED, diagnostics: Shutdown hook called before final status was reported.
  • Neden

    Kümeye gönderilen ana uygulama, ApplicationMaster (AM) aracılığıyla küme kaynakları talep etmedi. Örneğin, bir SparkContext oluşturulmadı veya kodda spark.master yerel olarak ayarlandı.

Spark işi çalıştırırken bir JAR paketi sürüm çakışması hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    User class threw exception: java.lang.NoSuchMethodError
  • Neden

    Bir JAR paketi sürüm çakışması veya sınıf hatası oluştu.

  • Çözüm

    1. $SPARK_HOME/jars yolunda, hataya neden olan sınıfın bulunduğu JAR paketini bulun. Ardından, üçüncü taraf kitaplığın koordinatlarını ve sürümünü bulmak için aşağıdaki komutu çalıştırın.

      grep <AbnormalClassName> $SPARK_HOME/jars/*.jar
    2. Spark işinin kök dizininde, projenin tüm bağımlılıklarını görüntülemek için aşağıdaki komutu çalıştırın.

      mvn dependency:tree
    3. İlgili bağımlılığı bulduktan sonra çakışan paketi hariç tutmak için aşağıdaki komutu çalıştırın.

      maven dependency exclusions
    4. Kodu yeniden derleyip gönderin.

Spark işi çalıştırırken "ClassNotFound" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    java.lang.ClassNotFoundException: xxxx.xxx.xxxxx
  • Neden

    Sınıf mevcut değil veya bağımlılık yanlış yapılandırılmış.

  • Çözüm

    1. Gönderdiğiniz JAR paketinde sınıf tanımının var olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın.

      jar -tf <JobJARFile> | grep <ClassName>
    2. pom.xml dosyasındaki bağımlılıkların doğru olup olmadığını kontrol edin.

    3. JAR paketini göndermek için Shade yöntemini kullanın.

Spark işi çalıştırırken "The task is not in release range" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    The task is not in release range: CUPID
  • Neden

    Projenin bulunduğu bölgede MaxCompute üzerindeki Spark hizmeti etkinleştirilmemiş.

  • Çözüm

    MaxCompute üzerindeki Spark hizmetinin etkin olduğu bir bölge seçin.

Spark işi çalıştırırken "java.io.UTFDataFormatException" hatası alırsam ne yapmalıyım?

  • Belirti

    Bir Spark işi çalıştırdığınızda aşağıdaki hata döndürülür.

    java.io.UTFDataFormatException: encoded string too long: 2818545 bytes 
  • Çözüm

    spark-defaults.conf dosyasındaki spark.hadoop.odps.cupid.disk.driver.device_size parametresinin değerini ayarlayın. Varsayılan değer %20 GB, maksimum değer ise 100 GB'dır.

Spark işi çalıştırırken Çin karakterleri bozuk yazdırılırsa ne yapmalıyım?

Aşağıdaki yapılandırmayı ekleyin.

"--conf" "spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
"--conf" "spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"

Spark İnternet üzerinden üçüncü taraf bir görevi çağırdığında hata alırsam ne yapmalıyım?

Spark doğrudan bağlantıya sahip olmadığından İnternet'teki üçüncü taraf görevleri doğrudan çağıramaz.

Proxy üzerinden İnternete erişmek için bir VPC'de Nginx ters proxy oluşturabilirsiniz. Spark, bir VPC'ye doğrudan erişimi destekler. Daha fazla bilgi için bkz. Spark'tan VPC bağlantılı örneklere erişim.