大数据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