Hadoop 官方网站:hadoop.apache.org
根据官网的说明:
- Hadoop在GNU/Linux作为开发和生产平台受到了支持。
- 必须安装Java
- 如果要使用可选的启动和停止脚本,则必须安装ssh并运行sshd才能使用管理远程Hadoop守护进程的Hadoop脚本
Hadoop与JDK的对应版本可以参考:cwiki.apache.org/confluence/...
hadoop下载地址:dlcdn.apache.org/hadoop/comm...
根据官网的说明有三种运行模式
- 本地(独立)模式
- 伪分布模式
- 全分布式模式
本地模式
在 hadoop-3.1.3 文件下面创建一个 wcinput 文件夹
yaml
[muyi@hadoop102 hadoop-3.1.3]$ mkdir wcinput
[muyi@hadoop102 hadoop-3.1.3]$ ll
总用量 176
drwxr-xr-x. 2 muyi muyi 183 9月 12 2019 bin
drwxr-xr-x. 3 muyi muyi 20 9月 12 2019 etc
drwxr-xr-x. 2 muyi muyi 106 9月 12 2019 include
drwxr-xr-x. 3 muyi muyi 20 9月 12 2019 lib
drwxr-xr-x. 4 muyi muyi 288 9月 12 2019 libexec
-rw-rw-r--. 1 muyi muyi 147145 9月 4 2019 LICENSE.txt
-rw-rw-r--. 1 muyi muyi 21867 9月 4 2019 NOTICE.txt
-rw-rw-r--. 1 muyi muyi 1366 9月 4 2019 README.txt
drwxr-xr-x. 3 muyi muyi 4096 9月 12 2019 sbin
drwxr-xr-x. 4 muyi muyi 31 9月 12 2019 share
drwxrwxr-x. 2 muyi muyi 6 11月 10 08:40 wcinput
[muyi@hadoop102 hadoop-3.1.3]$ cd wcinput/
在 wcinput 文件下创建一个 word.txt 文件,在文件中输入如下内容
hadoop yarn
hadoop mapreduce
myyi
muyi
ruby
[muyi@hadoop102 wcinput]$ vim word.txt
统计每一个单词出现的次数
回到 Hadoop 目录/opt/module/hadoop-3.1.3
执行程序
bash
[muyi@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput
逐部分解释
-
bin/hadoop
:- 这是一个脚本,通常位于 Hadoop 的
bin
目录下。 hadoop
脚本是 Hadoop 的主命令行接口,用于执行各种 Hadoop 相关的操作,如提交作业、管理文件系统等。
- 这是一个脚本,通常位于 Hadoop 的
-
jar
:jar
是hadoop
命令的一个子命令,用于运行包含 MapReduce 作业的 JAR 文件。jar
命令需要两个主要参数:JAR 文件的路径和主类(或作业名称)。
-
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar
:- 这是包含 MapReduce 作业示例的 JAR 文件的路径。
hadoop-mapreduce-examples-3.1.3.jar
是 Hadoop 发行版中自带的一个 JAR 文件,其中包含了多个示例 MapReduce 作业,包括 WordCount。
-
wordcount
:- 这是 JAR 文件中的一个特定作业名称。
- 在
hadoop-mapreduce-examples-3.1.3.jar
中,wordcount
是一个预定义的作业名称,对应于 WordCount 示例。
-
wcinput/
:- 这是输入数据的路径。
wcinput/
是 HDFS 上的一个目录,其中包含要进行词频统计的文本文件。
-
./wcoutput
:- 这是输出结果的路径。
./wcoutput
是 HDFS 上的一个目录,MapReduce 作业的结果将被写入这个目录。- 注意:如果输出目录已经存在,Hadoop 会抛出错误,因为 Hadoop 不允许覆盖现有的输出目录。你需要先删除或重命名已存在的输出目录。
功能 :运行 Hadoop MapReduce 作业,使用 hadoop-mapreduce-examples-3.1.3.jar
中的 wordcount
示例,处理 wcinput/
目录中的数据,并将结果输出到 ./wcoutput
目录。
查看结果
ruby
[muyi@hadoop102 hadoop-3.1.3]$ cd wcoutput/
[muyi@hadoop102 wcoutput]$ ll
总用量 4
-rw-r--r--. 1 muyi muyi 42 11月 10 08:50 part-r-00000
-rw-r--r--. 1 muyi muyi 0 11月 10 08:50 _SUCCESS
[muyi@hadoop102 wcoutput]$ cat part-r-00000
hadoop 2
mapreduce 1
muyi 1
myyi 1
yarn 1
[muyi@hadoop102 wcoutput]$
完全分布式运行模式
编写集群分发脚本
scp(secure copy) 安全拷贝
scp 可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
基本语法:
swift
scp -r $pdir/$fname $user@$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
前提:在hadoop103,hadoop104都已经创建好
/opt/module
推送数据
vbnet
[muyi@hadoop102 module]$ scp -r jdk1.8.0_212/ muyi@hadoop103:/opt/module/
The authenticity of host 'hadoop103 (192.168.10.103)' can't be established.
ECDSA key fingerprint is SHA256:OPCXbzuiPqHyAbQAqf/7fSB13u8/u7Vs9z5csAVV6VU.
ECDSA key fingerprint is MD5:8e:98:30:6b:26:79:d9:16:19:d5:17:b9:4e:80:62:98.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop103,192.168.10.103' (ECDSA) to the list of known hosts.
muyi@hadoop103's password:
拉取数据
ruby
[muyi@hadoop103 module]$ scp -r muyi@hadoop102:/opt/module/hadoop-3.1.3 ./
The authenticity of host 'hadoop102 (192.168.10.102)' can't be established.
ECDSA key fingerprint is SHA256:OPCXbzuiPqHyAbQAqf/7fSB13u8/u7Vs9z5csAVV6VU.
ECDSA key fingerprint is MD5:8e:98:30:6b:26:79:d9:16:19:d5:17:b9:4e:80:62:98.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop102,192.168.10.102' (ECDSA) to the list of known hosts.
muyi@hadoop102's password:
在hadoop103上将hadoop102的数据发送到hadoop104上
ruby
[muyi@hadoop103 module]$ scp -r muyi@hadoop102:/opt/module/* muyi@hadoop104:/opt/module/
muyi@hadoop102's password:
rsync远程同步工具
rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。
基本语法:
swift
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数说明
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
删除hadoop中的wcinput和wcoutput用来测试
ruby
[muyi@hadoop103 hadoop-3.1.3]$ rm -rf wcinput/ wcoutput/
ruby
[muyi@hadoop102 module]$ rsync -av hadoop-3.1.3/ muyi@hadoop103:/opt/module/hadoop-3.1.3
muyi@hadoop103's password:
xsync集群分发脚本
需求: 循环复制文件到所有节点的相同目录下
需求分析:
-
rsync命令原始拷贝
rubyrsync -av /opt/module muyi@hadoop103:/opt
-
期望脚本:
xsync 要同步的文件名称
-
期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径) [muyi@hadoop102 module] <math xmlns="http://www.w3.org/1998/Math/MathML"> e c h o echo </math>echoPATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/muyi/.local/bin:/home/muyi/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin [muyi@hadoop102 module]$
-
脚本实现
- 在/home/muyi/bin目录下创建xsync文件
ruby[muyi@hadoop102 ~]$ cd /home/muyi/bin -bash: cd: /home/muyi/bin: 没有那个文件或目录 [muyi@hadoop102 ~]$ mkdir bin [muyi@hadoop102 ~]$ cd bin [muyi@hadoop102 bin]$ vim xsync
- 在该文件中编写如下代码
bashif [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in hadoop102 hadoop103 hadoop104 do echo ==================== $host ==================== #3. 遍历所有目录,挨个发送 for file in $@ do #4. 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done
ruby[muyi@hadoop102 bin]$ ll 总用量 4 -rw-rw-r--. 1 muyi muyi 703 11月 10 10:28 xsync [muyi@hadoop102 bin]$
可以看到当前文件没有执行权限
ruby[muyi@hadoop102 bin]$ chmod 777 xsync [muyi@hadoop102 bin]$ ll 总用量 4 -rwxrwxrwx. 1 muyi muyi 703 11月 10 10:28 xsync
-
同步
bin
目录vbnet[muyi@hadoop102 ~]$ xsync bin/ ==================== hadoop102 ==================== The authenticity of host 'hadoop102 (192.168.10.102)' can't be established. ECDSA key fingerprint is SHA256:OPCXbzuiPqHyAbQAqf/7fSB13u8/u7Vs9z5csAVV6VU. ECDSA key fingerprint is MD5:8e:98:30:6b:26:79:d9:16:19:d5:17:b9:4e:80:62:98. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'hadoop102,192.168.10.102' (ECDSA) to the list of known hosts. muyi@hadoop102's password: muyi@hadoop102's password: sending incremental file list sent 88 bytes received 17 bytes 19.09 bytes/sec total size is 704 speedup is 6.70 ==================== hadoop103 ==================== muyi@hadoop103's password: muyi@hadoop103's password: sending incremental file list bin/ bin/xsync sent 838 bytes received 39 bytes 194.89 bytes/sec total size is 704 speedup is 0.80 ==================== hadoop104 ==================== muyi@hadoop104's password: muyi@hadoop104's password: sending incremental file list bin/ bin/xsync sent 838 bytes received 39 bytes 250.57 bytes/sec total size is 704 speedup is 0.80 [muyi@hadoop102 ~]$
-
查看另外两台虚拟机是否已经同步
- 分发之前配置的环境变量
ruby
[muyi@hadoop102 ~]$ xsync /etc/profile.d/my_env.sh
但是在这出现了权限问题,被拒绝了,那么加sudo
执行呢?
ruby
[muyi@hadoop102 ~]$ sudo xsync /etc/profile.d/my_env.sh
sudo: xsync:找不到命令
[muyi@hadoop102 ~]$
很明显,也是不行的,那么我们就需要在xsync
前加上路径才可以!!!
重启一下环境变量使其生效