zoukankan      html  css  js  c++  java
  • 如何向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的进程里环境变量失效的问题? 

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

    Java代码  收藏代码
    1. #!/bin/bash  
    2. ##下面的2行代码很重要,如果不再次激活环境变量,hadoop的jar就不能正确提交任务  
    3. . /etc/profile  
    4. . ~/.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    &    




    另外一点需要注意,如果在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  


  • 相关阅读:
    浮动清除
    解剖JavaScript中的null和undefined【转】
    关于innerHTML以及html2dom
    javascript 作用域
    4390. 【GDOI2016模拟3.16】图计数 (Standard IO)
    5049. 【GDOI2017模拟一试4.11】腐女的生日
    4273_NOIP2015模拟10.28B组_圣章-精灵使的魔法语
    jzoj_5631_(NOI2018模拟4.5)_A
    jzoj_1001_最难的问题_Floyd
    jzoj_3385_黑魔法师之门
  • 原文地址:https://www.cnblogs.com/tonychai/p/4516532.html
Copyright © 2011-2022 走看看