我需要使用django_cron的帮助

时间:2019-08-08 13:02:57

标签: django hdfs livy django-cron

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

我成功创建了单词计数结果,下一步是从Livy获取信息,例如当前开始/正在运行/失效/成功进行某种回调的会话(或批处理)的ID,但是我需要它可以自我实现,因此我可以知道每个会话处于什么状态。为此,我认为我可以使用Django-cron,因此无法正确设置它。我没有任何错误,但是没有其他事情发生。我想念什么?

当前正在使用Centos7,但我在python最新版本的python 3.6中使用了Conda环境,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>

views.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()

1 个答案:

答案 0 :(得分:0)

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

它不连续执行runcron,这是您要确保作业在正确的时间运行时实际需要的。基本上,例如,您希望runcron每分钟运行一次(或者,如果时间不是每10分钟那么关键),那么您仍然需要使用某些系统守护程序来执行此操作。

crontab在CentOS上可用,并且可以用于此目的。 django-crontab的安装向您显示了一个示例,该示例说明如何创建将每5分钟运行runcron的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-dataapache用户正在运行服务器(因此是django应用程序),并且您希望该用户运行manage.py命令。不应root运行apache,因为这样做会带来安全风险(您的Web服务器将拥有对整个系统的完全访问权限)。

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

要检查您的crontab,请运行2>&1(对于当前登录的用户)或crontab -l(对于其他用户)。