美文网首页我爱编程
hadoop(二十)——shell的简单编写

hadoop(二十)——shell的简单编写

作者: 文子轩 | 来源:发表于2018-03-04 23:21 被阅读73次

    上节课我们一起学习了Sqoop(数据迁移工具),这节课我们一起简单学习一下Shell脚本。

     首先我们来新建一个test.sh文件,并在文件内输入一句用来输出的语句,如下所示。
    

    [root@itcast03 ~]# vim test.sh
    echo '123'

    保存上面的内容,我们试着执行一下test.sh,发现会报如下所示的提示,说没有权限执行。

    [root@itcast03 ~]# ./test.sh
    -bash: ./test.sh: Permission denied
    [root@itcast03 ~]#

    因为我们是在root用户下,我们可以使用sh test.sh来强制执行,如下所示,发现执行成功了。

    [root@itcast03 ~]# sh test.sh
    123
    [root@itcast03 ~]#
    我们也可以增加对当前目录下的test.sh文件的所有者增加可执行权限,然后再执行test.sh,如下所示,发现执行成功。(我们来说一下chmod u+x test.sh这句话的意思,chmod是权限管理命令change the permissions mode of a file的缩写。u代表所有者,x代表执行权限。 + 表示增加权限。chmod u+x test.sh就表示对当前目录下的test.sh文件的所有者增加可执行权限)

    [root@itcast03 ~]# chmod u+x test.sh
    [root@itcast03 ~]# ./test.sh
    123
    [root@itcast03 ~]#

    接着我们再定义一个变量并打印出这个变量的值,我们先注释掉echo '123',在文件中注释的话,在前面加"#"就可以。并新增蓝色字体的内容,如下所示。

    [root@itcast03 ~]# vim test.sh
    直接打印123
    echo '123'
    定义变量并打印输出变量的值
    STR="HELLO WORLD"
    echo "$STR"
    保存退出后test.sh文件之后,我们来执行一下该脚本。发现真的打印出了我们定义的变量STR的值。
    [root@itcast03 ~]# ./test.sh
    HELLO WORLD
    [root@itcast03 ~]#

    假如我们想要看下这个变量打印的执行过程,我们可以在脚本中添加一句"set -x",如下所示。
    set -x

    定义变量并打印输出变量的值

    STR="HELLO WORLD"
    echo "$STR"
    我们再来执行一下test.sh这个脚本,会发现多了下面蓝色字体的两行内容,这两行内容就是过程信息,显示了为何会打印出这个结果。
    [root@itcast03 ~]# ./test.sh
    ++ STR='HELLO WORLD'
    ++ echo 'HELLO WORLD'
    HELLO WORLD
    [root@itcast03 ~]#
    接着我们用该脚本来执行一下我们那个wordcount,当然,前提是我们的HDFS系统根目录下已经有wc.txt文件了,wc.txt文件的内容如下图所示。

    image

    然后我们在test.sh文件中输入如下蓝色字体的内容并保存退出。

    [root@itcast03 ~]# vim test.sh
    直接打印123
    echo '123'

    set -x
    定义变量并打印输出变量的值
    STR="HELLO WORLD"
    echo "$STR"

    hadoop jar /itcast/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /wc.txt /wcout

    我们执行test.sh脚本,如下所示,由于信息太多,我只截取了一部分。

    [root@itcast03 ~]# ./test.sh
    ++ hadoop jar /itcast/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /wc.txt /wcout
    16/10/29 23:20:19 INFO client.RMProxy: Connecting to ResourceManager at itcast03/169.254.254.30:8032
    16/10/29 23:20:19 INFO input.FileInputFormat: Total input paths to process : 1
    16/10/29 23:20:26 INFO mapreduce.Job: map 0% reduce 0%
    16/10/29 23:20:32 INFO mapreduce.Job: map 100% reduce 0%
    16/10/29 23:20:40 INFO mapreduce.Job: map 100% reduce 100%
    16/10/29 23:20:40 INFO mapreduce.Job: Job job_1477726373472_0008 completed successfully
    16/10/29 23:20:40 INFO mapreduce.Job: Counters: 43

    既然脚本执行成功了,我们到HDFS系统来看一下是否正确帮我们统计好了单词的数量,如下图所示,发现确实帮我们正确统计出了单词的数量。

    image

    现在假如我们不想在控制台打印日志,而是把日志放到某个日志文件当中并且让后台进程来执行该脚本。执行的脚本内容如下,刚才我们的服务器上已经有wcout文件夹了,现在我们改为输出到服务器的wcout2文件夹当中,其中>> /root/logs的意思是将控制台的信息输出到root目录下的logs文件当中。2>&1的意思是将错误及标准的信息都输出到root目录下的logs文件当中。最后一个&的意思是让脚本在后台进程运行。(这里说一个小技巧,就是如果你的鼠标当前在一句很长的话开头的地方,如果想让光标直接定位到最后的位置,可以按Shift+A组合键来实现,前提是非编辑模式

    [root@itcast03 ~]# vim test.sh

    直接打印123

    echo '123'

    用来打印出执行过程的语句

    set -x
    定义变量并打印输出变量的值
    STR="HELLO WORLD"
    echo "$STR"
    hadoop jar /itcast/hadoop-2.2.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /wc.txt /wcout2 >> /root/logs 2>&1 &

    我们来运行下test.sh脚本,运行情况如下所示,发现这次控制台没有打印任何信息,而且一敲回车,当前进程并没有等待worldcount程序执行完再有反应,而是直接就返回了,真正执行脚本的是后台的一个进程。

    [root@itcast03 ~]# ./test.sh
    [root@itcast03 ~]#

       我们来看一下是不是控制台信息输入到root目录下的logs文件了,发现确实如我们所愿。
    
    image

    我们再来看一下HDFS文件系统是不是生成了wcout2文件夹并且该文件夹下的结果文件中的结果是否正确,如下图所示,发现结果完全正确。

    image

    接着我们来看一下如何打印date信息,我们在脚本中输入如下内容。

    CURRENT=date +%Y-%m-%d
    echo $CURRENT

    写好了内容,我们来执行脚本,执行的内容如下,发现正确打印出了今天的日期。

    [root@itcast03 ~]# ./test.sh
    2016-10-30
    [root@itcast03 ~]#

    ** 最后我们来简单弄一个定时器的例子,如下所示,其中五个号代表的意思为:第一个意思是分钟,第二个的意思是小时,第三个的意思是日期,第四个的意思是月份,第五个的意思是星期。/bin/date >> /root/time相当于第六个,意思是要执行的命令。这些如果指定了具体的值就用具体的值,如果没有指定的话,就用默认值,我们现在有五个,那么就默认是1分钟执行一下/bin/date并将信息写到/root/time文件当中。*

    **[root@itcast03 ~]# crontab -e

            • /bin/date >> /root/time**

    过段时间我们来查看一下time文件中的内容,如下所示,发现确实是每隔1分钟执行一次命令。

    ** [root@itcast03 ~]# more time
    Sun Oct 30 00:56:01 CST 2016
    Sun Oct 30 00:57:01 CST 2016
    Sun Oct 30 00:58:01 CST 2016
    Sun Oct 30 00:59:01 CST 2016
    Sun Oct 30 01:00:01 CST 2016**

    ** 当然这里只是说了一个最简单的例子,大家可以从网上查询更加详细的定时器的例子来学习。**

    ** 好了,本小节关于Shell脚本简单入门就说到这儿吧,后面还会深入学习。**

    相关文章

      网友评论

        本文标题:hadoop(二十)——shell的简单编写

        本文链接:https://www.haomeiwen.com/subject/bcqcfftx.html