luigi框架–关于python运行spark程序

luigi框架–关于python运行spark程序

大家好,又见面了,我是全栈君。

首先,目标是写个python脚本,跑spark程序来统计hdfs中的一些数据。参考了别人的代码,故用了luigi框架。

至于luigi的原理 底层的一些东西Google就好。本文主要就是聚焦快速使用,知其然不知其所以然。

python写Spark或mapreduce还有其他的方法,google上很多,这里用luigi只是刚好有参考的代码,而且理解起来还是简单,就用了。

上代码:

import luigi, sys
from datetime import datetime, timedelta
from luigi.contrib.spark import PySparkTask

class luigiBase(PySparkTask):
date = luigi.DateParameter(default=datetime.now())
def main(self, sc, *args):
log_rdd = sc.textFile(self.input()[0].path)
#要做的spark操作
  log_rdd.repartition(1).saveAsTextFile(self.output().path)
@property
  def name(self):
return "luigi_test_{}_username".format(format_date(self.date))
def requires(self):
return [HdfsFiles(date=self.date)]
def output(self):
return luigi.hdfs.HdfsTarget(Files().path,format=luigi.hdfs.PlainDir)

class luigiStats(luigi.Task):
now = datetime.now()
date = luigi.DateParameter(default=datetime(now.year, now.month, now.day) )
def requires(self):
return luigiBase(self.date)

if __name__ == '__main__':
luigi.run(main_task_cls=luigiStats)

1.对于普通的luigi任务,关键是要按需实现requires、output和run三个函数;对于luigi封装好的spark任务,关键是要按需实现requires、output和main三个函数

2.base类继承PySparkTask类,该类还有很多参数可以设置,但作为最最简单的luigi例子,就都剔除了,只要在意requires、output和main三个函数就好。可以把requires理解成输入,output输出,main是要实现的逻辑。name函数之所以也写出来,是因为在将代码pushonline的时候,每个Job都要取名字,而公司对job的名字是有规定的,如果name结尾不是你的用户名,Spark程序是会报错的,就是不让你跑的意思。

3.代码有两个类,base和stats类,执行逻辑是这样的:主函数调用stats,然后发现stats类requires(依赖于)base类,就看看这个依赖的输出存不存在,如果存在就作为自己的输入,然后执行自己类中的代码。如果不存在就执行base类。上面代码中我的stats类中不需要执行上面,就没写main,只是用来检查下base执行了没,没执行就执行base去。

3.该base类中requires和ouput都是hdfs文件,逻辑和stats类一样。base类需要继承PySparkTask类,而luigi.run()的参数需要时继承了luigi.Task的类,所以才分开写成两个类了,我自己是这样理解的。

4.requires函数的返回值不能是个target对象,这里具体的理解就是不能是一个直接读取的hdfs文件,可以封装到一个类中去,这个类可以有个属性是path,是用来返回一个hdfs文件的地址的。依赖不仅限一个,可以是多个,生成一个列表返回。

5.如果不是在自己的电脑上安装的Spark,要注意:由于PySparkTask调用的spark集群不在本地,好像不支持对本地文件的一些操作,开始的时候想把结果写在本地,一直找不到输出结果。

6.一般公司都有相对应得网页可以查看spark和hadoop程序的运行的情况,可以查看日志什么的。

7.base类中可以设置下queue 参数,选择你程序的运行队列,有时候默认的队列好像特别慢,可以设置个其他的。

转载于:https://www.cnblogs.com/qingjiaowoyc/p/6995097.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108420.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Docker(二):Docker常用命令之镜像的创建:Dockerfile 与 commit

    Docker(二):Docker常用命令之镜像的创建:Dockerfile 与 commit

    2021年9月26日
    53
  • 【Java线程】锁机制:synchronized、Lock、Condition

    【Java线程】锁机制:synchronized、Lock、ConditionLock可以实现synchronized的相同功能,它能以更优雅的方式处理线程同步问题。与互斥锁定相比,读-写锁定允许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享数据(reader线程)Condition可以替代传统的线程间通信,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()。Condition的强大之处在于它可以为多个线程间建

    2022年7月8日
    26
  • 详解springBoot集成activiti7,工作流实战案例(三)

    详解springBoot集成activiti7,工作流实战案例(三)快速使用IDEA搭建SpringBoot项目,集成Activiti7(一)详解springBoot集成activiti7,使用actiBPM绘制流程图(二)过程分析:部署流程 启动一个流程实例 查询当前流程中等待执行的任务 处理任务 流程结束用到activiti的service(ps:记得注入):RepositoryService RuntimeService…

    2022年10月19日
    2
  • Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]

    Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]AVX编程基础数据类型数据类型描述__m128包含4个float类型数字的向量__m128d包含2个double类型数字的向量__m128i包含若干个整型数字的向量__m256包含8个float类型数字的向量__m256d包含4个double类型数字的向量__m256i包含若干个整型数字的向量每一种类型,从2个下划线开头,接…

    2022年5月30日
    30
  • 微信每日早安推送「建议收藏」

    微信每日早安推送「建议收藏」七夕到啦,做一个程序员给女朋友的浪漫礼物吧。微信公众号推送。每日早安推送

    2022年9月29日
    3
  • ray tracing in one weekend_rocket用法

    ray tracing in one weekend_rocket用法RayTracing文章目录RayTracing光线追踪Whitted-StyleRayTracing求交点加速求交点BoundingVolumes包围盒BVHBasicradiometry(辐射度量学)RadiantfluxintensityIrradianceRadianceBRDF双向反射分布函数概率论回顾蒙特卡洛路径追踪蒙特卡洛积分路径追踪光线追踪1.光沿直线传播2.光线不会发生碰撞3.光路可逆性Whitted-StyleRayTracing递归算法,包括了光

    2025年7月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号