一、 安装过程
- 安装环境: MacOS Mojave Version 10.14.3
- 安装教程: Mac OS X EI Captain 安装 Hadoop 3.0.0-alpha2
- 安装好之后, 在命令行中输入以下命令进行测试:
cd $HADOOP_HOME # 进入HADOOP_HOME目录
hdfs namenode -format # 格式化 NameNode
start-dfs.sh # 启动 Namenode 与 DataNode
start-yarn.sh # 启动 NodeManager 与 ResourceManager
# start your task
stop-all.sh # Stopping all Apache Hadoop daemon
- 运行截图(格式化NameNode那一步输出了很长一堆信息, 就不放出来了):
- 正常来说这时候 http://localhost:9870 与 http://localhost:8088应该都能访问了. 访问界面截图下面有.
二、遇到的问题
1. http://localhost:9870能正常连接, 但http://localhost:8088无法连接
解释
- 8088端口运行的是resourcemanager, 这个问题说明在执行
start-yarn.sh
时, resourcemanager没有正常打开.
解决方法
- 首先进入hadoop的日志文件夹, 并打开相关日志:
cd $HADOOP_HOME/logs
tail -500 hadoop-katsura-resourcemanager-katsura.local.log
- 查看错误:
...
...
2019-03-05 22:46:40,805 FATAL org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error starting ResourceManager
org.apache.hadoop.yarn.webapp.WebAppException: Error starting http server
at org.apache.hadoop.yarn.webapp.WebApps$Builder.start(WebApps.java:443)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.startWepApp(ResourceManager.java:1189)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.serviceStart(ResourceManager.java:1298)
at org.apache.hadoop.service.AbstractService.start(AbstractService.java:194)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.main(ResourceManager.java:1493)
Caused by: java.io.IOException: Unable to initialize WebAppContext
at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:1156)
at org.apache.hadoop.yarn.webapp.WebApps$Builder.start(WebApps.java:439)
... 4 more
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:
1) Error injecting constructor, java.lang.NoClassDefFoundError: javax/activation/DataSource
at org.apache.hadoop.yarn.server.resourcemanager.webapp.JAXBContextResolver.<init>(JAXBContextResolver.java:41)
at org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebApp.setup(RMWebApp.java:54)
while locating org.apache.hadoop.yarn.server.resourcemanager.webapp.JAXBContextResolver
1 error
at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051)
at com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory$GuiceInstantiatedComponentProvider.getInstance(GuiceComponentProviderFactory.java:345)
at com.sun.jersey.core.spi.component.ioc.IoCProviderFactory$ManagedSingleton.<init>(IoCProviderFactory.java:202)
at com.sun.jersey.core.spi.component.ioc.IoCProviderFactory.wrap(IoCProviderFactory.java:123)
at com.sun.jersey.core.spi.component.ioc.IoCProviderFactory._getComponentProvider(IoCProviderFactory.java:116)
at com.sun.jersey.core.spi.component.ProviderFactory.getComponentProvider(ProviderFactory.java:153)
at com.sun.jersey.core.spi.component.ProviderServices.getComponent(ProviderServices.java:278)
...
...
-
然后百度了一圈, 终于找到了解决办法: Hadoop3 yarn无法启动 (resourceManager/nodeManager), 这篇博客提供了两种方法:
- 自从jdk9以后, java9默认禁用访问许多javax. * API, 所以用java10会不兼容。更换jdk8即可.
- 修改$HADOOP_HOME/etc/hadoop/yarn-env.sh, 在该文件里加上两句:
export YARN_RESOURCEMANAGER_OPTS="--add-modules=ALL-SYSTEM" export YARN_NODEMANAGER_OPTS="--add-modules=ALL-SYSTEM"
这里因为更换java8太麻烦, 为了图省事我就直接用第二种方法了. 修改yarn-env.sh文件可以通过vim也可以通过sublime等文本编辑器.
成功
-
打开http://localhost:9870, 能看到以下画面:
NameNode.png -
打开http://localhost:8088, 能看到以下画面:
AllApp.png
2. 每次运行start-dfs.sh
都会报warning:
WARN util.NativeCodeLoader:
Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable
解释
- 这条WARN是说缺少Hadoop本地库. Hadoop本地库是为了提高效率或者某些不能用Java实现的功能组件库,
解决办法
- 参考这篇博客: Mac OSX 下 Hadoop 使用本地库提高效率
- 解决起来挺麻烦的, 这里暂时不管它, 等以后再说.
3. 往hdfs上传文件时出现错误
- 当我用下面的命令上传文件时:
hdfs dfs -put test.txt /usr/katsura
出现错误:
2019-03-07 18:52:31,688 WARN hdfs.DataStreamer: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /usr/katsura/test.txt.COPYING could only be written to 0 of the 1 minReplication nodes. There are 0 datanode(s) running and no node(s) are excluded in this operation.
解决过程
- 参考这篇博客
- 用
hadoop dfsadmin -report
查看信息, 输出如下:
- 看起来跟这篇博客的问题是一模一样的, 如博客中所说是因为
hdfs namenode -format
太多次导致的, 这就需要把hdfs的data目录里面的数据全部删掉. data目录的位置是我们在core-site.xml中配置的hadoop.tmp.dir属性对应的值, 不记得的话可以用vim $HADOOP_HOME/etc/hadoop/core-site.xml
查看. 如果core-site.xml中没有配置hadoop.tmp.dir属性, 则hadoop会把数据文件放在默认的位置, 请参考Hadoop官方文档关于core-site.xml的解释. 下图是部分截图:
关于这个data目录, 其实就是hdfs文件系统在我们的电脑硬盘里面实际的存储位置. 但是这个文件系统格式跟我们自己电脑的格式不一样, 所以我们不能在explorer(windows)或finder(macOS)中把文件直接拷进去, 而要使用
hdfs dfs -put [source file] [target path]
命令上传上去.
解决方案
stop-all.sh
# rm -rf是很危险的指令, 使用这条命令之前一定要看清楚目录输入是否正确(最好备个份防止删错)
rm -rf /tmp/hadoop-katsura
hdfs namenode -format
start-dfs.sh
start-yarn.sh
- 如果报错说stop-all.sh、hdfs等找不到, 那是因为你没有把
$HADOOP_HOME/bin
与$HADOOP_HOME/sbin
加入PATH环境变量. 关于环境变量怎么添加, 网上有一大堆教程, 这里就不多说了.
4. 连接不上hdfs
- 当用
hdfs dfs -ls /
查看hdfs文件系统的目录时, 出现以下错误:
ls: Call From katsura.local/192.168.43.78 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
- 这个问题可能由多种原因造成. 一开始我以为是host的原因, 跟着教程改了host之后发现并没有什么用. 后来我用jps仔细查看了一下, 发现NameNode这个进程不知道为什么没有打开...重新执行了一遍
start-dfs.sh
后解决了问题. 这里哭笑不得的是第一次jps查看的时候我都没发现NameNode没有打开, 只是扫了一眼发现好像进程都在正常运行. 附上完整的进程列表与不完整的进程列表:
完整的进程列表