Aracılığıyla paylaş


Not defterlerini düzenleme ve not defterlerinde kodu modüler hale getirme

Not defterlerini düzenlemeyi ve not defterlerinde kodu modüler hale getirmeyi öğrenin. Örneklere bakın ve not defteri düzenleme için alternatif yöntemlerin ne zaman kullanılacağını anlayın.

Düzenleme ve kod modülerleştirme yöntemleri

Aşağıdaki table not defterlerini düzenlemek ve not defterlerinde kodu modüler hale getirme için kullanılabilen yöntemleri karşılaştırır.

Yöntem Kullanım örneği Notlar
Databricks İşleri Not defteri orkestrasyonu (önerilir) Not defterlerini düzenlemeye yönelik önerilen yöntem.

Görev bağımlılıkları, zamanlama ve tetikleyicilerle karmaşık iş akışlarını destekler. Üretim iş yükleri için sağlam ve ölçeklenebilir bir yaklaşım sağlar, ancak kurulum ve yapılandırma gerektirir.
dbutils.notebook.run() Defter orkestrasyonu Jobs, kullanım senaryonuzu destekleyemezse, örneğin dinamik bir parametersset üzerinden not defterlerinin bir döngüye alınması gibi, dbutils.notebook.run() kullanın.

Her çağrı için yeni bir kısa ömürlü iş başlatır, bu da ek yükü artırabilir ve gelişmiş zamanlama özelliklerinden yoksundur.
Çalışma alanı dosyaları Kod modülerleştirme (önerilen) Kodu modüler hale getirme için önerilen yöntem.

Kodu çalışma alanında depolanan yeniden kullanılabilir kod dosyalarına modüler hale getirme. Daha iyi hata ayıklama ve birim testi için depolarla sürüm denetimini ve IDE'lerle tümleştirmeyi destekler. Dosya yollarını ve bağımlılıklarını yönetmek için ek kurulum gerektirir.
%run Kod modülerleştirme Çalışma alanı dosyalarına erişemiyorsanız %run kullanın.

İşlevleri veya değişkenleri satır içinde yürüterek diğer not defterlerinden içeri aktarmanız yeterlidir. Prototip oluşturma için kullanışlıdır, ancak bakımı zor olan sıkı bir şekilde bağlanmış kodlara yol açabilir. Parametre geçirmeyi veya sürüm denetimini desteklemez.

%run ile dbutils.notebook.run() karşılaştırması

komutu, %run not defterine başka bir not defteri eklemenize olanak tanır. Destekleyici işlevleri ayrı bir not defterine yerleştirerek kodunuzu modüler hale getirmek için %run kullanabilirsiniz. Ayrıca, bir çözümlemedeki adımları uygulayan not defterlerini birleştirmek için de kullanabilirsiniz. kullandığınızda %run, çağrılan not defteri hemen yürütülür ve içinde tanımlanan işlevler ve değişkenler çağrılan not defterinde kullanılabilir hale gelir.

dbutils.notebook API%run tamamlar çünkü not defterine parameters geçirmenize ve not defterinden values döndürmenize olanak tanır. Bu, bağımlılıklarla karmaşık iş akışları ve işlem hatları oluşturmanıza olanak tanır. Örneğin, bir dizindeki dosyaların adlarını başka bir not defterine aktarmak için listget yapabilirsiniz; bu, %runile mümkün değildir. Ayrıca, dönüş valuestemelinde if-then-else iş akışları da oluşturabilirsiniz.

yönteminin %run aksinedbutils.notebook.run(), not defterini çalıştırmak için yeni bir iş başlatır.

Tüm dbutils API'leri gibi bu yöntemler de yalnızca Python ve Scala'da kullanılabilir. Ancak, R not defterini çağırmak için kullanabilirsiniz dbutils.notebook.run() .

Not defterini içeri aktarmak için kullanma %run

Bu örnekte, ilk not defteri, komutunu yürütmek reverseiçin sihri kullandıktan %run sonra ikinci not defterinde bulunan bir işlevi shared-code-notebooktanımlar.

Paylaşılan kod not defteri

Not defteri içeri aktarma örneği

