大数据hadoop之Shell编程简单入门

来源:互联网 发布:sql语句日期加一天 编辑:程序博客网 时间:2024/05/19 01:11

这节课我们一起简单学习一下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文件的内容如下图所示。
    然后我们在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系统来看一下是否正确帮我们统计好了单词的数量,如下图所示,发现确实帮我们正确统计出了单词的数量。
       现在假如我们不想在控制台打印日志,而是把日志放到某个日志文件当中并且让后台进程来执行该脚本。执行的脚本内容如下,刚才我们的服务器上已经有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文件了,发现确实如我们所愿。
      我们再来看一下HDFS文件系统是不是生成了wcout2文件夹并且该文件夹下的结果文件中的结果是否正确,如下图所示,发现结果完全正确。
    接着我们来看一下如何打印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脚本简单入门就说到这儿吧,后面还会深入学习。
阅读全文
0 0
原创粉丝点击