如何对 DSX 预定笔记本进行故障排除?
How to troubleshoot a DSX scheduled notebook?
我有一个 DSX notebook,我可以运行手动使用 DSX 用户界面,它会在 Cloudant 数据库中填充一些数据。
我已将笔记本安排为 运行 每小时。一夜之间,我本以为作业会有 运行 多次,但 Cloudant 数据库还没有更新。
如何调试计划的作业?是否有任何日志可供我检查以验证笔记本是否已实际执行?我笔记本的输出是否保存到日志文件中?我在哪里可以找到这些文件?
一种可能是查看笔记本内核的内核日志。为此,您需要使用 Python 笔记本。
检查 Python 笔记本 gpfs
上的以下位置:
!ls /gpfs/fs01/user/USERID/logs/notebook/
要获取 USERID,请执行以下代码:
!whoami
您应该为每个内核找到一个日志文件,例如kernel-python3-20170105_102510.
您可以在 ~/notebook/logs/
位置找到笔记本执行日志。如果您的笔记本在一夜之间执行了多次,您会发现多个日志条目 (ls -la ~/notebook/logs/
)。打开相关日志文件之一(根据时间戳),查看笔记本是否存在与 Cloudant 或其他问题的连接问题 (cat ~/notebook/logs/kernel-pyspark-20170105_095103.log
)。
一个问题是 print()
语句不会写入日志文件,因此您需要使用 spark 日志记录功能。在 pyspark 中,我创建了一个实用程序函数,它将输出发送到日志文件,但也会在笔记本手动 运行 时将其打印到笔记本:
# utility method for logging
log4jLogger = sc._jvm.org.apache.log4j
# give a meaningful name to your logger (mine is CloudantRecommender)
LOGGER = log4jLogger.LogManager.getLogger("CloudantRecommender")
def info(*args):
print(args) # sends output to notebook
LOGGER.info(args) # sends output to kernel log file
def error(*args):
print(args) # sends output to notebook
LOGGER.error(args) # sends output to kernel log file
在我的笔记本中使用这样的功能:
info("some log output")
如果我检查日志文件,我可以看到我的注销正在写入:
! grep 'CloudantRecommender' $HOME/logs/notebook/*pyspark*
kernel-pyspark-20170105_164844.log:17/01/05 10:49:08 INFO CloudantRecommender: [Starting load from Cloudant: , 2017-01-05 10:49:08]
kernel-pyspark-20170105_164844.log:17/01/05 10:53:21 INFO CloudantRecommender: [Finished load from Cloudant: , 2017-01-05 10:53:21]
异常似乎也不会发送到日志文件,因此您需要将代码包装在 try 块中并记录错误,例如
import traceback
try:
# your spark code that may throw an exception
except Exception as e:
# send the exception to the spark logger
error(str(e), traceback.format_exc(), ts())
raise e
注意: 在调试过程中遇到的另一个问题是预定作业 运行 笔记本的特定版本。检查您是否在保存笔记本的新版本时更新计划作业。
我有一个 DSX notebook,我可以运行手动使用 DSX 用户界面,它会在 Cloudant 数据库中填充一些数据。
我已将笔记本安排为 运行 每小时。一夜之间,我本以为作业会有 运行 多次,但 Cloudant 数据库还没有更新。
如何调试计划的作业?是否有任何日志可供我检查以验证笔记本是否已实际执行?我笔记本的输出是否保存到日志文件中?我在哪里可以找到这些文件?
一种可能是查看笔记本内核的内核日志。为此,您需要使用 Python 笔记本。
检查 Python 笔记本 gpfs
上的以下位置:
!ls /gpfs/fs01/user/USERID/logs/notebook/
要获取 USERID,请执行以下代码:
!whoami
您应该为每个内核找到一个日志文件,例如kernel-python3-20170105_102510.
您可以在 ~/notebook/logs/
位置找到笔记本执行日志。如果您的笔记本在一夜之间执行了多次,您会发现多个日志条目 (ls -la ~/notebook/logs/
)。打开相关日志文件之一(根据时间戳),查看笔记本是否存在与 Cloudant 或其他问题的连接问题 (cat ~/notebook/logs/kernel-pyspark-20170105_095103.log
)。
一个问题是 print()
语句不会写入日志文件,因此您需要使用 spark 日志记录功能。在 pyspark 中,我创建了一个实用程序函数,它将输出发送到日志文件,但也会在笔记本手动 运行 时将其打印到笔记本:
# utility method for logging
log4jLogger = sc._jvm.org.apache.log4j
# give a meaningful name to your logger (mine is CloudantRecommender)
LOGGER = log4jLogger.LogManager.getLogger("CloudantRecommender")
def info(*args):
print(args) # sends output to notebook
LOGGER.info(args) # sends output to kernel log file
def error(*args):
print(args) # sends output to notebook
LOGGER.error(args) # sends output to kernel log file
在我的笔记本中使用这样的功能:
info("some log output")
如果我检查日志文件,我可以看到我的注销正在写入:
! grep 'CloudantRecommender' $HOME/logs/notebook/*pyspark*
kernel-pyspark-20170105_164844.log:17/01/05 10:49:08 INFO CloudantRecommender: [Starting load from Cloudant: , 2017-01-05 10:49:08]
kernel-pyspark-20170105_164844.log:17/01/05 10:53:21 INFO CloudantRecommender: [Finished load from Cloudant: , 2017-01-05 10:53:21]
异常似乎也不会发送到日志文件,因此您需要将代码包装在 try 块中并记录错误,例如
import traceback
try:
# your spark code that may throw an exception
except Exception as e:
# send the exception to the spark logger
error(str(e), traceback.format_exc(), ts())
raise e
注意: 在调试过程中遇到的另一个问题是预定作业 运行 笔记本的特定版本。检查您是否在保存笔记本的新版本时更新计划作业。