1

我目前正在使用 HDFS、Apache Livy 和 Django,其目的是发送一个请求以运行一些存储在 HDFS 中并调用 Livy 来创建批次的代码。现在,一切正常,我在 HDFS 中存储了一个基本的字数,带有一个 .txt 文件,在一个 htlm 页面上,我只需单击一个简单的按钮即可启动整个过程。

我成功创建了 wordcount 结果,我的下一步是从 Livy 获取信息,例如当前正在启动/运行/死/成功的会话(或批次)的 ID 某种回调,但我需要它自己实现,这样我就可以知道每个会话处于什么状态。为此,我认为我可以使用 Django-cron,因此我无法正确设置它。我没有错误,但没有更多的事情发生。我错过了什么?

目前在 Centos7 上工作,但我在 Python 3.6 中使用 Conda 环境,使用 Django 最新版本,还有 livy 和 HDFS(最新版本)

这是我当前的文件:

livy.html

{% load static %}

<html>
<body>
<div id="div1">

{{result.sessions}}

</div>

<form action="#" method="get">
 <input type="text" name="mytextbox" />
 <input type="submit" class="btn" value="Click" name="mybtn">
</form>

</body>
</html>

视图.py

from django.shortcuts import render
from django.http import HttpResponse
from django_cron import CronJobBase, Schedule
import wordcount, livy

# Create your views here.

class CheckIdCronJob(CronJobBase):
    RUN_EVERY_MINS = 1 # every minute

    schedule = Schedule(run_every_mins=RUN_EVERY_MINS)
    code = 'button.CheckIdCronJob'    # a unique code

    def index(request):
        if(request.GET.get('mybtn')):
            r = livy.send(request.GET.get('mytextbox')) #(/test/LICENSE.txt)
            return render(request,'button/livy.html', {'result':r})
        return render(request,'button/livy.html')

livy.py

import json, pprint, requests, textwrap

def send(inputText):
    host = 'http://localhost:8998'
    data = {"file":"/myapp/wordcount.py", "args":[inputText,"2"]}
    headers = {'Content-Type': 'application/json'}
    r = requests.post(host + '/batches', data=json.dumps(data), headers=headers)
    r = requests.get(host + '/batches' + '', data=json.dumps(data), headers=headers)
    return r.json()
4

1 回答 1

0

django-crontab 所做的只是让编写运行作业的管理命令变得容易,并指定这些作业应该运行的频率/时间。您最终会得到一个管理命令./manage.py runcron,该命令将检查您的所有作业并在需要时运行它们。

它没有做的是持续runcron,如果你想确保你的工作在正确的时刻运行,这是你真正需要的。例如,基本上,您希望runcron每分钟运行一次(或者如果时间不是每 10 分钟那么关键),因此您仍然需要使用一些系统守护程序来执行此操作。

crontab在 CentOS 上可用,可用于此目的。django-crontab 的安装向您展示了如何创建runcron每 5 分钟运行一次的 crontab 的示例:

crontab -e
*/5 * * * * source /home/ubuntu/.bashrc && source /home/ubuntu/work/your-project/bin/activate && python /home/ubuntu/work/your-project/src/manage.py runcrons > /home/ubuntu/cronjob.log

您必须对其进行调整以适合您的用例:

  • 如果你只是做crontab -e ...这项工作,它将以你当前登录的用户身份运行。那可能不是运行该manage.py命令的正确用户,因为该用户需要具有正确的权限才能运行您的项目。用于-u user为不同的用户制作 crontab。

    这实际上是在生产中运行时的复杂事情:获得正确的用户权限并获得正确的用户来运行各种任务。通常你会有一个www-dataorapache用户正在运行你的服务器(以及因此 django 应用程序),并且你希望同一个用户运行manage.py命令。它不应该root运行 apache,因为这会带来安全风险(您的 Web 服务器将拥有对整个系统的完全访问权限)。

  • 上述命令来源.bashrc以确保环境变量设置正确。/home/ubuntu/只是用户的用户主目录ubuntu。适当地改变它。
  • 上述命令还激活了 virtualenv,以便 manage.py 命令可以使用所有正确的依赖项运行。将路径调整到您的 virtualenv。
  • 最后,您需要确保激活了正确的 Django 设置,方法是设置 DJANGO_SETTINGS_MODULE 环境变量(您可以在.bashrc中执行此操作,因此source更早)或将--settings path.to.settings选项传递给manage.py.
  • 最后一部分是将任务的输出定向到日志文件,以便在出现问题时进行故障排除。还请在末尾添加2>&1,以便 cron 错误(stderr)也被定向到同一日志。

要检查您的 crontab,请运行crontab -l(针对当前登录的用户)或crontab -l -u user针对其他用户。

于 2019-08-09T10:37:38.990 回答