把项目打成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的进程里环境变量失效的问题?

很简单,在启动的脚本开始前,再次激活的环境变量即可,代码如下:

Java代码 复制代码  收藏代码
  1. #!/bin/bash  
  2. ##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务  
  3. . /etc/profile  
  4. . ~/.bash_profile  
#!/bin/bash
##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务
. /etc/profile
. ~/.bash_profile



另外在crontab中,需要cd到当前目录下,执行,否则一些log不会被正确到该工程,或目录下:

Java代码 复制代码  收藏代码
  1. //在下午的14点39分启动一个定时任务,使用nohup 挂起后台运行,并将所有的log重定向到一个log文件里  
  2. 39 14 * * *  cd /home/search/qindongliang/cr-dataload ; nohup sh start.sh 1  2015-04-10 all &> rate.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会丢失,因为默认是在终端的界面上打印的。

Java代码 复制代码  收藏代码
  1. [search@fsedump01sand cr-dataload]$ cat start.sh   
  2. #!/bin/bash  
  3. ##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务  
  4. . /etc/profile  
  5. . ~/.bash_profile  
  6.   
  7.   
  8. echo "hadoop的home:"$HADOOP_HOME  
  9. echo `pwd`  
  10.   
  11. if [ ! $# -eq 3  ] ; then  
  12.   
  13. echo "第一个参数:请输入要处理的dataload业务 1:rate 2:keyword  "  
  14. echo "第二个参数:请输入读取HDFS上读取数据的开始日期, 例如: 2015-04-10  "  
  15. echo "第三个参数:请输入读取HDFS上读取数据的结束日期, 例如: 2015-05-10  "  
  16. exit  
  17.   
  18. fi  
  19.   
  20. #参数1,mapping文件的地址  
  21. p1="/user/d1/mapping.xml"  
  22.   
  23. #参数4,是否清空上一次的保存目录,0=清除,1=不清除  
  24. p4="0"  
  25.   
  26. if [ $1 -eq  1  ] ; then  
  27. #参数2,处理数据的输入路径  
  28. p2="1"    
  29. p3="/fse2/conversions/rate/shard1/input"  
  30. p5="rate"  
  31. elif [ $1 -eq 2 ] ; then  
  32. #参数2,处理数据的输入路径  
  33. p2="2"  
  34. p3="/fse2/conversions/keyword/shard1/input"  
  35. #参数5,控制那个索引的  
  36. p5="keyword"  
  37. else  
  38. echo  "不支持此参数,只能输入1或者2,请注意!"  
  39. exit  
  40. fi  
  41.   
  42.   
  43. echo "==============参数信息=============="  
  44. echo $p1  
  45. echo $p2   
  46. echo $p3  
  47. echo $p4  
  48. echo $p5  
  49. echo $2  
  50. echo $3  
  51. echo "===================================="  
  52.   
  53. #exit  
  54.   
  55.   
  56. #参数3,处理数据结果的保存路径  
  57. #p3="/user/d1/uvoutput"  
  58. #p3="/user/d1/kwoutput"  
  59. #p3="/fse2/conversions/keyword/shard1/input"  
  60. #p3="/fse2/conversions/uv/shard1/input"  
  61.   
  62.   
  63. #参数4,是否清空上一次的保存目录,0=清除,1=不清除  
  64. #p4="0"  
  65.   
  66. #参数5,控制那个索引的  
  67. #p5="keyword"  
  68. #p5="uv"  
  69.   
  70.   
  71. cs='.:'  
  72. root="`pwd`/"  
  73. curr="`pwd`/conf"  
  74. echo $curr  
  75.   
  76.   
  77. libpath="`pwd`/lib/"  
  78. FILES=`ls $libpath`  
  79. for txt in $FILES;do  
  80.         cs=$cs$libpath$txt:  
  81. done  
  82. cs=$cs$curr:$root"cr-dataload.jar"  
  83.   
  84. echo $cs  
  85. echo [`date`] "开始启动dataload!"  
  86.   
  87. #nohup sh offline.sh  2014-12-01 2014-12-15 &> nohup.out &  
  88.   
  89. #hadoop jar  cr-dataload.jar   com.dhgate.search.rate.convert.StoreConvert -libjars $cs  
  90. #java -cp $cs  com.dhgate.search.rate.convert.StoreConvert  $p1 $p2 $p3 $p4 $p5 $2 $3   
  91. #/home/search/hadoop/bin/hadoop jar  cr-dataload.jar   com.dhgate.search.rate.convert.StoreConvert  $p1 $p2 $p3 $p4 $p5 $2 $3  > $p2.log  
  92. hadoop jar  cr-dataload.jar   com.dhgate.search.rate.convert.StoreConvert  $p1 $p2 $p3 $p4 $p5 $2 $3   
  93. #echo $cs  

猜你喜欢

转载自weitao1026.iteye.com/blog/2266995