HOST | NN | JN | DN | ZKFC | ZK | RM | NM |
---|---|---|---|---|---|---|---|
tongyuzhe1 | * | * | * | ||||
tongyuzhe2 | * | * | * | * | * | * | |
tongyuzhe3 | * | * | * | * | * | ||
tongyuzhe4 | * | * | * | * |
DN和NM时一一对应的
YARN和HDFS没有启动先后关系
mapreduce on yarn
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>tongyuzhe2:2181,tongyuzhe3:2181,tongyuzhe4:2181value>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>maprecude1value>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>tongyuzhe3value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>tongyuzhe4value>
property>
因为要向前兼容,没有过多的改NN,通过新增了角色 zkfc
1.因为是新增角色,是直接在RM进程中增加了HA的模块,不需要向前兼容,没有历史遗留问题。
2.所以还是Yarn方式好,不需要考虑单独ZKFC进程挂掉的情况。
3.全都放在一个进程里,要活一起活,要死一起死。
cd $HADOOP_HOME/etc/hadoop
# 得到mapred-site.xml文件
cp mapred-site.xml.template mapred-site.xml
scp mapred-site.xml yarn-site.xml tongyuzhe2:`pwd`
scp mapred-site.xml yarn-site.xml tongyuzhe3:`pwd`
scp mapred-site.xml yarn-site.xml tongyuzhe4:`pwd`
#可以不用管,搭建hdfs时候已经改过了
vi slaves
#启动Yarn
start-yarn.sh
#启动resourcemanager
yarn-daemon.sh start resourcemanager
#访问Yarn节点
http://tongyuzhe3:8088
http://tongyuzhe4:8088
#创建输入文件夹
hdfs dfs -mkdir -p /data/wc/input
#生成文件
for i in `seq 100000`;do echo "hello mbs $i" >> data.txt;done
#上传文件,并将块大小设置为1048576B
hdfs dfs -D dfs.blocksize=1048576 -put data.txt /data/wc/input
cd $HADOOP_HOME
#mapreduce程序文件夹
cd share/hadoop/mapreduce
#运行MR程序
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/wc/input /data/wc/output
#结果
_SUCCESS #标志成功的文件
#数据文件
part-r-00000 r:reduce文件
part-m-00000 m:map文件
#打包
Maven-->Lifecycle-->clean
#运行MR
hadoop jar BigData-1.0-0.1.jar work.tongyuzhe.mapreduce.MyWordCount
#Idea下载源码文档
Maven-->下载箭头-->Download S.. and D..
#自动整理代码格式
Code-->Reformat Code
存储层将字符串切割问题都处理好了,不需要我们关心,技术发展是越来越易与人使用的
#在win下部署hadoop,此版本为2.6.5
1.解压hadoop-2.6.5.tar.gz至C:\Program Personal\
2.将soft\bin的win文件覆盖至上一步C:\Program Personal\hadoop-2.6.5\bin目录下
3.将刚才覆盖bin目录下的hadoop.dll,复制到c:\windwos\system32\
4.配置环境变量HADOOP_HOME C:\Program Personal\hadoop-2.6.5
#修改mapred-site.xml为集群模式
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
#或是覆盖,修改Yarn为本地模式
#写在Configuration conf下方
conf.set("mapreduce.framework.name","local");
#让框架知道是windows异构平台
conf.set("mapreduce.app-submission.cross-platform","true");
#上传Jar包的位置
#写在Job.getInstance(conf)下方
job.setJar("C:\\Program Personal\\IntelliJ IDEA 2020.1\\Projects\\BigData\\target\\BigData-1.0-0.1.jar");
#获取xml中mapreduce.framework.name属性
conf.get("mapreduce.framework.name")
main(String[] args)中的args可以添加参数
例如hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/wc/input /data/wc/output
里面后接的参数,都是要依赖args接受
在程序里我们也可以取到
// 工具类帮我们把-D 等等的属性直接set到conf,会留下commandOptions
GenericOptionsParser parser = new GenericOptionsParser(conf, args);
//othargs[0]:输入目录
//othargs[1]:输出目录
String[] othargs = parser.getRemainingArgs();
有两类参数,一类带 -D,一类不带
带 -D的是系统参数,例如上传块切割大小
不带的是自定义参数,例如输入输出目录
例如:#上传文件,并将块大小设置为1048576B
hdfs dfs -D dfs.blocksize=1048576 -put data.txt /data/wc/input
例如:
//设置Reduce并行度
job.setNumReduceTasks(2);
通过Ctrl进入源代码会发现"mapreduce.job.reduces"
这样我们就可以设置-D的系统参数
-D mapreduce.job.reduces=2 /data/wc/input /data/wc/output
通过GenericOptionsParser(conf, args);会自动将参数赋值
所以我们甚至可以只写配置文件读取加载,网页控制配置参数
每次提交更改系统参数建议重新打Jar包
参数在:点编译锤子右面项目,Edit Configurations,Program arguments。填写