浏览 1784 次
精华帖 (0) :: 良好帖 (0) :: 灌水帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2015-04-22
除了使用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的进程里环境变量失效的问题? 很简单,在启动的脚本开始前,再次激活的环境变量即可,代码如下: <pre name="code" class="java">#!/bin/bash ##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务 . /etc/profile . ~/.bash_profile</pre> 另外在crontab中,需要cd到当前目录下,执行,否则一些log不会被正确到该工程,或目录下: <pre name="code" class="java"> //在下午的14点39分启动一个定时任务,使用nohup 挂起后台运行,并将所有的log重定向到一个log文件里 39 14 * * * cd /home/search/qindongliang/cr-dataload ; nohup sh start.sh 1 2015-04-10 all &> rate.log & </pre> 另外一点需要注意,如果在crontab的进程中执行任务,那么最好使用nohup挂起后台运行,否则,hadoop的系统log会丢失,因为默认是在终端的界面上打印的。 <pre name="code" class="java">[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</pre> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |