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, %run
ile 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 reverse
için sihri kullandıktan %run
sonra ikinci not defterinde bulunan bir işlevi shared-code-notebook
tanımlar.
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/notebook
dizinler halinde düzenleyebilir veya gibi %run /Users/username@organization.com/directory/notebook
mutlak 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_seconds
ne 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ı A
bir 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.
- Aşağıdaki dört not defterini indirin. Not defterleri Scala'da yazılır.
- Not defterlerini çalışma alanında tek bir klasöre aktarın.
- Eşzamanlı çalıştır not defterini çalıştırın.