如何向hadoop集群定时提交一个jar作业?
除了使用Hive,Pig来执行一个MapReduce任务,不需要专门的把项目打成jar包,提交执行,或者定时执行,因为Hive,Pig这些开源框架已经,帮我们自动打包上传了。
而有些时候,我们自己手写了一个MapReduce的任务,然后这个任务里面依赖了其他的第三方包,比如说是Lucene的,或者是Solr,ElasticSearch的,那么打包的时候就需要将这些依赖的jar包也一起的打包进去。
如果你用的是maven,那么事情就简单了,maven会自动把所有依赖的jar包,打成一个统一的jar,但是通常不需要maven,因为maven相对来说,还是比较复杂,我们更倾向于使用ant来打包,配置很灵活。
那么,如何向hadooop集群提交作业呢? 
通常的命令如下: 
hadoop jar  xxx.jar input out 
这样就会把jar包提交到hadoop集群上,只要包含依赖的jar也在这个jar包中,那么程序就不会出问题。
那么,问题来了? 我想定时执行一个作业,应该怎么写呢
如果直接在linux下的crontab中,写定时启动的脚本,没问题,但是如果你的脚本是启动一个mr的任务,那么就有可能出现问题了,因为执行MR,是需要Hadoop的环境变量的,在crontab启用的shell进程,默认是没有激活环境变量的,所以,你有可能发现,自己的写的crontab脚本,奇怪的失效了。
如何解决在crontab的进程里环境变量失效的问题?
很简单,在启动的脚本开始前,再次激活的环境变量即可,代码如下:
- #!/bin/bash
 - ##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务
 - . /etc/profile
 - . ~/.bash_profile
 
另外在crontab中,需要cd到当前目录下,执行,否则一些log不会被正确到该工程,或目录下:
- //在下午的14点39分启动一个定时任务,使用nohup 挂起后台运行,并将所有的log重定向到一个log文件里
 - 39 14 * * * cd /home/search/qindongliang/cr-dataload ; nohup sh start.sh 1 2015-04-10 all &> rate.log &
 
