Hadoop运行模式
重要:信息用原生JDK坑太多了,所以卸掉,安装自己的JDK
参考博客:https://www.cnblogs.com/jpfss/p/9677827.html
官方:https://hadoop.apache.org/
文档:http://hadoop.apache.org/docs/r2.7.7/
一、本地模式(在hadoop目录下进行)
注意:output不能提前存在
1、官方Grep案例
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep input output 'dfs[a-z.]+'
cat output/*
在自己的虚拟机上运行有点慢
2、官方WordCount案例
# 创建文件夹
mkdir wcinput
# 向文件写入内容
cd wcinput
touch wc.input
vim wc.input
hadoop yarn
hadoop mapreduce
tom
tom
tom
# 运行
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount wcinput wcoutput
主要作用:查找wc.input 文件中 相同单词 出现的次数(wordcount)
二、伪分布式模式
A、启动HDFS并运行MapReduce程序
1、配置集群
a、配置:hadoop-nev.sh
# 获取JAVA_HOME的路径 echo $JAVA_HOME # 修改文件 vim etc/hadoop/hadoop-env.sh # The java implementation to use. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre
b、配置:core-site.xml文件
vim etc/hadoop/core-site.xml <!-- 指定HDFS的NameNode --> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.7/data/tmp</value> </property>
c、配置:hdfs-site.xml文件(配不配置都行)
vim etc/hadoop/hdfs-site.xml <!--指定HDFS的副本数量--> <property> <name>dfs.replication</name> <value>1</value> </property>
注意:默认副本数是3
2、启动集群
a、格式化NameNode(第一次启动时格式化,以后就不要总格式化)
bin/hdfs namenode -format
b、启动NameNode
sbin/hadoop-daemon.sh start namenode
c、启动DataNode
sbin/hadoop-daemon.sh start datanode
d、查看进程
jps
3、运行MapReduce程序
a、访问:http://linuxip:50070
b、Browse Directory
1)、创建目录
bin/hdfs dfs -mkdir -p /usr/tom/input
dfs后执行类linux命令
2)、执行WordCount
# push liunx的文件到HDFS bin/hdfs dfs -put wcinput/wc.input /usr/tom/input
# 执行
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /usr/tom/input /usr/tom/output
# 查看结果
bin/hdfs dfs -cat /usr/tom/output/*
问题:
1、bash: jps: command not found...
解决方案:
# 切换到 root 用户,创建软链接 su root ln -s /opt/module/jdk1.8.0_144/bin/jps /usr/local/bin/jps
2、访问网页50070端口失败
http://192.168.8.128:50070/
解决方案:https://www.cnblogs.com/wt7018/p/13550118.html
3、格式化NameNode
# 1、查看进程 jps # 2、杀死 namenode 和 datanode # 3、删除tmp文件,路径为自己修改的路径
B、启动YARN并运行MapReduce程序
1、配置集群
a、配置 yarn-env.sh
vim etc/hadoop/yarn-env.sh # 获取路径 echo $JAVA_HOME # 取消注释,修改 路径 export JAVA_HOME=/opt/module/jdk1.8.0_261
b、配置 yarn-site.xml
vim etc/hadoop/yarn-site.xml
<!-- Reducer 获取数据的存储方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManage 的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>wt.com</value> </property>
c、配置 mapred-env.sh
# 1.获取路径 echo $JAVA_HOME # 2.修改配置文件 vim etc/hadoop/mapred-env.sh # 3.取消注释和修改路径 export JAVA_HOME=/opt/module/jdk1.8.0_261
d、配置 mapred-site.xml
# 0.切换目录 cd /opt/module/hadoop-2.7.7/etc/hadoop # 1.修改名称名称 mv mapred-site.xml.template mapred-site.xml # 2.修改配置文件 vim mapred-site.xml <!--指定MapReduce运行在YARN上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
2、启动集群
前提条件 NameNode和DataNode已经启动
a、开启ResourceManage
sbin/yarn-daemon.sh start resourcemanager
b、开启nodemanage
sbin/yarn-daemon.sh start nodemanager
c、查看
jps
3、运行MapReduence
a、打开http://192.168.8.128:8088,报错,解决打开8088 port
b、运行
# 1. 创建文件夹 bin/hdfs dfs -mkdir -p /usr/tom/input # 2. 推文件到上面 bin/hdfs dfs -put wcinput/wc.input /usr/tom/input # 3. 运行 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /usr/tom/input /usr/tom/output
注意:运行的时候,刷新 http://192.168.8.128:8088/cluster 网页 查看变化
3、配置历史服务器
a、配置 mapred-site.xml
<!--历史服务器端地址--> <property> <name>mapreduce.jobhistory.address</name> <value>wt.com:10020</value> </property> <!--历史服务器web端地址--> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>wt.com:19888</value> </property>
2、启动历史服务器
sbin/mr-jobhistory-daemon.sh start historyserver
3、开启端口 19888
4、查看jobhistory
http://wt.com:19888/jobhistory
C、配置日志的聚集
注意:开启日志聚集功能,需要重新启动 HistoryManager、ResourceManager、NodeManager
1、配置 yarn-site.xml
vim yarn-site.xml
<!-- 日志聚集功能使用 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日志保留时间设置为 7 天--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
2、关闭 NodeManager、ResourceManager、HistoryManager
sbin/yarn-daemon.sh stop resourcemanager sbin/yarn-daemon.sh stop nodemanager sbin/yarn-daemon.sh stop historyserver
3、启动 NodeManager、ResourceManager、HistoryServer
sbin/yarn-daemon.sh start resourcemanager sbin/yarn-daemon.sh start nodemanager sbin/yarn-daemon.sh start historyserver
4、删除 HDFS 上已经存在的输出文件
bin/hdfs dfs -rm -r /usr/tom/output
5、执行 WordCount 程序
6、查看日志
三、完全分布式模式
注意:
1、HDFS NmaeNode 只要有 1 个 即可, SecondaryNameNode和 NameNode 不能存储到 1 个节点
2、HDFS DataNode存储在所有节点上
3、NmaeNode 和 ResourceManager 不能存放到 1 个 节点
4、Nodemanager 存储到所有节点
A、分析
1、虚拟机准备
2、安装JDK并配置环境变量
3、安装Hadoop并配置环境变量
4、配置集群
5、单点启动
6、配置 ssh
7、群起并测试集群
B、编写集群分发脚本 xsync 看 xsync即可
1、scp(secure copy) 安全copy
a、scp定义:
scp实现服务器与服务器之间的数据拷贝
b、基本语法:
scp -r $pdir/$fname $user@hadoop$host:$pdor/$fname 命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
c、案例实操(安装JDK并配置、安装Hadoop并配置)
0)、推 从wt.com -> wt1.com
scp -r /opt/module root@wt1.com:/opt/module
0)、拉 wt2.com <- wt.com
sudo scp -r tom@wt.com:/opt/module ./
0)、第三方(wt2.com) 操作 wt1.com -> wt3.com
scp -r tom@wt.com:/opt/module root@wt3.com:/opt/module
1)、修改 文件 所有者 所有组
sudo chown tom:tom module/ -R
2)、推送 profile
scp /etc/profile root@wt1.com:/etc/profile
3)、重新加载 profile
source /etc/profile
2、rsync 远程同步工具
rsync主要用于备份和镜像。且速度快、避免复制相同内容和支持符号链接的优点
a、基本语法
rsync -rvl $pid/$fname $user@hadoop$host:$pid/$fname 命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称 -r 递归 -v 显示过程 -l 拷贝软连接
b、案例实操
rsync -rvl /opt/test.txt root@wt1.com:/opt
区别:rsync 速度比 scp快,rsync 后面不用加 路径/文件;scp 后面加 路径/文件
3、xsync 集群分发脚本
a、/home/tom 目录下创建bin目录,并在bin目录下创建xsync文件
cd /home/tom mkdir bin vim xsync
b、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=1; host<3; host++)); do echo ------------- hadoop$host ----------------- rsync -rvl $pdir/$fname $user@wt$host.com:$pdir done
注意:wt是linux的主机名称
c、修改权限
chmod +777 xsync
d、运行
xsync /home/tom/bin
xsync 指定目录
注意:把xsync放到 /home/tom/bin 目录不被识别,放到 /usr/local/bin 目录下
wt.com wt1.com wt2.com ====================================================================== HDFS NameNode SecondaryNameNode DataNode DataNode DataNode ====================================================================== ResourceManager YARN NodeManager NodeManager NodeManager ====================================================================== 注意:NameNode 和 ResourceManager 消耗内存较大,因此,不能在同一个节点上
4、集群配置
a、核心配置文件
vim core-site.xml <!-- 指定HDFS的NameNode --> <property> <name>fs.defaultFS</name> <value>hdfs://wt.com:9000</value> </property> <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.7/data/tmp</value> </property>
b、HDFS 配置文件
1)、配置hadoop-env.sh
vim hadoop-env.sh export JAVA_HOME=java安装路径
2)、配置hdfs-site.xml
vim hdfs-site.xml <!-- 指定 Hadoop 辅助名称节点主机配置 --> <property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
c、YARN 配置文件
1)、配置 yarn-env.sh
vim yarn-env.sh export JAVA_HOME=java路径
2)、配置 yarn-site.xml
vim etc/hadoop/yarn-site.xml <!-- Reducer 获取数据的存储方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManage 的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>wt1.com</value> </property>
d、MapReduce 配置文件
1)、配置 mapred-env.sh
vim mapred-env.sh export JAVA_HONE=java安装路径
2)、配置 mapred-site.xml
mv mapred-site.xml.template mapred-site.xml vim mapred-site.xml <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
e、在集群上发布配置好的 Hadoop 配置文件
xsync /opt/module/hadoop-2.7.7
f、查看文件分发情况
另外两台节点的 core-site.xml
5、SSH无密登录
# wt.com (NameNode) cd ~ ls -al cd .ssh/ ssh-keygen -t rsa (三次回车) ssh-copy-id wt1.com ssh-copy-id wt2.com ssh-copy-id wt.com # 配置root su root cd ~ cd .ssh/ ssh-keygen -t rsa (三次回车) ssh-copy-id wt1.com ssh-copy-id wt2.com ssh-copy-id wt.com # wt1.com (ResourceManager) cd ~ ls -al cd .ssh/ ssh-keygen -t rsa (三次回车) ssh-copy-id wt2.com ssh-copy-id wt.com ssh-copy-id wt1.com
6、集群单节点启动
1、删除所有节点的 data logs rm -rf data/ logs/ 2、格式化NameNode bin/hdfs namenode -format 3、启动 sbin/start-dfs.sh
7、群起集群
# a、配置slaves # 打开slaves文件 vim etc/hadoop/slaves # 增加相应的节点, 不允许有空格,不允许有空行 wt.com wt1.com wt2.com # b、同步更新 xsync slaves # c、群起,启动dfs 在NmaeNode的节点; 启动Yarn 在ResourceManager的节点 sbin/start-dfs.sh sbin/start-yarn.sh
8、集群基本测试
# 集群文件存储路径 1、上传小文件 bin/hdfs dfs -put wcinput.wc,input / 2、上传大文件 bin/hdfs dfs -put /opt/software/hadoop-2.7.7.tar.gz /
9、集群启动/停止方式总结
# 单点启动 # 1、启动/停止 HDFS hadoop-daemon.sh start/stop namenode/datanode/secondarynode # 2、启动/停止 YARN yarn-daemon.sh start/stop resourcemanager/nodemanager # 群启 # 1、 启动/停止 HDFS start-dfs.sh/stop-dfs.sh # 2、 启动/停止 YARN start-yarn.sh/stop-yarn.sh