PIG脚本引用HDFS中foo.py报错ERROR 2997求助
解决Pig无法读取HDFS中Jython UDF文件的问题
我之前也踩过这个坑——Pig默认会从本地文件系统查找register命令里指定的脚本,哪怕你写了HDFS路径也直接忽略,这就是为啥你改路径、调权限都没用。下面给你几个不用复制文件到本地的可行方案:
方案1:用ADD命令将HDFS文件加入分布式缓存
这是最通用且可靠的方法,Hadoop会自动把HDFS里的文件同步到所有任务节点的本地缓存,Pig就能轻松找到它:
# 先把HDFS根目录的foo.py加到分布式缓存 ADD hdfs:///foo.py; # 再注册UDF,此时直接写文件名即可 register 'foo.py' USING jython as foo;
注意:
hdfs:///foo.py是HDFS根目录文件的标准写法(三个斜杠:协议// + 根目录/),如果你的集群有指定namenode地址和端口,也可以写成hdfs://your_namenode_host:port/foo.py。
方案2:指定完整的HDFS URI注册(部分集群适用)
有些环境下,你可以直接在register命令里写完整的HDFS路径,但必须包含namenode的地址和端口,比如:
register 'hdfs://namenode.example.com:8020/foo.py' USING jython as foo;
这个方法的前提是Pig客户端能正确解析namenode的地址,如果你不确定namenode地址,可以查看集群的core-site.xml里的fs.defaultFS配置项。
额外注意事项
- 权限检查:除了文件本身的
rwxrwxrwx权限,还要确保运行Pig作业的用户拥有HDFS根目录的读权限,可以用hdfs dfs -ls /验证是否能看到foo.py。 - Kerberos集群:如果你的集群开启了Kerberos认证,需要先通过
kinit获取认证票据,否则Pig无法访问HDFS文件。 - Hortonworks UDF页签注册:如果你在页面注册了UDF,要确保脚本里没有重复的
register命令覆盖配置,同时页面里填写的HDFS路径必须完整且正确。
内容的提问来源于stack exchange,提问作者Knows Not Much
相关产品推荐
相关产品推荐