Her iki not defteri de çalışma alanında aynı dizinde olduğundan, yolun şu anda çalışan not defterine göre çözümlenmesi gerektiğini belirtmek için ./shared-code-notebook'da ./ ön ekini kullanın. Not defterlerini gibi %run ./dir/notebookdizinler halinde düzenleyebilir veya gibi %run /Users/username@organization.com/directory/notebookmutlak bir yol kullanabilirsiniz.

Not

  • %run tüm not defterini satır içinde çalıştırdığından hücrede tek başına olmalıdır.
  • Bir Python dosyasını ve bu dosyada tanımlanan varlıkları bir not defterinde çalıştırmak için kullanamazsınız%run.import Python dosyasından içeri aktarmak için bkz . Dosyaları kullanarak kodunuzu modüler hale getirmek. Alternatif olarak, dosyayı bir Python kitaplığına paketleyin, bu Python kitaplığından bir Azure Databricks kitaplığı oluşturun ve kitaplığı not defterinizi çalıştırmak için kullandığınız kümeye yükleyin.
  • Pencere öğeleri içeren bir not defterini çalıştırmak için %run kullandığınızda, varsayılan olarak belirtilen not defteri pencere öğesinin varsayılan valuesile çalışır. values'ı pencere öğelerine de aktarabilirsiniz; Databricks pencere öğelerini %runile kullanmaya bakın.

Yeni bir iş başlatmak için dbutils.notebook.run kullanma

Not defterini çalıştırın ve çıkış değerini döndürür. yöntemi hemen çalışan kısa ömürlü bir iş başlatır.

API'de dbutils.notebook kullanılabilen yöntemler ve runşeklindedirexit. Hem parameters hem de dönüş values dize olmalıdır.

run(path: String, timeout_seconds: int, arguments: Map): String

timeout_seconds parametresi çalıştırmanın zaman aşımını denetler (0, zaman aşımı olmadığı anlamına gelir). run çağrısı, belirtilen süre içinde tamamlanmazsa bir özel durum oluşturur. Azure Databricks 10 dakikadan uzun süre çalışmıyorsa, not defteri çalıştırması timeout_secondsne olursa olsun başarısız olur.

arguments parametresi, hedef not defterinin values numaralı pencere öğesini ayarlar. Özellikle, çalıştırdığınız not defterinde adlı Abir pencere öğesi varsa ve çağrısına bağımsız değişken parametresinin ("A": "B") bir parçası olarak bir anahtar-değer çifti run() geçirirseniz, pencere öğesinin A değerini almak döndürür"B". Pencere öğeleri oluşturma ve pencere öğeleriyle çalışma yönergelerini Databricks pencere öğeleri makalesinde bulabilirsiniz.

Not

  • arguments parametresi yalnızca Latin karakterleri (ASCII karakter set) kabul eder. ASCII olmayan karakterler kullanıldığında hata döndürülüyor.
  • API kullanılarak dbutils.notebook oluşturulan işlerin 30 gün veya daha kısa sürede tamamlanması gerekir.

run Kullanım

Python

dbutils.notebook.run("notebook-name", 60, {"argument": "data", "argument2": "data2", ...})

Scala

dbutils.notebook.run("notebook-name", 60, Map("argument" -> "data", "argument2" -> "data2", ...))

Yapılandırılmış verileri not defterleri arasında geçirme

Bu bölümde, yapılandırılmış verilerin not defterleri arasında nasıl geçirıldığı gösterilmektedir.

Python

# Example 1 - returning data through temporary views.
# You can only return one string using dbutils.notebook.exit(), but since called notebooks reside in the same JVM, you can
# return a name referencing data stored in a temporary view.

## In callee notebook
spark.range(5).toDF("value").createOrReplaceGlobalTempView("my_data")
dbutils.notebook.exit("my_data")

## In caller notebook
returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
global_temp_db = spark.conf.get("spark.sql.globalTempDatabase")
display(table(global_temp_db + "." + returned_table))

# Example 2 - returning data through DBFS.
# For larger datasets, you can write the results to DBFS and then return the DBFS path of the stored data.

## In callee notebook
dbutils.fs.rm("/tmp/results/my_data", recurse=True)
spark.range(5).toDF("value").write.format("parquet").save("dbfs:/tmp/results/my_data")
dbutils.notebook.exit("dbfs:/tmp/results/my_data")

## In caller notebook
returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
display(spark.read.format("parquet").load(returned_table))

