基础指令语法
1.ls指令
用法1:#ls含义:列出当前工作目录下的所有文件/文件夹的名称
用法2:#ls路径含义:列出指定路径下的所有文件/文件夹的名称关于路径(重要):路径可以分为两种:相对路径、绝对路径。相对路径:相对首先得有一个参照物(一般就是当前的工作路径);相对路径的写法:在相对路径中通常会用到2个符号“./”【表示当前目录下】、“../”【上一级目录下】。绝对路径:绝对路径不需要参照物,直接从根“/”开始寻找对应路径;
用法3:#ls选项路径含义:在列出指定路径下的文件/文件夹的名称,并以指定的格式进行显示。常见的语法:#ls-l路径#ls-la路径选项解释:-l:表示list,表示以详细列表的形式进行展示-a:表示显示所有的文件/文件夹(包含了隐藏文件/文件夹)
上述列表中的第一列字符表示文档的类型,其中“-”表示改行对应的文档类型为文件,“d”表示文档类型为文件夹。
在Linux中隐藏文档一般都是以“.”开头。
用法4:#ls-lh路径含义:列出指定路径下的所有文件/文件夹的名称,以列表的形式并且在显示文档大小的时候以可读性较高的形式显示
2.pwd指令用法:
#pwd(printworkingdirectory,打印当前工作目录)
3、cd指令命令:
#cd(changedirectory,改变目录)作用:用于切换当前的工作目录的语法:
补充:在Linux中有一个特殊的符号“~”,表示当前用户的家目录。切换的方式:#cd~
4、mkdir指令指令:
mkdir(makedirectory,创建目录)
5、 touch指令指令:
touch作用:创建文件语法:#touch文件路径【路径可以是直接的文件名也可以是路径】
案例:使用touch来在当前路径下创建一个文件,命名为Linux.txt
6、cp指令指令:
cp(copy,复制)作用:
复制文件/文件夹到指定的位置语法:
#cp被复制的文档路径文档被复制到的路径
7、mv指令指令:
mv(move,移动,剪切)作用:移动文档到新的位置语法:
#mv需要移动的文档路径需要保存的位置路径确认:
移动之后原始的文件还在不在原来的位置?原始文件是不在原始位置的
8、rm指令指令:
rm(remove,移除、删除)作用:
移除/删除文档语法:
#rm选项需要移除的文档路径选项:
-f:force,强制删除,不提示是否删除
-r:表示递归案例:删除一个文件
9、vim指令指令:
vim(vim是一款文本编辑器)语法:
#vim文件的路径作用:打开一个文件(可以不存在,也可以存在)
10、输出重定向
一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向技术。
>:覆盖输出,会覆盖掉原先的文件内容
>>:追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加
语法:#正常执行的指令>/>>文件的路径
注意:文件可以不存在,不存在则新建
11、cat指令
作用1:cat有直接打开一个文件的功能。
语法1:#cat文件的路径
中级指令语法
1、df指令作用:
查看磁盘的空间语法:#df-h-h表示以可读性较高的形式展示大小
2、free指令作用:
查看内存使用情况语法:#free-m-m表示以mb为单位查看
3、head指令作用:
查看一个文件的前n行,如果不指定n,则默认显示前10行。
语法:#head-n文件路径【n表示数字】
4、tail指令
作用1:查看一个文件的未n行,如果n不指定默认显示后10行语法:#tail-n文件的路径n同样表示数字
5、less指令
作用:查看文件,以较少的内容进行输出,按下辅助功能键(数字+回车、空格键+上下方向键)查看更多语法:#less需要查看的文件路径在退出的只需要按下q键即可。
6、wc指令
作用:统计文件内容信息(包含行数、单词数、字节数)
语法:#wc-lwc需要统计的文件路径
-l:表示lines,行数
-w:表示words,单词数依照空格来判断单词数量
-c:表示bytes,字节数
7、date指令
(重点)作用:
表示操作时间日期(读取、设置)
语法1:#date输出的形式:2018年3月24日星期六15:54:28
语法2:#date+%F(等价于#date“+%Y-%m-%d”)
输出形式:2018-03-24
语法3:#date“+%F%T”引号表示让“年月日与时分秒”成为一个不可分割的整体等价操作#date“+%Y-%m-%d%H:%M:%S”输出的形式:2018-03-2416:01:00
语法4:获取之前或者之后的某个时间(备份)#date-d“-1day”“+%Y-%m-%d%H:%M:%S”
符号的可选值:+(之后)或者-(之前)
单位的可选值:day(天)、month(月份)、year(年)
%F:表示完整的年月日
%T:表示完整的时分秒
%Y:表示四位年份
%m:表示两位月份(带前导0)
%d:表示日期(带前导0)
%H:表示小时(带前导0)
%M:表示分钟(带前导0)
%S:表示秒数(带前导0)
8、cal指令
作用:用来操作日历的
语法1:#cal等价于#cal-1直接输出当前月份的日历
语法2:#cal-3表示输出上一个月+本月+下个月的日历
语法3:#cal-y年份表示输出某一个年份的日历
9、clear/ctrl+L指令
作用:清除终端中已经存在的命令和结果(信息)。
语法:clear或者快捷键:ctrl+L需要注意的是,该命令并不是真的清除了之前的信息,而是把之前的信息的隐藏到了最上面,通过滚动条继续查看以前的信息
10、管道(重要)
管道符:|作用:管道一般可以用于“过滤”,“特殊”,“扩展处理”。
语法:管道不能单独使用,必须需要配合前面所讲的一些指令来一起使用,其作用主要是辅助作用。
①过滤案例(100%使用):需要通过管道查询出根目录下包含“y”字母的文档名称。#ls/|grepy针对上面这个命令说明:
①以管道作为分界线,前面的命令有个输出,后面需要先输入,然后再过滤,最后再输出,通俗的讲就是管道前面的输出就是后面指令的输入;
②grep指令:主要用于过滤②特殊用法案例:通过管道的操作方法来实现less的等价效果(了解)之前通过less查看一个文件,可以#less路径现在通过管道还可以这么:#cat路径|less
③扩展处理:请使用学过的命令,来统计某个目录下的文档的总个数?
答:#ls/|wc-l
高级指令
1、hostname指令
作用:操作服务器的主机名(读取、设置)
语法1:#hostname含义:表示输出完整的主机名
语法2:#hostname-f含义:表示输出当前主机名中的FQDN(全限定域名)
2、id指令
作用:查看一个用户的一些基本信息(包含用户id,用户组id,附加组id...),该指令如果不指定用户则默认当前用户。
语法1:#id默认显示当前执行该命令的用户的基本信息
语法2:#id用户名显示指定用户的基本信息
3、whoami指令
作用:“我是谁?”显示当前登录的用户名,一般用于shell脚本,用于获取当前操作的用
户名方便记录日志。
4、ps-ef指令(重点)
指令:ps作用:主要是查看服务器的进程信息选项
含义:-e:等价于“-A”,表示列出全部的进程
-f:显示 全部的列(显示全字段)
执行结果:
5、top指令(重点)
作用:查看服务器的进程占的资源(100%使用)
语法:进入命令:#top(动态显示)退出命令:按下q键
6、du-sh指令
作用:查看目录的真实大小
语法:#du-sh目录路径选项含义:
-s:summaries,只显示汇总的大小
-h:表示以高可读性的形式进行显示
7、find指令
作用:用于查找文件(其参数有55个之多)
语法:#find路径范围选项选项的值选项:
-name:按照文档名称进行搜索(支持模糊搜索)
-type:按照文档的类型进行搜索文档类型:
“-”表示文件(在使用find的时候需要用f来替换),“d”表示文件夹
8、service指令
(重点)作用:用于控制一些软件的服务启动/停止/重启
语法:#service服务名start/stop/restart
例如:需要启动本机安装的Apache(网站服务器软件),其服务名httpd#servicehttpdstart
9、kill指令(重点)
作用:表示杀死进程(当遇到僵尸进程或者出于某些原因需要关闭进程的时候)
语法:#kill进程PID(语法需要配合ps一起使用)
10、ifconfig指令(重点)
作用:用于操作网卡相关的指令。简单语法:#ifconfig(获取网卡信息)
11、reboot指令
作用:重新启动计算机
语法1:#reboot重启
语法2:#reboot-w模拟重启,但是不重启(只写关机与开机的日志信息)
12、shutdown指令
作用:关机(慎用)
语法1:#shutdown-hnow“关机提示”或者#shutdown-h15:25“关机提示”
13、uptime指令
作用:输出计算机的持续在线时间(计算机从开机到现在运行的时间)
语法:#uptime
14、uname指令
作用:获取计算机操作系统相关信息
语法1:#uname获取操作系统的类型
语法2:#uname-aall,表示获取全部的系统信息(类型、全部主机名、内核版本、发布时间、开源计划)。
15、netstat-tnlp指令
作用:查看网络连接状态语法:#netstat-tnlp
选项说明:
-t:表示只列出tcp协议的连接;
-n:表示将地址从字母组合转化成ip地址,将协议转化成端口号来显示;
-l:表示过滤出“state(状态)”列中其值为LISTEN(监听)的连接;
-p:表示显示发起连接的进程pid和进程名称;
16、man指令
作用:manual,手册(包含了Linux中全部命令手册,英文)
语法:#man命令(退出按下q键)
案例:通过man命令查询cp指令的用法#mancp
shell脚本入门
案例
shell脚本变量的定义与使用
变量,先定义后使用。
定义形如:
class_name="yunwe"
使用形如:
echo$class_name
变量就是由2部分组成,一个是变量名(左边),另外一部分是变量的值(右边)
变量名和变量值是什么关系?
变量名和变量值是使用和被使用关系;
我们的变量名来使用变量值,在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的(例如php)。
变量名的规范注意,变量名后面的等号左右不能有空格,这可能和你熟悉的所有编程语言都不一样。
同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线“_”。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)
案例
只读变量
语法:readonly变量名
案例:定义变量a并且其值为10,随后设置其为只读变量,再去尝试重新赋值
接收用户输入(重点)
语法:read-p提示信息变量名
案例:编写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件
删除变量(了解)
语法:unset变量名path
案例:定义变量b=20,再输出b的值,随后删除b,最后再输出下b
2.0条件判断语句
语法1(一个条件):
if condition
then
command1
command2...
fi
单行写法(一般在命令行中执行的时候):if[condition];thencommand;f
语法3(多个条件):
if condition1
then
command1
elif
condition2
then
command2
else
commandN
fi
3、运算符
在shell中,运算符和其他编程脚本语言一样,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等
3.1、算数运算符
案例
3.2关系运算符
关系运算符关系运算 符只支持数字,不支持字符串,除非字符串的值是数字。
案例:使用a=10,b=20来实现本案例
3.3、逻辑运算符
3.4、字符串运算符
3.5、文件测试运算符(重点)
4、shell脚本附带选项(重点)
问题描述:在linuxshell中如何处理tail-10access.log这样的命令行选项?
步骤:调用tail指令
系统把后续选项传递给tail
Tail先去打开指定的文件
取出最后10行
问题:自己写的shell是否也可以像内置命令一样传递一些选项呢?
答:可以的,传递方式与上述的描述是一样的,关键是怎么接收。
例如:传递:#./test.shabc
接收:在脚本中可以用“$1”来表示a,“$2”来表示b,以此类推。
接收可以用“$”加上选项对应的序号即可。
Hadoop伪分布式的搭建
1.准备Linux环境
1.1 开启网络,ifconfig指令查看ip
1.2 修改主机名为自己名字(hadoop)
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop
1.3修改主机名和IP的映射关系
vim /etc/hosts
192.168.182.128 hadoop
1.4关闭防火墙
#查看防火墙状态
service iptables status
#关闭防火墙
service iptables stop
#关闭防火墙开机启动
chkconfig iptables off
1.5重启Linux
reboot
安装自己的JDK前,删除openJDK:
查看java安装版本:java -version
查看java安装包:rpm -qa|grep java
删除java安装包:rpm -e --nodeps 包名
2.安装JDK
2.1 filezilla上传jdk到/opt
2.2 解压jdk
cd /opt
tar -zxvf jdk-7u76-linux-x64.tar.gz
2.3 将java添加到环境变量中
vim /etc/profile
#在文件最后添加
export JAVA_HOME=/opt/jdk1.7.0_76
export PATH=$PATH:$JAVA_HOME/bin
#刷新配置
source /etc/profile
#查看java的版本
java -version
3.安装Hadoop
3.1 filezilla上传hadoop安装包,配置文档(hadoop2.2.0伪分布式搭建.txt)
3.2解压hadoop安装包
#解压
tar -zxvf hadoop-2.2.0.tar.gz
3.3修改配置文件(5个) 路径:/opt/hadoop-2.2.0/etc/hadoop
第一个:hadoop-env.sh
#在27行修改
export JAVA_HOME=/opt/jdk1.7.0_76
第二个:core-site.xml
<configuration>
<!-- 指定HDFS老大(namenode)的通信地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.2.0/tmp</value>
</property>
</configuration>
第三个:hdfs-site.xml
<configuration>
<!-- 设置hdfs副本数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
第四个:mapred-site.xml.template 需要重命名: mv mapred-site.xml.template mapred-site.xml
<configuration>
<!-- 通知框架MR使用YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
第五个:yarn-site.xml
<configuration>
<!-- reducer取数据的方式是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
3.4将hadoop添加到环境变量
vim /etc/profile
export JAVA_HOME=/opt/jdk1.7.0_55
export HADOOP_HOME=/opt/hadoop-2.2.0
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
3.5格式化HDFS(namenode)第一次使用时要格式化
hadoop namenode -format
3.6启动hadoop
先启动HDFS
start-dfs.sh
再启动YARN
start-yarn.sh
3.7验证是否启动成功
使用jps命令验证
27408 NameNode
28218 Jps
27643 SecondaryNameNode
28066 NodeManager
27803 ResourceManager
27512 DataNode
http://192.168.182.128:50070 (HDFS管理界面)
http://192.168.182.128:8088 (MR管理界面)
4.配置ssh免登陆
生成ssh免登陆密钥
cd ~,进入到我的home目录
cd .ssh/
ssh-keygen -t rsa (四个回车)
执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免登陆的机器上
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
或
ssh-copy-id -i localhost
java操作hdfs
package cn.itcast.hadoop.hdfs;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
public class HDFSDemo {
FileSystem fs = null;
@Before
public void init() throws Exception{
fs = FileSystem.get(new URI("hdfs://itcast01:9000"), new Configuration(), "root");
}
@Test
public void testUpload() throws Exception{
InputStream in = new FileInputStream("/root/install.log");
OutputStream out = fs.create(new Path("/log123.log"));
IOUtils.copyBytes(in, out, 1024, true);
}
@Test
public void testMkdir() throws IllegalArgumentException, IOException{
boolean flag = fs.mkdirs(new Path("/a/aa"));
System.out.println(flag);
}
@Test
public void testDel() throws IllegalArgumentException, IOException{
boolean flag = fs.delete(new Path("/a"), true);
System.out.println(flag);
}
public static void main(String[] args) throws Exception {
FileSystem fs = FileSystem.get(new URI("hdfs://itcast01:9000"), new Configuration());
InputStream in = fs.open(new Path("/jdk"));
OutputStream out = new FileOutputStream("/home/jdk1.7.tar.gz");
IOUtils.copyBytes(in, out, 4096, true);
}
}
mappreduce代码统计文本单词
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WordCount {
public static void main(String[] args) throws Exception{
//定义配置对象
Configuration conf=new Configuration();
//定义一个工作任务对象
Job job=Job.getInstance(conf);
//获取map阶段的一个对象
job.setMapperClass(WordCountMap.class);
//指定map阶段的一个输出key
job.setOutputKeyClass(Text.class);
//指定map阶段输出的values类型
job.setOutputValueClass(IntWritable.class);
//map阶段的输入文件
FileInputFormat.setInputPaths(job,new Path(""));
//指定Reduce的类
job.setReducerClass(WordCountReduce.class);
//指定Reduce阶段的一个输出key
job.setOutputKeyClass(Text.class);
//指定Reduce阶段输出的values类型
job.setOutputValueClass(IntWritable.class);
//指定Reduce阶段的输出文件
FileOutputFormat.setOutputPath(job,new Path(""));
//submit
job.waitForCompletion(true);
}
}
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable>{
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//读取每行文本
String line = value.toString();
//splite拆分每行
String[] words =line.split(" ");
//取出每个单词
for(String word : words){
//将每个单词转为Text类型
Text wordText = new Text(word);
//将1转变为IntWritable
IntWritable outValue = new IntWritable(1);
//写出单词,跟对应1
context.write(wordText,outValue);
}
}
}
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/* **
* Text 输入的空字符串类型,序列化
* IntWritable 输入一串1,序列化
* Text 输出字符串类型,序列化
* IntWritable 输出求和的数组,序列化
* **/
public class WordCountReduce extends Reducer<Text, IntWritable,Text,IntWritable> {
/* **
* key 输出单词名字
* values 输出一串1
* context 输出工具
* **/
@Override
protected void reduce(Text key,Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {
int sum=0;
for (IntWritable number:values){
sum += number.get();
}
context.write(key,new IntWritable(sum));
}
}