(一) Mac下安装Hadoop与遇到的一系列问题

一、 安装过程


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那一步输出了很长一堆信息, 就不放出来了):
example.png

二、遇到的问题

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), 这篇博客提供了两种方法:

      1. 自从jdk9以后, java9默认禁用访问许多javax. * API, 所以用java10会不兼容。更换jdk8即可.
      1. 修改$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等文本编辑器.

成功

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实现的功能组件库,

解决办法

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查看信息, 输出如下:
report.png
  • 看起来跟这篇博客的问题是一模一样的, 如博客中所说是因为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的解释. 下图是部分截图:
hadoop-docs.png

关于这个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没有打开, 只是扫了一眼发现好像进程都在正常运行. 附上完整的进程列表与不完整的进程列表:
    完整的进程列表
不完整的进程列表
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容