访问hdfs客户端应用程序代码:
/**
* Configuration参数对象的机制:
* 构建时,会加载jar包中的默认配置xxx-default.xml
* 再加载用户配置xxx-site.xml,可以覆盖掉默认参数
* 构造完成之后,还可以conf.set("p","v");会覆盖用户配置文件中的参数。
*/
//new Confifguration()会从项目classpath中加载core-default.xml,hdfs-default.xml,core-site.xml,hdfs-site.xml
Configuration conf = new Configuration();
//指定客户端文件需要传输到hdfs上时,保存的副本数为2
conf.set("dfs.replication","2");
//指定客户端文件传输到hdfs时,切块的大小为64M
conf.set("dfs.blocksize", "64M");
//构造一个访问指定HDFS系统的客户端对象:参数1-HDFS系统的URI,参数2-客户端要特别指定的参数,参数3-客户端的身份
FileSystem fs = FileSystem.get(new URI("hdfs://master:9000/"), conf, "root");
//上传一个文件到HDFS中
fs.copyFromLocalFile(new Path("D:\\downloads\\jdk-7u25-linux-x86_64.tar.gz"), new Path("/jdk2"));
步驟:
1、将hdfs客户端开发所需的jar导入工程(jar包可在hadoop安装包中找到common/hdfs)
2、写代码
要点:要对hdfs中的文件进行操作,代码中首先需要获得一个hdfs的客户端对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hdp-01:9000"),conf,"root");
3、利用fs对象的方法进行文件操作
比如:
上传文件—— fs.copyFromLocalFile(new Path("本地路径"),new Path("hdfs的路径"));
下载文件——fs.copyToLocalFile(new Path("hdfs的路径"),new Path("本地路径"))
namenode元数据管理机制示意图--checkpoint
客户端写数据到HDFS的流程
客户端从HDFS中读数据的流程
namenode元数据管理要点
1、什么是元数据?
hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>)
2、元数据由谁负责管理?
namenode
3、namenode把元数据记录在哪里?
namenode的实时的完整的元数据存储在内存中;namenode还会在磁盘中(dfs.namenode.name.dir)存储内存元数据在某个时间点上的镜像文件;namenode会把引起元数据变化的客户端操作记录在edits日志文件中;
secondarynamenode会定期从namenode上下载fsimage镜像和新生成的edits日志,然后加载fsimage镜像到内存中,然后顺序解析edits文件,对内存中的元数据对象进行修改(整合) 整合完成后,将内存元数据序列化成一个新的fsimage,并将这个fsimage镜像文件上传给namenode |
上述过程叫做:checkpoint操作 提示:secondary namenode每次做checkpoint操作时,都需要从namenode上下载上次的fsimage镜像文件吗? 第一次checkpoint需要下载,以后就不用下载了,因为自己的机器上就已经有了。 |
补充:secondary namenode启动位置的配置(把默认值改成你想要的机器主机名即可)
#默认值 <property> <name>dfs.namenode.secondary.http-address</name> <value>0.0.0.0:50090</value> </property> |
secondarynamenode保存元数据文件的目录配置:(改成自己想要的路径即可:/root/dfs/namesecondary)
#默认值 <property> <name>dfs.namenode.checkpoint.dir</name> <value>file://${hadoop.tmp.dir}/dfs/namesecondary</value> </property> |
MapReduce
mapreduce程序应该是在很多机器上并行启动,而且先执行map task,当众多的maptask都处理完自己的数据后,还需要启动众多的reduce task,这个过程如果用用户自己手动调度不太现实,需要一个自动化的调度平台——hadoop中就为运行mapreduce之类的分布式运算程序开发了一个自动化调度平台——YARN
安装yarn集群
yarn集群中有两个角色:
主节点:Resource Manager 1台
从节点:Node Manager N台
Resource Manager一般安装在一台专门的机器上,Node Manager应该与HDFS中的data node重叠在一起
修改配置文件:
yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hdp-04</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
然后复制到每一台机器上
启动yarn集群:sbin/start-yarn.sh
停止:sbin/stop-yarn.sh
启动完成后,可以在windows上用浏览器访问resourcemanager的web端口:
看resource mananger是否认出了所有的node manager节点
运行MapReduce程序
1,为你的mapreduce程序开发一个提交job到yarn的客户端类(模板代码):
注意: 描述你的mapreduce程序运行时所需要的一些信息(比如用哪个mapper、reducer、map和reduce输出的kv类型、jar包所在路径、reduce task的数量、输入输出数据的路径);将信息和整个工程的jar包一起交给yarn
2,将整个工程(yarn客户端类+ mapreduce所有jar和自定义类)打成jar包
3,将jar包上传到hadoop集群中的任意一台机器上
4,运行jar包中的(YARN客户端类)