另外一点需要注意,如果在crontab的进程中执行任务,那么最好使用nohup挂起后台运行,否则,hadoop的系统log会丢失,因为默认是在终端的界面上打印的。
- [search@fsedump01sand cr-dataload]$ cat start.sh
 - #!/bin/bash
 - ##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务
 - . /etc/profile
 - . ~/.bash_profile
 - echo "hadoop的home:"$HADOOP_HOME
 - echo `pwd`
 - if [ ! $# -eq 3 ] ; then
 - echo "第一个参数:请输入要处理的dataload业务 1:rate 2:keyword "
 - echo "第二个参数:请输入读取HDFS上读取数据的开始日期, 例如: 2015-04-10 "
 - echo "第三个参数:请输入读取HDFS上读取数据的结束日期, 例如: 2015-05-10 "
 - exit
 - fi
 - #参数1,mapping文件的地址
 - p1="/user/d1/mapping.xml"
 - #参数4,是否清空上一次的保存目录,0=清除,1=不清除
 - p4="0"
 - if [ $1 -eq 1 ] ; then
 - #参数2,处理数据的输入路径
 - p2="1"
 - p3="/fse2/conversions/rate/shard1/input"
 - p5="rate"
 - elif [ $1 -eq 2 ] ; then
 - #参数2,处理数据的输入路径
 - p2="2"
 - p3="/fse2/conversions/keyword/shard1/input"
 - #参数5,控制那个索引的
 - p5="keyword"
 - else
 - echo "不支持此参数,只能输入1或者2,请注意!"
 - exit
 - fi
 - echo "==============参数信息=============="
 - echo $p1
 - echo $p2
 - echo $p3
 - echo $p4
 - echo $p5
 - echo $2
 - echo $3
 - echo "===================================="
 - #exit
 - #参数3,处理数据结果的保存路径
 - #p3="/user/d1/uvoutput"
 - #p3="/user/d1/kwoutput"
 - #p3="/fse2/conversions/keyword/shard1/input"
 - #p3="/fse2/conversions/uv/shard1/input"
 - #参数4,是否清空上一次的保存目录,0=清除,1=不清除
 - #p4="0"
 - #参数5,控制那个索引的
 - #p5="keyword"
 - #p5="uv"
 - cs='.:'
 - root="`pwd`/"
 - curr="`pwd`/conf"
 - echo $curr
 - libpath="`pwd`/lib/"
 - FILES=`ls $libpath`
 - for txt in $FILES;do
 - cs=$cs$libpath$txt:
 - done
 - cs=$cs$curr:$root"cr-dataload.jar"
 - echo $cs
 - echo [`date`] "开始启动dataload!"
 - #nohup sh offline.sh 2014-12-01 2014-12-15 &> nohup.out &
 - #hadoop jar cr-dataload.jar com.dhgate.search.rate.convert.StoreConvert -libjars $cs
 - #java -cp $cs com.dhgate.search.rate.convert.StoreConvert $p1 $p2 $p3 $p4 $p5 $2 $3
 - #/home/search/hadoop/bin/hadoop jar cr-dataload.jar com.dhgate.search.rate.convert.StoreConvert $p1 $p2 $p3 $p4 $p5 $2 $3 > $p2.log
 - hadoop jar cr-dataload.jar com.dhgate.search.rate.convert.StoreConvert $p1 $p2 $p3 $p4 $p5 $2 $3
 - #echo $cs
 
如何向hadoop集群定时提交一个jar作业?的更多相关文章
- 深入理解Hadoop集群和网络
		
导读:云计算和Hadoop中网络是讨论得相对比较少的领域.本文原文由Dell企业技术专家Brad Hedlund撰写,他曾在思科工作多年,专长是数据中心.云网络等.文章素材基于作者自己的研究.实验和C ...
 - 深入理解Hadoop集群和网络【转】
		
http://os.51cto.com/art/201211/364374.htm 本文将着重于讨论Hadoop集群的体系结构和方法,及它如何与网络和服务器基础设施的关系.最开始我们先学习一下Hado ...
 - 初学Hadoop:利用VMWare+CentOS7搭建Hadoop集群
		
一.前言 开始学习数据处理相关的知识了,第一步是搭建一个Hadoop集群.搭建一个分布式集群需要多台电脑,在此我选择采用VMWare+CentOS7搭建一个三台虚拟机组成的Hadoop集群. 注:1 ...
 - 编写hadoop程序,并打包jar到hadoop集群运行
		
windows环境下编写hadoop程序 新建:File->new->Project->Maven->next GroupId 和ArtifactId 随便写(还是建议规范点) ...
 - Eclipse远程提交hadoop集群任务
		
文章概览: 1.前言 2.Eclipse查看远程hadoop集群文件 3.Eclipse提交远程hadoop集群任务 4.小结 1 前言 Hadoop高可用品台搭建完备后,参见<Hadoop ...
 - Eclipse提交任务至Hadoop集群遇到的问题
		
环境:Windows8.1,Eclipse 用Hadoop自带的wordcount示例 hadoop2.7.0 hadoop-eclipse-plugin-2.7.0.jar //Eclipse的插件 ...
 - hadoop 把mapreduce任务从本地提交到hadoop集群上运行
		
MapReduce任务有三种运行方式: 1.windows(linux)本地调试运行,需要本地hadoop环境支持 2.本地编译成jar包,手动发送到hadoop集群上用hadoop jar或者yar ...
 - 在windows远程提交任务给Hadoop集群(Hadoop 2.6)
		
我使用3台Centos虚拟机搭建了一个Hadoop2.6的集群.希望在windows7上面使用IDEA开发mapreduce程序,然后提交的远程的Hadoop集群上执行.经过不懈的google终于搞定 ...
 - 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker
		
如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...
 
随机推荐
- logback日志文件需要注意点
			
1.支持的jar包 logback-access-1.1.1.jarlogback-classic-1.1.1.jarlogback-core-1.1.1.jar 2.logback.xml文件,we ...
 - 正确使用HTML title属性
			
如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...
 - POJ3525 Most Distant Point from the Sea(半平面交)
			
给你一个凸多边形,问在里面距离凸边形最远的点. 方法就是二分这个距离,然后将对应的半平面沿着法向平移这个距离,然后判断是否交集为空,为空说明这个距离太大了,否则太小了,二分即可. #pragma wa ...
 - POJ 1538
			
#include <iostream> #include <iomanip> using namespace std; ]; //拉格朗日插值算法 int main() { / ...
 - HDU 1026 Ignatius and the Princess I (BFS)
			
题目链接 题意 : 从(0,0)点走到(N-1,M-1)点,问最少时间. 思路 : BFS..... #include <stdio.h> #include <string.h> ...
 - ExtJs之Panel基本布局
			
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
 - VS2010 常用快捷键
			
VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL ...
 - 二分图点染色 BestCoder 1st Anniversary($) 1004 Bipartite Graph
			
题目传送门 /* 二分图点染色:这题就是将点分成两个集合就可以了,点染色用dfs做, 剩下的点放到点少的集合里去 官方解答:首先二分图可以分成两类点X和Y, 完全二分图的边数就是|X|*|Y|.我们的 ...
 - Android 图片异步加载的体会,SoftReference已经不再适用
			
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的 ...
 - Markdown语法和MWeb使用说明
			
Markdown 语法和 MWeb 写作使用说明 开始写博客,首先熟悉一下Markdown,以前过看GitHub里的README.MD,感受到了这种文字排版的简洁美观. 写博客是一种有效的学习总结和分 ...