Hadoop学习
- 虚拟机安装
- linux网络配置
- 此处设置IP时注意
- SSH服务配置 免密登录
- 防火墙配置
- Jdk安装
- 配置环境变量
- Hadoop安装和集群配置
- 配置环境变量
- 主节点配置
- Hdfs-site.xml文件配置 此处dfs需注意value前无需添加hdfs
- Mapred-site.xml文件配置
- yarn-site.xml文件配置
- Slaves文件配置
- zookeeper安装并配置
- 配置环境变量
- 配置zoo.cfg
- 添加myid文件
- Hadoop模块
- Hadoop集群启动测试
- 通过UI查看hadoop集群
- Hadoop运行mapreduce 使用基础jar包统计词频
- Hadoop - JavaAPI (with IDEA in Windows)
- HDFS的Checkpoint
- 为什么需要checkpoint?
- checkpoint触发条件
- checkpoint做了什么
- shared.edits.dir 日志文件位置设置
- fsimage fsimage文件位置
- 利用副本机制故障还原
- HDFS中的fsck命令(检查数据块是否健康)
- 损坏文件的处理
- 打印文件的Block报告(-blocks)
- hdfs haadmin 命令
- -transitionToActive
- -getServiceState
- -checkHealth
虚拟机安装
第一步:创建新的虚拟机
第二步:选择“自定义向导”
第三步:
第四步:选择操作系统的类型
第五步:安装及位置
第六步:cpu及核心数 建议最少2核
第七步:内存 建议最少4G
第八步:网络类型选择桥接或NAT都可(建议NAT模式)
创建好了虚拟机 图中CPU核心和内存都是为简化流程没有改
安装一台centos7并克隆两台共三台机器
linux网络配置
1.修改主机名称
将克隆的2、3主机分别改名为hadoop02、hadoop03
Vi /etc/hostname
2.主机名和ip映射配置
此处设置IP时注意
Host文件配置 三台虚拟机之间通信名称代替ip
2.网络参数配置 配置静态ip
3.测试网卡配置
若修改vmware默认初始网段,出现无法ping通外网在上图虚拟网络编辑器还原默认配置,使用还原后的网段即可.
SSH服务配置 免密登录
1.生成私匙 和公匙
将共匙 加入authorized_keys 文件(如没有touch创建该文件) 实现自我登录
cat id_rsa.pub >> authorized_keys
复制共匙到hadoop02和hadoop03 实现免密登录
防火墙配置
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=50075/tcp --permanent
firewall-cmd --zone=public --add-port=8088/tcp --permanent
hdfs
9000 50070 50010
yarn
8030 8031 8032 8088
journalnode
8485
zookeeper
2181 2888 3888
放开端口需重载防火墙配置
firewall-cmd --reload
查看一下开放的端口
firewall-cmd --zone=public --list-ports
常用的端口如下
Jdk安装
上传
解压
重命名
配置环境变量
验证安装完成
Hadoop安装和集群配置
上传
解压
配置环境变量
需要注意的是配置环境变量的时候若有两个path 一定要记得两个都要在前面加$符号
验证安装成功
主节点配置
core-site.xml 配置 此地fs需注意value值开头需添加hdfs 非高可用
高可用ha配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>ha001:2181,ha002:2181,ha003:2181</value>
</property>
<!--ipc超时重试次数和间隔-->
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
</property>
<property>
<name>ipc.client.connect.timeout</name>
<value>20000</value>
</property>
</configuration>
Hdfs-site.xml文件配置 此处dfs需注意value前无需添加hdfs
高可用ha配置
<?xml version="1.0" encoding="UTF-8"?>href="configuration.xsl"?>
<configuration>
<!--三台节点-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--元数据信息位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/export/data/hadoop/name</value>
</property>
<!--数据位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/export/data/hadoop/data</value>
</property>
<!--开启WEB-HDFS-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--ha集群名称-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!--两台namenode名称-->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!--nn1的通信地址-->
<!--RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>ha001:9000</value>
</property>
<!--http通信地址-->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>ha001:50070</value>
</property>
<!--nn2的通信地址-->
<!--RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>ha002:9000</value>
</property>
<!--http通信地址-->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>ha002:50070</value>
</property>
<!--NAMENODE的元数据在journalnode的存放位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ha001:8485;ha002:8485;ha003:8485/ns1</value>
</property>
<!--指定journal在本地磁盘的存放位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/data/hadoop/journaldata</value>
</property>
<!--开启namenode失败自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--隔离机制自动切换时登录第二台namenode -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--journal连接配置-->
<property>
<name>dfs.qjournal.start-segment.timeout.ms</name>
<value>20000</value>
</property>
<property>
<name>dfs.qjournal.select-input-streams.timeout.ms</name>
<value>20000</value>
</property>
<property>
<name>dfs.qjournal.write-txns.timeout.ms</name>
<value>20000</value>
</property>
</configuration>
Mapred-site.xml文件配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>3072</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>6144</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3072m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144m</value>
</property>
</configuration>
yarn-site.xml文件配置
资源管理器负责配置调控CPU,内存,磁盘等分配和使用
分为节点资源管理和任务资源分配
单节点推荐内存设置如下(主要为系统预留)
每个container则根据任务需要设置最大最小分配资源
<?xml version="1.0"?>
<configuration>
<!--是否将对容器实施物理内存限制-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>true</value>
</property>
<!--是否将对容器实施虚拟内存限制-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>true</value>
</property>
<!--物理核心和虚拟核心比率-->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<!--将逻辑处理器(例如超线程)视为核心-->
<property>
<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
<value>false</value>
</property>
<!--scheduler给每个容器可分配资源-->
<!------表示每个container的最大物理内存------->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>3072</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
<!------表示每个container的最大CPU核心数------->
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>3</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!--单个节点可用资源-->
<!------表示该节点可使用的物理内存------->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2400</value>
</property>
<!------表示该节点可使用的CPU核心数------->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<!--resourcemanager地址-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>ha001</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>ha002</value>
</property>
<!--指定zookeeper集群地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>ha001:2181,ha002:2181,ha003:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--开启resourcemanager高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--指定cluster ID-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
</configuration>
Slaves文件配置
将主节点内容分发到子节点
分发profile配置
同步分发、export下的文件
zookeeper安装并配置
1.下载并解压
配置环境变量
配置zoo.cfg
添加myid文件
Ha-01输入值1,ha-02输入值为2,ha-03输入值为3
Hadoop模块
common 公共模块
HDFS 文件存储
YARN 资源管理
MapReduce 计算框架
Hadoop集群启动测试
1.启动各个节点的zookeeper服务
zkServer.sh start
2.启动集群监控namenode的管理日志journalNode
hadoop-daemons.sh start journalnode
说明:该命令不推荐使用,系统会提示使用新的命令
hdfs –daemon start journalnode
可以不用单独启动,在启动hadoop集群的时候会自动启动(如果配置了的journalnode情况)
3.在node-01上格式化namenode,并分发到node-02
1.Hadoop namenode –format 提示用:hdfs namenode -format
2.scp –r /export/data/hadoop node-02:/export/data
注意:只分发master和backupmaster
hdfs namenode -format
若初始化时出现下面错误
错误原因:
我们在执行start-dfs.sh的时候,默认启动顺序是namenode>datanode>journalnode>zkfc,如果journalnode和namenode不在一台机器启动的话,很容易因为网络延迟问题导致namenode无法连接journalnode,无法实现选举,最后导致刚刚启动的namenode会突然挂掉。虽然namenode启动时有重试机制等待journalnode的启动,但是由于重试次数限制,可能网络情况不好,导致重试次数用完了,也没有启动成功。
解决方法:
方法①:手动启动namenode,避免了网络延迟等待journalnode的步骤,一旦两个namenode连入journalnode,实现了选举,则不会出现失败情况。
方法②:先启动journalnode然后再运行start-dfs.sh。
方法③:把namenode对journalnode的容错次数或时间调成更大的值,保证能够对正常的启动延迟、网络延迟能容错。在hdfs-site.xml中修改ipc参数,namenode对journalnode检测的重试次数,默认为10次,每次1000ms,故网络情况差需要增加。具体修改信息为:
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish
a server connection.
</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for
before retrying to establish a server connection.
</description>
</property>
原文链接:link
4.在node-01上格式化ZKFC
这个命令必须自己敲出来不能复制
hdfs zkfc –formatZK
5.在node-01上启动hadfs
start-dfs.sh
6.在node-01上启动yarn
start-yarn.sh
一键启动 终止
start-dfs.sh start-yarn.sh
结果 3台均正常启动dfs 和yarn
如果有漏掉的机器没有启动
则可以用
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start secondarymanager
yarn-daemon.sh start nodemanager
在漏掉的机器上执行启动
一键终止 stop-dfs.sh stop-yarn.sh
通过UI查看hadoop集群
三台集群均成功通信展示在UI界面
在UI界面创建添加文件
解决办法:在linux系统中hadoop fs -chmod -R 777 /释放权限(实际生产应该不会让这样做)
Hadoop运行mapreduce 使用基础jar包统计词频
前提条件:
1.dfs、yarn已运行
2.在hadoop文件系统创建如下文件夹
3.在input目录下上传word.txt.txt文件
4.防火墙50070、8088、9000、50075端口放开
运行统计词频案例
在/export/servers/hadoop2.9.2/share/hadoop/mapreduce/目录下有一些简单例子的jar包如统计词频、计算Pi值等,下面演示一个词频统计进入到/export/servers/hadoop2.9.2/share/hadoop/mapreduce/目录下
hadoop jar hadoop-mapreduce-examples-2.9.2.jar wordcount /data/input/word.txt.txt /data/output/result
输出文件在hadoop文件系统的/data/output/result目录下
查看下输出结果
输出为各个词的词频
在网页端查看输出结果
需要防火前放开50075端口
Hadoop - JavaAPI (with IDEA in Windows)
Windows 安装hadoop
(hadoop-2.5.2.tar.gz解压到本地)
Windows配置hadoop环境变量
HADOOP_HOME
添加path
winutils工具包
解压下载的winutils,找到对应或邻近版本的Hadoop,进入其bin目录,将其中的hadoop.dll和winutils.exe拷贝到C:\Windows\System32目录创建maven project
配置pom.xml
配置core-site.xml、hdfs-site.xml、log4j.properties
将远程集群的Hadoop安装目录下hadoop/hadoop-2.7.7/etc/hadoop目录下的core-site.xml、hdfs-site.xml两个文件通过Xftp等SFTP文件传输软件将两个文件复制,并移动到上述src/main/resources目录中(拖拽即可),然后将下载的log4j.properties文件移动到src/main/resources目录中(防止不输出日志文件)
(可以直接从linux的/export/servers/hadoop-2.9.2/etc/hadoop下复制过来)编写java程序相应模块测试创建、上传读取文件
将连接属性前添加@before方法作为连接前提条件
创建、上传文件夹前添加@test方法连接测试
编写经典案例倒排索引(课本Mapreduce案例)
文件准备
首先在/data的目录下创建两个文件
在mfile里创建三个文件
编写java类文件
Mapper
Reducer
Combiner
Driver
结果
文档出现词和文档对应索引
HDFS的Checkpoint
Checkpoint(检查点):因为数据库系统或者像HDFS这样的分布式文件系统,对文件数据的修改不是直接写回到磁盘的,很多操作是先缓存到内存的Buffer中,当遇到一个检查点Checkpoint时,系统会强制将内存中的数据写回磁盘,当然此时才会记录日志,从而产生持久的修改状态。
在介绍Checkpoint之前,先来看看Namenode上面有些什么数据:
edits HDFS操作的日志记录,没此对HDFS进行修改操作后,都会往edits中记录一条日志;
fsimage HDFS中命名空间、数据块分布、文件属性等信息都存放在fsimage中;
edits是在每次修改HDFS时都会插入记录,那么fsimage则在整个HDFS运行期间不会产生变化,用HDFS官方文档的说法就是:NameNode merges fsimage and edits files only during start up。也就是说,只有在每次启动Namenode时,才会把edits中的操作增加到fsimage中,并且把edits清空。所以fsimage总是记录启动Namenode时的状态,而edits在每次启动时也是空的,它只记录本次启动后的操作日志。
为什么需要checkpoint?
按照fsimage和edits的工作机制,在一次启动后,edits的文件可能会增长到很大,这样在下次启动Namenode时需要花费很长时间来恢复;
另一方面,如果在HDFS运行过程中发生Namenode的故障,那么edits中的记录就会丢失。所以,我们需要利用Checkpoint即使将修改操作持久化。
checkpoint触发条件
在配置文件中的参数:
时间维度,默认一小时触发一次工作流程 dfs.namenode.checkpoint.period :3600
次数维度,默认100万次触发一次工作流程 dfs.namenode.checkpoint.txns : 1000000
大小维度,默认64M触发一次工作流程
fs.checkpoint.size:67108864。
也就说触发HDFS中Checkpoint的机制有三种,一是时间、次数和日志的大小
checkpoint做了什么
Chekpoint主要干的事情是,将Namenode中的edits和fsimage文件拷贝到Second Namenode上,然后将edits中的操作与fsimage文件merge以后形成一个新的fsimage,这样不仅完成了对现有Namenode数据的备份,而且还产生了持久化操作的fsimage。最后一步,Second Namenode需要把merge后的fsimage文件upload到Namenode上面,完成Namenode中fsimage的更新。
以上提到的文件都可以在hadoop系统的data目录下找到。
shared.edits.dir 日志文件位置设置
当集群为高可用集群时standbynamenode会读取该目录下edits文件并与fsimage合并为新的fsimage
<!--NAMENODE的元数据在journalnode的存放位置-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ha001:8485;ha002:8485;ha003:8485/ns1</value>
</property>
<!--指定journalnode在本地磁盘的存放位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/data/hadoop/journaldata</value>
</property>
fsimage fsimage文件位置
<!--元数据信息位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/export/data/hadoop/name</value>
</property>
利用副本机制故障还原
1.删掉Active NameNode的FSimage和Edits_Log模拟数据丢失
记录NN存储 和Edits_Log的路径
2.将Standby NameNode的FSimage和Edits_Log复制到NN的FSimage和Edits_Log对应的目录下
3.启动挂掉的NameNode
HDFS中的fsck命令(检查数据块是否健康)
查看文件目录的健康信息
hdfs fsck /weblog
查看文件中损坏的块 (-list-corruptfileblocks)
hdfs fsck /weblog -list-corruptfileblocks
损坏文件的处理
将损坏的文件移动至/lost+found目录 (-move)
hdfs fsck /user/hadoop-twq/cmd -move
删除有损坏数据块的文件 (-delete)
hdfs fsck /user/hadoop-twq/cmd -delete
打印文件的Block报告(-blocks)
执行下面的命令,可以查看一个指定文件的所有的Block详细信息,需要和-files一起使用:
hdfs fsck /user/hadoop-twq/cmd/big_file.txt -files -blocks
如果,我们在上面的命令再加上-locations的话,就是表示还需要打印每一个数据块的位置信息,如下:
hdfs haadmin 命令
-transitionToActive
#/bin/bash
#nn1 -> active
hdfs haadmin -transitionToActive -forcemanual nn1
#nn2 -> standby
hdfs haadmin -transitionToStandby -forcemanual nn1
-getServiceState
#/bin/bash
hdfs haadmin -getServiceState nn1
-checkHealth