# Example 3 - returning JSON data.
# To return multiple values, you can use standard JSON libraries to serialize and deserialize results.

## In callee notebook
import json
dbutils.notebook.exit(json.dumps({
  "status": "OK",
  "table": "my_data"
}))

## In caller notebook
import json

result = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
print(json.loads(result))

Scala

// Example 1 - returning data through temporary views.
// You can only return one string using dbutils.notebook.exit(), but since called notebooks reside in the same JVM, you can
// return a name referencing data stored in a temporary view.

/** In callee notebook */
sc.parallelize(1 to 5).toDF().createOrReplaceGlobalTempView("my_data")
dbutils.notebook.exit("my_data")

/** In caller notebook */
val returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
val global_temp_db = spark.conf.get("spark.sql.globalTempDatabase")
display(table(global_temp_db + "." + returned_table))

// Example 2 - returning data through DBFS.
// For larger datasets, you can write the results to DBFS and then return the DBFS path of the stored data.

/** In callee notebook */
dbutils.fs.rm("/tmp/results/my_data", recurse=true)
sc.parallelize(1 to 5).toDF().write.format("parquet").save("dbfs:/tmp/results/my_data")
dbutils.notebook.exit("dbfs:/tmp/results/my_data")

/** In caller notebook */
val returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
display(sqlContext.read.format("parquet").load(returned_table))

// Example 3 - returning JSON data.
// To return multiple values, use standard JSON libraries to serialize and deserialize results.

/** In callee notebook */

// Import jackson json libraries
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper

// Create a json serializer
val jsonMapper = new ObjectMapper with ScalaObjectMapper
jsonMapper.registerModule(DefaultScalaModule)

// Exit with json
dbutils.notebook.exit(jsonMapper.writeValueAsString(Map("status" -> "OK", "table" -> "my_data")))

/** In caller notebook */

// Import jackson json libraries
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper

// Create a json serializer
val jsonMapper = new ObjectMapper with ScalaObjectMapper
jsonMapper.registerModule(DefaultScalaModule)

val result = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
println(jsonMapper.readValue[Map[String, String]](result))

Hataları işleme

Bu bölümde hataların nasıl işleneceğini gösterilmektedir.

Python

# Errors throw a WorkflowException.

def run_with_retry(notebook, timeout, args = {}, max_retries = 3):
  num_retries = 0
  while True:
    try:
      return dbutils.notebook.run(notebook, timeout, args)
    except Exception as e:
      if num_retries > max_retries:
        raise e
      else:
        print("Retrying error", e)
        num_retries += 1

run_with_retry("LOCATION_OF_CALLEE_NOTEBOOK", 60, max_retries = 5)

Scala

// Errors throw a WorkflowException.

import com.databricks.WorkflowException

// Since dbutils.notebook.run() is just a function call, you can retry failures using standard Scala try-catch
// control flow. Here, we show an example of retrying a notebook a number of times.
def runRetry(notebook: String, timeout: Int, args: Map[String, String] = Map.empty, maxTries: Int = 3): String = {
  var numTries = 0
  while (true) {
    try {
      return dbutils.notebook.run(notebook, timeout, args)
    } catch {
      case e: WorkflowException if numTries < maxTries =>
        println("Error, retrying: " + e)
    }
    numTries += 1
  }
  "" // not reached
}

runRetry("LOCATION_OF_CALLEE_NOTEBOOK", timeout = 60, maxTries = 5)

Birden çok not defterini eşzamanlı olarak çalıştırma

İş Parçacıkları (Scala, Python) ve Vadeli İşlemler (Scala, Python) gibi standart Scala ve Python yapılarını kullanarak aynı anda birden çok not defteri çalıştırabilirsiniz. Örnek not defterleri bu yapıların nasıl kullanılacağını gösterir.

  1. Aşağıdaki dört not defterini indirin. Not defterleri Scala'da yazılır.
  2. Not defterlerini çalışma alanında tek bir klasöre aktarın.
  3. Eşzamanlı çalıştır not defterini çalıştırın.

Not defterini eşzamanlı olarak çalıştırma

Get not defteri

Paralel not defterinde çalıştırma

Get not defteri

Not defterini test etme

Get defter

Test-2 not defteri

Get not defteri