总结
配置文件位于etc/hadoop
下,主要配置以下环境
core-site.xml
1 | hdfs://master:9000 |
hdfs-site.xml
1 | dfs.replication |
mapred-site.xml
1 | mapreduce.framework.name |
yarn-site.xml
1 | mapreduce_shuffle # mapreduce中使用shuffle(洗牌) |
workers
1 | 写入作为slave的主机名称 |
hadoop:pill:
位于etc/hadoop-env.sh中的JAVA_HOME似乎应该需要配置绝对路径
使用hadoop3.2.1时,openjdk9似乎有问题,使用yarn时会报错声称
1 | 2019-10-04 16:21:59,566 INFO mapreduce.Job: Job job_1570176818335_0003 failed with state FAILED due to: |
换成openjdk8
1 | [2019-10-04 17:17:02.073]Container exited with a non-zero exit code 127. Error file: prelaunch.err. |
换成oracle jdk8
报错和openjdk8一致
只好强行在/bin/中写入文件连接
1 | ls -s /usr/bin/java /bin/java |
在另一台机器配置了host文件,将对应的域名指向127.0.0.1,发现竟然没有这个错误。
配置分布式后发现启动没有Namenode,resourcemanager,果断将/etc/hosts域名指向127.0.0.1,解决了这个问题,重新启动就正常了
发现不能用正常ip的原因竟然是腾讯云的网络问题,只能用私有地址,不能用他提供访问的公有地址,:cake: 而且文档强调不能指向127.0.0.1
重启会报错
1 | org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-ubuntu/dfs/name is in an inconsistent state |
有问答指出tmp会被清理
因此调整core-site.xml中对于tmp.dir设置
发现host配置错误会卡在resourcesmanager上,本机名字对应的ip一定要是127.0.0.1放在第一位
否则报错
1 | INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 |
直接在master节点执行命令发现报错,
1 | -bash: bin/dfs: No such file or directory |
slave节点未完整配置$HADOOP_HOME和$path,一股脑全都加了进去,bin/hdfs就可以找到了。
配置分布式后始终不能连接,logs中datanode显示无法连接master,master对应9000端口为127.0.0.1:9000显然不能访问,尝试多次后将core-site.xml中的域名直接改为对应ip,将slave对应的host文件改成对应iP即可,同时telnet也可以成功连接上master。
但是新的问题是腾讯云提供了两个ip,使用master公网ip根本无法连通,datanode.log中显示一直在retry,telnet也无法成功,似乎是腾讯云有某种过滤机制。
使用私有地址的ip,telnet可以成功,但是新的报错出现
1 | Datanode denied communication with namenode because hostname cannot be resolved |
发现了两种解决方案,其中详细代码解释很棒,stackoverflow也有人提出相关问题
最后采用在master和slave上的core-site中加入
1
2
3
4<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
slave和master成功通信
启动sbin/start-yarn.sh,出现和之前类似的报错
1 | Connecting to ResourceManager at vm25/172.21.101.13:8031 |
netstat看了master上的端口,发现又在27.0.0.1上启动了,直接改了yarn-site.xml中对应的resourcemanager的值
1 | <value>0.0.0.0<value> |
slave和master的resourcemanager通信成功,然而再次出现错误,对应代码
slave上报错
1 | org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl: couldn't find application application_1570428476013_0001 while processing FINISH_APPS event. The ResourceManager allocated resources |
master上报错
1 | Application application_1570428476013_0001 failed 2 times due to Error launching appattempt_1570428476013_0001_000002. |
slave的网络
1 | tcp 0 0 0.0.0.0:8042 0.0.0.0:* LISTEN 12711/java |
master的网络
1 | tcp 0 0 0.0.0.0:9868 0.0.0.0:* LISTEN 31184/java |
最后发现是配置文件问题,在链接处指出host文件配置问题,而且由于腾讯云内部网络,只能用私有地址作为host文件内部各主机ip,公有ip是无法使得程序运行,之前所有的问题都是因为这个ip原因