大数据Hadoop(二)
NameNode的持久化(persistent)
NameNode在运行时,把重要的元数据放置在内存中,如果内存出现问题,则元数据丢失,为了保证元数据安全,NameNode有对应的持久化机制,把元数据持久化到硬盘存储。
- FSImage 和 EditsLog 存储位置
#FSImage默认存储位置 /opt/install/hadoop-2.5.2/data/tmp/dfs/name
dfs.namenode.name.dir
#editslog默认存储位置
dfs.namenode.edits.dir
- 定制FSImage 和 EditsLog 的存储位置
hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///xxx/xxxx</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///xxx/xxxx</value>
</property>
- 安全模式(safe mode)
每一次启动namenode时,hdfs都需要进行FSImage和EditsLog的整合,在这个过程中,不允许用户做写操作,把这个过程称之为安全模式(safe mode),默认30秒。
- safe mode相关命令
bin/hdfs dfsadmin -safemode [enter leave get]
- HDFS集群启动时,完整流程
HDFS集群启动 过程 (安全模式)
1. 整合 FSImage 和 EditsLog 生成新的EditsLog和FSImage,由新EditsLog接受用户写操作命令
2. DataNode都需要NameNode主动汇报健康情况(心跳) 3秒
3. 汇报块列表 通过校验和 检查块是否可用,并定期汇报 1小时
SecondaryNameNode【了解】
自定义SecondaryNameNode 拉取数据的周期
hdfs-site.xml
dfs.namenode.checkpoint.period 3600秒
dfs.namenode.checkpoint.txns 1000000
secondaryNameNode启动方式:sbin/start-dfs.sh
sbin/hadoop-daemon.sh start secondarynamenode
定制secondarynamenode 启动的节点
hdfs-site.xml
dfs.namenode.secondary.http-address 0.0.0.0:50090
dfs.namenode.secondary.https-address 0.0.0.0:50091
HANameNode集群
#HANameNode集群的搭建
1. zookeeper集群
1.1 解压缩
tar -zxvf zookeeper-xxx-tar.gz -C /opt/install
1.2 创建数据文件夹
mdkir zookeeper_home/data
1.3 conf目录修改zookeeper的配置文件
修改zoo_sample.cfg 为 zoo.cfg
mv zoo_sample.cfg zoo.cfg
编辑内容
dataDir=/opt/install/zookeeper-3.4.5/data
server.0=hadoop2:2888:3888
server.1=hadoop3:2888:3888
server.2=hadoop4:2888:3888
1.4 zookeeper_home/data
myid文件 0 hadoop2
myid文件 1 hadoop3
myid文件 2 hadoop4
1.5 scp -r 命令 同步集群中所有节点 并 修改对应的myid文件内容
1.6 主节点 ssh 其他节点
1.7 启动zk服务
bin/zkServer.sh start | stop | restart
bin/zkServer.sh status 查看集群状态 【必须集群完整启动完成】
bin/zkCli.sh [只能在leader执行]
2. HA-HDFS集群
删除 data/tmp
2.1 core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop2:2181,hadoop3:2181,hadoop4:2181</value>
</property>
2.2 hdfs-site.xml
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop2:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop2:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop3:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop3:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/install/hadoop-2.5.2/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
2.3 yarn-env.sh 添加如下内容
export JAVA_HOME=/usr/java/jdk1.7.0_71
2.4
首先启动各个节点的Zookeeper,在各个节点上执行以下命令:
bin/zkServer.sh start
在某一个namenode节点执行如下命令,创建命名空间
bin/hdfs zkfc -formatZK
在每个journalnode节点用如下命令启动journalnode
sbin/hadoop-daemon.sh start journalnode
在主namenode节点格式化namenode和journalnode目录
bin/hdfs namenode -format ns
在主namenode节点启动namenode进程
sbin/hadoop-daemon.sh start namenode
在备namenode节点执行第一行命令,这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了!然后用第二个命令启动备namenode进程!
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode
在两个namenode节点都执行以下命令
sbin/hadoop-daemon.sh start zkfc
在所有datanode节点都执行以下命令启动datanode
sbin/hadoop-daemon.sh start datanode
日常启停命令
sbin/start-dfs.sh
sbin/stop-dfs.sh
Hadoop源码编译:
apache官方网站上提供的二进制文件,是基于32位操作系统进行编译的,不适合于64位操作系统,需要自己编译。
- 源码编译过程
1. hadoop源码
2. maven linux版本
3. 安装相关依赖软件
1. jdk
2. maven 并设置 环境变量 (apache-maven-3.0.5-bin.tar.gz)
/etc/profile
MAVEN_HOME
M2_HOME
PATH
3. linux相关的软件
yum install wget
yum install autoconf automake libtool cmake
yum install ncurses-devel
yum install openssl-devel
yum install lzo-devel zlib-devel gcc gcc-c++
4. 安装protobuf
解压:
tar -zxvf protobuf-2.5.0.tar.gz
编译安装:
进入安装目录,进行配置,执行命令:
./configure
安装命令:
make
make check
make install
5. 安装findbugs
下载: findbugs-1.3.9.tar.gz
解压:
tar –zxvf findbugs-1.3.9.tar.gz
设置环境变量(/etc/profile):
export FINDBUGS_HOME=/opt/modules/findbugs-1.3.9
export PATH=$PATH:$ FINDBUGS_HOME/bin
执行命令:source /etc/profile
验证:findbugs -version
4. Hadoop源码编译
export MAVEN_OPTS="-Xms256m -Xmx512m"
mvn package -DskipTests -Pdist,native -Dtar 执行在Hadoop2.5.0的源码包中
5. 编译成功 hadoop_src_home/hadoop-dist/target
2. 出现问题
1. maven版本过高
2. 错误
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-hdfs-httpfs: An Ant BuildException has occured: exec returned: 2
[ERROR] around Ant part ...<exec dir="/home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target" executable="sh" failοnerrοr="true">... @ 10:134 in /home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/target/antrun/build-main.xml
[ERROR] -> [Help 1]
这是因为/home/pory/workplace/hadoop-2.4.1-src/hadoop-hdfs-project/hadoop-hdfs-httpfs/downloads目录下的文件没有下载完全,可以手动下一份匹配版本的文件放在下面,在http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.36/bin/
然后重新执行命令
- 编译完成后使用
需要应用64位hadoop替换32位hadoop /opt/install/hadoop-2.5.2/lib/native 的内容
# 替换一定在linux系统中直接替换
HDFS相关内容的总结
- 概念
- 编码
1. HDFS shell 命令
2. java API
Configuration
FileSystem
IOUtils
Path
MapReduce
- 什么是MapReduce
# 后续 Spark完成类似的工作
MapReduce是Hadoop体系下的一种计算模型(计算模型),主要功能是用于操作,处理HDFS上的大数据级数据。
- MapReduce的构建思想
- 启动yarn
1. 配置相关的配置文件 etc/hadoop
yarn-site.xml mapred-site.xml
2. 启动yarn
2.1 伪分布式
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
2.2 集群方式
mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定resourcemanager所对应的节点--> 【分布式环境新加】
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop12</value>
</property>
slaves
datanode 同时又是 nodemanager
同步集群的每一个节点
正常启动hdfs
namenode格式化
sbin/start-dfs.sh
集群的方式启动yarn
建议 namenode 不要和 resourcemanager放置在同一个点
# ssh相关的机器,避免yes
在集群环境下,yarn启动的命令,需要在resourcemanager所在的节点执行
sbin/start-yarn.sh
sbin/stop-yarn.sh
验证:
jps看进程
http://hadoop12:8088
- MapReduce程序开发结构
- MapReduce第一个程序分析
- MapReduce的第一个程序开发
1. 准备 HDFS中上传文件
suns sb
huxz xiaojr
liuh xiaowb
pom.xml
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-yarn-common</artifactId>
<version>2.5.2</version>
</dependency>
编码
# MapReduce编程中,一定会涉及到序列化的操作,基本进行了封装
String --- Text
int --- IntWritable
Long --- LongWritable
# 打成jar ,上传到yarn集群(resourcemanager)
bin/yarn jar hadoop-mr.jar