Hadoop 服务通常会在 HDFS 中查找 jar,因为集群中的所有节点都可以访问 HDFS 中的文件。如果由 Hadoop 服务(在本例中为 Sqoop)启动的 MapReduce 作业依赖于这些 jar,这一点很重要。请记住,映射器是在 DataNode 上运行的,而不是在 NameNode 上运行,即使您(可能)正在从 NameNode 运行 Sqoop 命令。将罐子放在 HDFS 上并不是解决这个问题的唯一可能解决方案,但它是一个明智的解决方案。
现在我们可以处理实际的错误。至少有一个,但可能是所有的 Mapper 都找不到他们需要的 jar。这意味着 jar 不存在或尝试访问它们的用户没有所需的权限。首先通过hadoop fs -ls home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
在集群上具有超级用户权限的用户运行来检查文件是否存在。如果它不存在,请将其与hadoop fs -put {jarLocationOn/NameNode/fileSystem/sqoop-1.4.3-cdh4.4.0.jar} /home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
. 我没有专门与 Cloudera 合作过,所以你必须自己在 NameNode 上追踪 jar 的位置。如果 Cloudera 与 Hortonworks 类似,那么偶尔会出现这样的问题,即集群部署脚本/文档会遗漏几个必要的步骤来让一切正常运行。
现在我们知道该文件存在,我们可以检查用户 SqoopUser 是否具有该文件的权限。再次,运行hadoop fs -ls home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
并查看文件权限。还要检查包含 jar 的目录的权限。解释 POSIX 文件权限超出了这个答案的范围,所以如果你不熟悉,你可能需要阅读这些。一个重要的注意事项是 HDFS 没有自己的组概念,它基于底层操作系统的组。只需确保 SqoopUser 可以读取 jar 并且所有父目录都可以由 SqoopUser 执行。不分青红皂白的用户chmod 777
将采取这一点,即hadoop fs -chmod 777 /home/SqoopUser/sqoop-1.4.3-cdh4.4.0/sqoop-1.4.3-cdh4.4.0.jar
。但是,如果您的环境需要,当然要更加了解您授予的权限。
如果您发现文件权限比您想要的更频繁地绊倒您,那么核选项是设置dfs.permissions
为false
in hdfs-site.xml
。这将允许所有用户访问 HDFS 上的所有文件。这对于快速开发可能非常有用,但留下来更安全dfs.permisssions
。