Hadoop - 入门学习笔记(详细)
目录
第1章 大数据概论
第2章 从Hadoop框架讨论大数据生态
- 大发行版本:Apache Hadoop、Coudera Hadoop、Hortonworks Hadoop
- Hadoop组成:MapReduce(计算)、Yarn(资源调度)、HDFS(存储)、Common(辅助工具)
- 1.x中计算和资源调度都是MapReduce
- HDFS:NameNode、DataNode、SecondaryNameNode
- YARN:ResourceManage、NodeManage、ApplicationMaster、Container
- MapReduce:Map阶段、Reduce阶段
- 大数据生态体系:
- 数据来源:数据库(结构化数据)、半结构化数据
- 数据传输:Sqoop数据传递,Flume日志收集
- 数据存储:HDFS文件存储,Hbase非关系型数据库
- 资源管理:Yarn
- 数据计算:MapReduce离线计算,Spark Core内存计算,(Hive数据查询,Spark R数据分析,Spark Sql数据查询,Spark Stream实时计算,Flink)
- 任务调度:Oozie任务调度,Azkaban任务调度,ZooKeeper数据平台配置和调度
- 业务模型:数据可视化、业务应用
第3章 Hadoop运行环境搭建(开发重点)
- 1,虚拟机环境
- 准备:vmware,centos7
- 创建虚拟机,安装centos7
- 虚拟机克隆,修改IP地址
- 2,安装JDK,(rpm -qa | grep java查看已安装jdk,yum -y remove java-1.7.0-openjdk*删除已安装的,java -version验证)
- 3,安装Hadoop
解压到指定目录:
tar -xzvf hadoop-2.7.2.tar.gz -C /opt/module
tar -xzvf jdk-8u241-linux-x64.tar.gz -C /opt/module
配置环境变量 vi /etc/profile.d/env.sh更好一点 远程登录时会加载所有profile.d下的.sh文件
vi /etc/profile
-------------------------------------------
## JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_241
export PATH=$JAVA_HOME/bin:$PATH
## HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
source生效
第4章 Hadoop运行模式
本地模式:默认配置
伪分布式模式:按照完全分布式模式配置,但是只有一个节点
启动HDFS并运行MapReduce程序(本地运行)
- 配置:hadoop-env.sh,JAVA_HOME修改为绝对路径
- 配置:core-site.xml,HDFS中namenode地址,Hadoop运行时产生文件的目录
- 配置:hdfs-site.xml,指定HDFS副本数量
core-cite.xml # 设置后本地模式不可用,因为namenode地址修改为Hdfs了,默认是file:///
<!-- 指定HDFS 中NameNode 的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost101:9000</value>
</property>
<!-- 指定Hadoop 运行时产生文件的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
hdfs-site.xml
<!-- 指定HDFS 副本的数量-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定Hadoop 辅助名称节点主机配置-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>localhost104:50090</value>
</property>
注意:hadoop.tmp.dir需要谨慎设置,否则数据迁移比较麻烦
- 启动集群
- 格式化NameNode:hdfs namenode -format
- 启动NameNode:hadoop-daemon.sh start namenode
- 启动DataNode:hadoop-daemon.sh start datanode
- 查看集群
- jps
- web端查看hdfs:localhost101:50070,(yarn是8088),无法访问参考
- 查看log日志:/hadoop-2.7.2/logs
注意:为什么不能一直格式化namenode?
格式化NameNode,会产生新的集群id,导致NameNode 和DataNode 的集群id 不一致,集群找不到已往数据。所以,格式NameNode 时,一定要先删除data数据和log 日志,然后再格式化NameNode。(必须先关掉namenode和datanode的进程,否则删掉后又会产生data数据和log日志)
- 操作集群
- 执行wordcount,此时是在local运行mapreduce程序
- hdfs dfs -xxx,(hadoop -dfs已弃用,内部也是转化为hdfs -dfs,hadoop fs更通用,可以处理其他的FS)
- ls、cat、rm -r、put、get
启动Yarn并运行MapReduce程序(在Yarn上运行)
- 配置:yarn-env.sh,JAVA_HOME修改为绝对路径
- 配置:yarn-site.xml,Reducer获取数据的方式,Yarn的ResourceManage的地址
- 配置:mapred-env.sh,JAVA_HOME修改为绝对路径
- 配置:mapred-site.xml,指定MR在Yarn上运行
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>localhost101</value>
</property>
mapred-site.xml
<!-- 指定MR 运行在YARN 上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 启动集群
- 启动前必须保证NameNode和DataNode已经启动
- 启动ResourceManager:yarn-daemon.sh start resourcemanager
- 启动NodeManager:hadoop-daemon.sh start nodemanager
- 查看集群
- jps
- web端查看Yarn:http://localhost101:8088/cluster(history需要开启历史服务器,logs需要enable日志聚集)
- 操作集群
- 删除output
- 执行MapReduce程序
配置历史服务器
- 配置mapred-site.xml
<!-- 历史服务器端地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>localhost101:10020</value>
</property>
<!-- 历史服务器web 端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>localhost101:19888</value>
</property>
- 启动历史服务器:mr-jobhistory-daemon.sh start historyserver
- 查看是否启动:jps
- 查看服务器:http://localhost101:19888/jobhistory
配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
- 配置: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>
- 重启NodeManager 、ResourceManager 和HistoryManager
- yarn-daemon.sh start resourcemanager
- yarn-daemon.sh start nodemanager
- mr-jobhistory-daemon.sh start historyserver
- 运行MapReduce程序
完全分布式模式(开发重点),配置汇总
虚拟机准备
编写集群分发脚本xsync
- scp(secure copy), 安全拷贝
- scp -r src dst,src,dst可以是xxx@xxx:/xxx/xxx,user@localhost101:/xxx
- 拷贝module目录,/etc/profile环境变量,source生效
- 注意:dst中如目录是已存在目录则创建目录,名为src中目录;若不存在目录,则将src中目录重命名为dst中目录
- rsync,远程同步工具
- rsync -rvl src dst
- 注意:src中同步目录不加/表示同步文件,会在dst中创建新的目录;若要同步目录则加/
- xsync,集群分发脚本
- 修改脚本xsync 具有执行权限:chmod 777 xsync
- 放在home/xxx/bin目录下,或放在/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 ------------------- localhost$host --------------
rsync -rvl $pdir/$fname $user@localhost$host:$pdir
done
集群配置
- 集群部署规划
JAVA_HOME | localhost102 | localhost103 | localhost104 | ||
hadoop-env.sh | core-site.xml hdfs-site.xml | HDFS | NameNode DataNode |
DataNode | SecondaryNameNode DataNode |
yarn-env.sh | yarn-site.xml | Yarn |
NodeManager | ResourceManager NodeManager |
NodeManager |
mapred-env.sh | mapred-site.xml | MapReduce | HistoryServer |
- 配置集群:
- hadoop-env.sh(JAVA_HOME)
core-site.xml(NameNode地址,Hadoop运行产生文件存储地址)
hdfs-site.xml(SecondaryNameNode地址,副本数) - yarn-env.sh(JAVA_HOME)
yarn-site.xml(ResourceManager地址,Reducer获取数据方式) - mapred-env.sh
mapred-site.xml(JobHistory Server地址,MR运行在Yarn上) - xsync etc/hadoop 分发脚本
- hadoop-env.sh(JAVA_HOME)
单节点启动
- 删除所有节点上的data、logs目录,格式化NameNode,hdfs namenode -format
- 在NameNode节点上启动NameNode、DataNode
- 在其他节点上启动DataNode
配置SSH免密登录(为了群起集群,使用系统自带的脚本)
- 用法:ssh 主机IP
- 原理:主机1生成私钥和公钥,公钥发送给主机2,主机1发送主机2的信息用公钥解密,主机2发送给主机1的信息用私钥解密,主机1就可以在本机上登录主机2与其进行通信
- 生成公钥和私钥:cd,cd .ssh/,ssh-keygen -t rsa,三次回车生成私钥id_rsa和公钥id_rsa.pub
- 拷贝公钥到目标主机上:ssh-copy-id localhost102,103,104,自己主机也要拷贝,NameNode要和每一个主机通信
- 102(运行NameNode)、102root(很多操作需要root用户完成)、103(运行ResourceManager)都需要设置ssh免密登录
群起集群
- 配置etc/hadoop/slaves,文件中是所有DataNode节点主机,注意:该文件中添加的内容结尾不允许有空格,不允许有空行。
- 同步所有节点(调用start-dfs.sh的节点配置slaves就可以启动slaves中所有DataNode)
- 启动集群(注意格式化之前,一定要先停止上次启动的所有namenode 和datanode 进程,然后再删除data 和log 数据)
- 启动HDFS:start-dfs.sh(任何节点都可以调用,如果没有配置ssh,需要输入节点密码;如果启动节点没有配置slaves,则只会启动本节点;slaves配置在启动节点上就可以)
- 启动YARN:start-yarn.sh,(必须在Yarn所在的节点上启动,否则ResourceManager不会启动)
- 启动JobHistory Server:mr-jobhistory-daemon.sh start historyserver(必须在historyserver上启动)
- Web端查看NameNode102:50070,SecondaryNameNode104:50090,Yarn103:8088,历史服务器103:19888
- 基本测试:上传大文件、小文件
集群启动、停止方式总结
- 各个服务组件单独启动、停止
- HDFS:hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
- YARN:yarn-daemon.sh start / stop resourcedmanager / nodemanager
- HistoryServer:mr-jobhistory-daemon.sh start historyserver
- 各个模块分开启动、停止
- HDFS:start-dfs.sh / stop-dfs.sh,(在任何一个节点上都可以启动集群,但是必须配置slaves)
- YARN:start-yarn.sh / stop-yarn.sh,(必须在RM上启动,才会启动RM,否则只会启动NodeMananger)
集群时间同步
- crontab定时任务,需要开启crond服务(service crond status 查看状态,service crond start 启动服务)
- 用法:***** 执行命令;表示:分钟(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-7)
【*】代表所有可能的值,【,】指定不连续的值,【-】表示整数范围,【/】指定间隔的时间频率 - crontab -e:编辑定时任务,-l显示当前用户的定时任务,-r删除定时任务
- 用法:***** 执行命令;表示:分钟(0-59)、小时(0-23)、天(1-31)、月(1-12)、周(0-7)
- 找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
- 时间服务器配置(root用户操作)
- 检查ntp是否安装:rpm -qa|grep ntp
- 修改ntp配置文件 /etc/ntp.conf
1. 授权网段上的所有机器可以从这台机器同步时间:restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
2. 集群在局域网上,不使用互联网上的时间:注释掉所有server 0.xxx
3. 当该节点丢失,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步,添加两行
server 127.127.1.0
fudge 127.127.1.0 stratum 10 - 修改/etc/sysconfig/ntpd,让硬件时间与系统时间一起同步,增加:YNC_HWCLOCK=yes
- 重新启动ntpd 服务:service ntpd status 查看状态,service ntpd start 启动,chkconfig ntpd on 设置开机启动
- 其他机器配置(root用户操作)
- 配置每10分钟与时间服务器同步一次,crontab -e:*/10 * * * * /usr/sbin/ntpdate localhost102
第5章 Hadoop编译源码(面试重点)
本文来自博客园,作者:Bingmous,转载请注明原文链接:https://www.cnblogs.com/bingmous/p/15643719.html