1 本地模式
1.1 样例测试
在对应的hadoop
家目录下执行以下命令
cd /opt/module/hadoop 3.1.3
# 在hadoop-3.1.3文件下面创建一个input文件夹
mkdir input
# 将Hadoop的xml配置文件复制到input
cp etc/hadoop/*.xml input
#执行share目录下的MapReduce程序,这里需要在hadoop的家目录下执行,如上图那样
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
#注意:输入路径output不能存在。如果存在,会抛出FileAlreadyExistsException.异常.4)查看输出结果
cd output
cat part-r-00000
结果
注意运行代码中的
grep
不是Linux
内置命令的grep
,而是hadoop
官方案例中的的一个方法,作用是统计符合正则表达式的单词以及统计次数,最左边的表示次数,如上边的1
案例主要是获取input
目录下符合正则表达式'dfs[a-z.]+'
的内容,这里可以自己添加例如文本文件进行测试如下:
2 完全分布模式
2.1 集群分发
2.1.1 scp命令实现服务器与服务器之间的数据安全拷贝
- 前提条件:两个服务器之间要能
ping
通 - 作用:实现服务器之间的数据的拷贝,避免频繁的配置,例如
JDK
以及Hadoop
的配置 - 语法:
scp
[选项] 要拷贝的文件或者目录 拷贝的文件到哪个位置
- 常用选项:
-r
:用于目录的递归拷贝 - 实例:
#从本服务器拷贝文件到其他服务器:将本服务器的当前目录下的test.txt文件拷贝到用户为cxj主机名为hadoop103的服务器下的/opt/sortware目录下
scp test.txt cxj@hadoop103:/opt/sortware
#从其他服务器拷贝文件到本服务器
scp cxj@hadoop102:/opt/sortware/test1.txt /opt/sortware
#目录拷贝
scp -r test cxj@hadoop102:/opt/sortware
过程如下,需要输入密码验证身份
2.1.2 rsync远程同步工具
- 含义:
rsync
主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。类似scp
,语法是一样的,主要区别是rsync
相当于差异性拷贝,就是有区别才拷贝 - 语法参考
scp
- 常用选项
还有一个选项是
-r
,但是-a
参数可以替代-r
,除了可以递归同步
以外,还可以同步元信息(比如修改时间、权限等
)。由于rsync
默认使用文件大小和修改时间决定文件是否需要更新,所以-a比-r更有用。更详细可以看这里:rsync 用法教程
- 实例
#文件同步
rsync -av test.txt cxj@hadoop102:/opt/sortware
#目录同步
rsync -av test cxj@hadoop102:/opt/sortware
scp
与rsync
对比
对于同一个文件以及使用上述命令进行了同步,当不修改test.txt
文件再次同步,就会出现如下:箭头位置表示传输的文件列表
第一次传输结果
第二次传输结果
目录同步是一样的,当目录下的文件删除或者修改后,再次使用该命令就会同步差异的文件,注意这是手动的同步,不是自动实时同步文件
2.1.3 简化同步脚本编写
-
问题:上述脚本都是每一次同步对于不同的服务器都要进行输入一次命令,对于同步的内容,事实上除了服务器,其他都是一样的
-
意义:通过
shell
脚本进行过程的简化这个过程:也就是自定义脚本,通过向脚本传递目录与文件的参数,就会自动将这个目录或文件同步到配置好的服务器的相应的位置 -
准备:在对应用户的家目录下创建
bin
目录
创建的原因是要将等下的shell
脚本丢到里边,然后将这个shell
脚本在其他地方作为一个命令执行
创建bin
目录的意义是,环境变量已经自动配置用户对应家目录的bin
目录的环境变量,所以可以直接输入脚本就执行对应的脚本,在家目录下通过$PATH
可以看到
我这里在bin
目录下创建xsync
文件,名字随意,shell
脚本可以是任意名,但是执行的时候就需要执行对应的名字。如果 设置的是xsync.sh
那么执行命令的时候使用的是xsync.sh 参数...
更改文件名命令:mv 旧文件名 新文件名
-
实例:
#!/bin/bash
if [ $# -lt 1 ] #输入的需要同步文件至少一个
then echo "无可用参数"
exit
fi
for host in hadoop102 hadoop103 #服务器名列表
do
for file in $@ #参数列表遍历
do
if [ -e $file ] #判断本地文件是否存在
then
#逻辑:切换到要同步的文件或者目录的所在目录并通过pwd获取
#绝对路径
#$()执行命令;
#--P参数:表示切换到实际的路径,主要是处理软连接的问题,
#因为直接cd,pwd软连接会显示软链接所在的目录,而不是软链接
#所指向的路径
#dirname:内置指令,获取目录名
pdir=$( cd -P $(dirname $file);pwd )
#basename:获取文件文件名
fname=$( basename $file )
#登录到对应的host,这里需要首先配置好主机名映射,然后执行
#创建对应的父目录,这里成功执行会有输入密码的过程
ssh $host "mkdir -p $pdir"
#同步指令,参考上述
rsync -av $pdir/$fname $host:$pdir
else echo "$file不存在"
fi
done
done
- 添加可执行可执行权限:
chmod u+x xsync
- 使用:
- 不足之处:第一次连接以及后续的
ssh
连接都需要输入密码。这里解决就需要配置ssh
的免登录
3 SSH免登录
3.1 SSH免登录原理
基本过程
过程简述
- 服务器
A
通过ssh
登录到服务器B
,通过ssh
登录前,A
就生成密钥对,并将其中的公钥
拷贝一份到B
B
随机生成一个字符串,例如一个数字1
。然后通过Authorized_keys
获取对应的公钥,然后通过公钥进行加密成另一个字符串,这里假设加密后是2
- 将加密后的字符串
2
发送到服务器A
,A
使用私钥进行解密,如果公钥
是当初服务器A
生成的,那么就会解密出1
- 这个时候,服务器
A
和服务器B
都拥有原始字符串1
,服务器A
将原始字符串1和会话ID1001
(这里假设是1001)组合,在使用私钥
进行加密,假设加密后得到的字符串是abc
- 将加密后的字符串
abc
发回到服务器B
,服务器再使用本身的公钥
将原始字符串1
和当前会话ID
进行加密,然后加密的结果和服务器A
发来的加密字符串进行对比,如果对比正确,就免登录通过
3.2 SSH免登录配置
3.2.1 公钥和私钥生成
在需要生成要公钥和私钥的服务器上执行以下命令
ssh-keygen -t rsa
在
~/.ssh
目录下生成两个文件id. rsa(私钥)
、id_rsa.pub(公钥)
3.2.2 公钥分发
使用以下命令将上述的生成的公钥进行分发到指定的机器上。想跟那个机器就发哪个。
ssh-copy-id 主机ip # ssh-copy-id hadoop102 hadoop102是主机名,需要自行配置,也可以写对应的ip地址
被分发公钥的主机~/.ssh
目录下会出现对应的认证文件,通过该文件可以获取对应的公钥,如果需要操作本机的,通过ssh
登录也是需要密码的,但是本机也是可以给本机分发公钥进行免登录配置。如下是生成的认证文件
注意:免登录配置是区分用户的,目前实现了其中一个用户的免登录配置,要是实现其他用户,例如使用其他用户登录后还想免密登录到其他服务器,就需要重新执行上述步骤