Aracılığıyla paylaş


Başka bir not defterinden Databricks not defteri çalıştırma

Önemli

Not defteri düzenlemesi için Databricks İşleri'ni kullanın. Kod modülerleştirme senaryoları için çalışma alanı dosyalarını kullanın. Bu makalede açıklanan teknikleri yalnızca, dinamik bir parametre kümesi üzerinde not defterlerini döngüye alma gibi bir Databricks işi kullanılarak kullanım örneğiniz uygulanamadığında veya çalışma alanı dosyalarına erişiminiz yoksa kullanmalısınız. Daha fazla bilgi için bkz . İş akışlarını zamanlama ve düzenleme ve kodu paylaşma.

ve karşılaştırması %rundbutils.notebook.run()

komutu, %run not defterine başka bir not defteri eklemenize olanak tanır. Örneğin destekleyici işlevleri ayrı bir not defterine yerleştirerek kodunuzu modüler hale getirmek için kullanabilirsiniz %run . 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, parametreleri not defterine %run geçirmenize ve not defterinden değer döndürmenize olanak sağladığından bunu tamamlayıcı niteliktedir. 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 listesini alabilir ve adları ile mümkün %runolmayan başka bir not defterine geçirebilirsiniz. Ayrıca, dönüş değerlerine göre if-then-else iş akışları oluşturabilir veya göreli yolları kullanarak diğer not defterlerini çağırabilirsiniz.

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

Tüm dbutils API'ler gibi bu yöntemler 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 shared-code-notebookiçin sihri kullandıktan %run sonra ikinci not defterinde bulunan bir işlevi reversetanımlar.

Paylaşılan kod not defteri

Not defteri içeri aktarma örneği

Bu not defterlerinin her ikisi 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 ön ekini ./ ./shared-code-notebook 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 kullandığınızda %run , varsayılan olarak belirtilen not defteri pencere öğesinin varsayılan değerleriyle çalışır. Değerleri pencere öğelerine de geçirebilirsiniz; Bkz . %run ile Databricks pencere öğelerini kullanma.

dbutils.notebook UPA

API'de dbutils.notebook kullanılabilen yöntemler ve exitşeklindedirrun. Hem parametreler hem de dönüş değerleri dize olmalıdır.

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

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.

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

parametresi hedef arguments not defterinin pencere öğesi değerlerini 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 run() bir parçası olarak bir anahtar-değer çifti ("A": "B") 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 kümesi) 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", ...))

run Örnek

Pencere öğesinin workflows değerini yazdıran adlı bir pencere öğesi içeren bir foo not defteriniz olduğunu varsayalım:

dbutils.widgets.text("foo", "fooDefault", "fooEmptyLabel")
print(dbutils.widgets.get("foo"))

Çalıştırma dbutils.notebook.run("workflows", 60, {"foo": "bar"}) aşağıdaki sonucu verir:

Pencere öğesi içeren not defteri

Pencere öğesi, varsayılan değer yerine , "bar"kullanarak dbutils.notebook.run()geçirdiğiniz değere sahipti.

exit(value: String): void Değer içeren bir not defterinden çıkın. yöntemini kullanarak run bir not defterini çağırırsanız, döndürülen değer budur.

dbutils.notebook.exit("returnValue")

bir işte çağırmak dbutils.notebook.exit not defterinin başarıyla tamamlanmasına neden olur. İşin başarısız olmasına neden olmak istiyorsanız bir özel durum oluşturabilirsiniz.

Örnek

Aşağıdaki örnekte, bağımsız değişkenleri öğesine DataImportNotebook geçirir ve sonucuna DataImportNotebookbağlı olarak farklı not defterlerini (DataCleaningNotebook veya ErrorHandlingNotebook) çalıştırırsınız.

if-else örneği

Kod çalıştırıldığında, çalışan not defterinin bağlantısını içeren bir tablo görüntülenir:

Çalışan not defteri bağlantısı

Çalıştırma ayrıntılarını görüntülemek için, tablodaki Başlangıç zamanı bağlantısına tıklayın. Çalıştırma tamamlandıysa, Bitiş zamanı bağlantısına tıklayarak çalıştırma ayrıntılarını da görüntüleyebilirsiniz.

Kısa ömürlü not defteri çalıştırmasının sonucu

Yapılandırılmış verileri 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, you can 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 4 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

Not defterini alma

Paralel not defterinde çalıştırma

Not defterini alma

Not defterini test etme

Not defterini alma

Test-2 not defteri

Not defterini alma