1.Hadoop的本地运行模式
1.1克隆虚拟机!
1.2修改主机名!
- sudo vim /etc/hostname ,重启reboot
1.3网络节点进行通信!
- sduo vim /etc/hosts 192.168.91.139 master
1.4创建文件夹:
- sudo chown pyvip:pyvip model/ software/ #赋予用户文件权限
- tar -zxvf jdk... -C /opt/model/ #解压文件
1.5安装jdk:
- sudo vim /etc/profile #配置jdk环境变量
- source /etc/profile #重启环境变量
- java -version #查看是否成功
1.6安装hadoop:
- tar -zxvf jdk... -C /opt/model/ #解压文件
- sudo vim /etc/profile #配置hadoop环境变量
- 确认成功 hadoop!
- #vim /opt/model/hadoop-2.7.2/etc/hadoop/hadoop-env.sh 修改JAVA_HOME路径!
1.7grep案例:
pyvip@master:/opt/model/hadoop-2.7.2$ mkdir input #创建输入文件
cp etc/hadoop/*.xml input/ #给输入文件夹拷贝
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input/ output 'dfs[a-z.]+'
# 运行hadoop的jar文件 jar文件路径 命令 输入路径 输出路径 过滤条件
#统计出符合过滤条件的单词进行输出
1.8wordcount案例:
mkdir wcinput #创建文件夹
touch wc.input vi wc.input cd .. #写文件
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput/ wcoutput
#启动hadoop的jar程序 wordcount命令 输入文件夹 输出文件夹
2.伪分布式运行hadoop案例
2.1配置集群:
hadoop-2.7.2的etc/hadoop目录下:
(a)配置:core-site.xml
<!-- 指定HDFS中NameNode的地址 /主机名 hadoop101 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(b)配置:hdfs-site.xml
<!-- 指定HDFS副本的数量 默认是三个(意思是需要有三个副本主机来存储的)-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
2.2启动集群:
(a)格式化namenode(第一次启动时格式化)
bin/hdfs namenode -format
(b)启动namenode
sbin/hadoop-daemon.sh start namenode #stop停止
(c)启动datanode
sbin/hadoop-daemon.sh start datanode #jsp查看下
2.3查看集群:
(a)查看是否启动成功
jps #必须配置jdk的环境变量才可以!
(b)查看产生的log日志
当前目录:/opt/module/hadoop-2.7.2/logs
cat hadoop-atguigu-datanode-hadoop101.log
(c)web端查看HDFS文件系统
http://192.168.1.101:50070 #主机号/IP地址都可以!
2.4操作集群:
(a)在hdfs文件系统上创建一个input文件夹
bin/hdfs dfs -mkdir -p /user/atguigu/input
(b)将测试文件内容上传到文件系统上
bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/
(c)查看上传的文件是否正确
bin/hdfs dfs -cat /user/atguigu/ input/wc.input
(d)运行mapreduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount
/user/atguigu/input/ /user/atguigu/output
(e)查看输出结果
命令行查看:bin/hdfs dfs -cat /user/atguigu/output/p*
浏览器查看:/user/master/output
(f)将测试文件内容下载到本地
hadoop fs -get /user/atguigu/output/part-r-00000 ./wcoutput/
#把atguig下的uoutput结果下载到wcoutput里面
(g)删除输出结果
hdfs dfs -rmr /user/atguigu/output
3.YARN上运行MapReduce 程序
3.1配置集群:
在etc/hadoop目录下
(a)配置yarn-env.sh 修改JAVA_HOME
(b)配置yarn-site.xml
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
(c)配置:mapred-env.sh 配置一下JAVA_HOME
(d)配置: 对mapred-site.xml.template重新命名为 mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3.2启动集群:
(a)启动前必须保证namenode和datanode已经启动 因为yarn是调度,要先启动任务
(b)启动resourcemanager
sbin/yarn-daemon.sh start resourcemanager
(c)启动nodemanager
sbin/yarn-daemon.sh start nodemanager
3.3操作集群:
(a)yarn的浏览器页面查看
http://192.168.1.101:8088/ #主机号也行
(b)删除文件系统上的output文件 #一定要提前删除
hdfs dfs -rm -R /user/atguigu/output
(c)执行mapreduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar
wordcount /user/atguigu/input /user/atguigu/output
(d)查看运行结果
hdfs dfs -cat /user/master/output/p*
4.完全分布式部署Hadoop
4.1基础linux命令:
sudo chmod 777 xsync #改为可读可写可执行
sudo chown pyvip:pyvip xsync #更改操作用户
basename /opt/tmp/test.txt 返回test.txt
dirname /opt/tmp/test.txt 返回/opt/tmp
whoami 返回用户
4.2基础环境准备
- 虚拟机开启三台,确保可以互相通信。
- scp可以实现服务器与服务器之间的数据完全的拷贝。
- 详细介绍如下:
@坑:使用root用户时由于配置问题,权限错误
# 第一步: vim /etc/ssh/sshd_config
# 第二步: 注释这句话 PermitRootLogin prohibit-password
# 第三步: 新增加一条 PermitRootLogin yes
# 第四步重启服服:/etc/init.d/ssh restart
1)将本地hadoop101中/opt/module目录拷贝到hadoop102、hadoop103和hadoop104上。
scp -r /opt/module/ root@hadoop104:/opt
2)将hadoop101服务器上的/etc/profile文件拷贝到本地hadoop102、hadoop103和hadoop104上。
#要注意:source /etc/profile 重启环境变量
scp root@hadoop101:/etc/profile /etc/profile
3)在hadoop103上操作将hadoop101中/opt/software/目录拷贝到hadoop102的/opt目录上。
scp -r root@hadoop101:/opt/software root@hadoop102:/opt/ 需要先实现免密登录
- 实现SSH无密码登录
- 详细介绍如下:
1)基本语法
ssh 另一台电脑的ip地址/主机名 实现了远程登录 ssh master
2)无密钥配置
(1)进入到我的家目录,然后:cd .ssh/
(2)生成公钥和私钥:ssh-keygen -t rsa 加三次回车
(3)将公钥拷贝到要免密登录的目标机器上 ssh-copy-id hadoop103
- rsync远程同步工具,用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
- 详细介绍如下:
把本机/opt/tmp目录同步到hadoop103服务器的root用户下的/opt
rsync -rvl /opt/tmp root@hadoop103:/opt/
- 编写集群分发脚本xsync
1)需求分析:循环复制文件到所有节点的相同目录下。
(1)原始拷贝:rsync -rvl /opt/module root@hadoop103:/opt/
(2)期望脚本:xsync 要同步的文件名称
(3)在/usr/local/bin这个目录下存放的脚本,可以在系统任何地方直接执行。
2)案例
(1)在/usr/local/bin目录下创建xsync文件
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=103; host<105; host++)); do
#echo $pdir/$fname $user@hadoop$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
(2)修改脚本 xsync 具有执行权限 chown atguigu:atguigu xsync
(3)调用脚本形式:xsync 文件名称 比如:xsync tmp/
4.3集群部署规划
hadoop102 hadoop103 hadoop104
放:NameNode 放:SecondaryNameNode
DataNode //副本 DataNode//副本 DataNode//副本
NodeManager//对应副本 NodeManager//对应副本 NodeManager//对应副本
放:ResourceManager
4.4配置集群
@etc/hadoop目录下
(1)core-site.xml文件
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
(2)Hdfs
hadoop-env.sh :export JAVA_HOME=/opt/module/jdk1.8.0_144
hdfs-site.xml文件
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
</configuration>
slaves 文件
master
slave2
slave1
(3)yarn
yarn-env.sh :export JAVA_HOME=/opt/module/jdk1.8.0_144
yarn-site.xml文件
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave2</value>
</property>
(4)mapreduce
mapred-env.sh :export JAVA_HOME=/opt/module/jdk1.8.0_144
mapred-site.xml文件
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
4.5在集群上分发以上所有文件
xsync hadoop/
查看成功,在其他服务器上cat hadoop/slaves
4.6集群启动及测试
1)启动集群
(0)如果集群是第一次启动,需要格式化namenode
bin/hdfs namenode -format
(1)启动HDFS(底下组件都会启动):
sbin/start-dfs.sh
(2)启动yarn(底下组件都会启动)
sbin/start-yarn.sh
2)集群基本测试
(1)上传文件到集群
hadoop fs -mkdir -p /user/atguigu/input
上传小文件 :hadoop fs -put wcinput/wc.input /user/atguigu/input
上传大文件 :hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/atguigu/input
(2)上传文件后查看文件存放在什么位置
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/
BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
(3)拼接
cat blk_1073741836>>tmp.file #放到一个临时文件
cat blk_1073741837>>tmp.file
tar -zxvf tmp.file #解压到当前文件
(4)下载
bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz
4.7Hadoop启动停止方式
1)各个服务组件逐一启动
(1)分别启动hdfs组件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
(2)启动yarn
yarn-daemon.sh start|stop resourcemanager|nodemanager
2)各个模块分开启动(配置ssh是前提)常用
(1)整体启动/停止hdfs:start-dfs.sh stop-dfs.sh
(2)整体启动/停止yarn:start-yarn.sh stop-yarn.sh
3)全部启动(不建议使用)
start-all.sh stop-all.sh