我是猪的新手,我在java中编写了一个udf并且我已经包含了一个
System.out.println
声明中。我必须知道在猪身上跑步时这个陈述的印刷地点。
答案 0 :(得分:6)
假设您的 UDF扩展了EvalFunc ,您可以使用从 EvalFunc.getLogger()返回的记录器。日志输出应该在pig执行的相关Map / Reduce任务中可见(如果作业在多个阶段中执行,那么您必须通过它们来查找相关的日志条目)。
日志将最终出现在Map Reduce Task日志文件中。我建议在部署到集群之前以本地模式调试UDF,以便您可以像IDE一样从IDE调试它。
默认情况下,错误(例如:脚本解析错误)会记录到pig.logfile中,该文件可以在$ PIG_HOME / conf / pig.properties中设置。如果您还想记录状态消息,请准备一个有效的log4j.properties文件并将其设置在log4jconf属性中。
当使用Pig v0.10.0(r1328203)时,我发现成功的生猪任务没有将作业的历史日志写入hdfs的输出目录。 (hadoop.job.history.user.location = $ {mapred.output.dir} / _日志/历史/)
如果您想通过各种方式获得这些历史记录,请以这种方式在您的猪脚本中设置mapred.output.dir:
设置mapred.output.dir' / user / hadoop / test / output';
注意: Pig使用apache的log4j模块进行日志记录。但是,弄清楚为什么你不能使用log4j会令人望而生畏。有猪的属性,有时您可能会使用自定义根记录器获得NPE。
Pig有一个命令行选项-4(是的,非常不像人们可以将它与log4j联系起来)与log4j一起使用。
以下是示例log4j.properties示例的示例用法。
选项-l用于命名日志文件t
pig -l /tmp/some.pig.log -4 log4j.properties -x local mysample.pig(script)
cat log4j.properties
# Root logger option
log4j.rootLogger=INFO, file, F
# Direct log messages to a log file
log4j.logger.org.apache.pig=DEBUG
log4j.logger.org.apache.hadoop=INFO
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${pig.logfile}
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] (%F:%L) - %m%n
#another example line below for a different format of output log line
# log4j.appender.file.layout.ConversionPattern="%d [%t] %-5p %c - %m%n"
上述pig命令的输出以典型的apache log4j格式存储在文件/tmp/some.pig.log中。
请查看apache log4j文档,了解日志中不同的Appender,控制台及其各自的格式输出。或者,如果您正在寻找特定格式或重定向选项,请告诉我。
答案 1 :(得分:1)
如果你在一台机器上运行猪,说你的本地计算机,那么System.out.println日志将全部显示在终端上打印的所有东西但是如果猪脚本在集群上运行那么你就看不到了打印消息。 Bizzarreee ......嗯..
如果你认为每个任务都在一个单独的机器上运行,那么打印消息就在集群上的单个机器上,因此你不会在你的机器上看到它。
现在解决方法是什么,这个过程对我来说有点乏味。
The url to track the job: http://ip-172-31-29-193.us-west-2.compute.internal:20888/proxy/application_1443585172695_0019/
在浏览器中打开它,当你尝试打开它时,它将无法打开,因为ip是本地的。假设您正在使用EMR群集然后公开它 就我而言,它是
Master public DNS:ec2-52-89-98-140.us-west-2.compute.amazonaws.com
现在替换上面网址中的公共IP,将其更改为
ec2-52-89-98-140.us-west-2.compute.amazonaws.com:20888/proxy/application_1443585172695_0019/
执行此操作后,您会注意到网址已更改
某些私有IP然后是作业历史记录服务器
http://ip-172-31-29-193.us-west-2.compute.internal:19888/jobhistory/job/job_1443585172695_0019/
再次替换私人IP
ec2-52-89-98-140.us-west-2.compute.amazonaws.com:19888/jobhistory/job/job_1443585172695_0019/
现在确定您的任务(调用UDF的点)是在mapper还是reducer阶段(groupby之前或之后)执行,然后单击链接
现在转到日志所在的终端。并找到计算变量的步骤并从那里获取jobid
现在,在上一步中,假设您的变量位于减少相位点击,您将获得类似于的屏幕。从我的案例中获取172-31-28-99
的私有IP。
现在转到EMR页面
点击硬件实例并点击查看EC2实例
你会得到类似于
的东西 。现在获取对应于私有IP的公共IP,在我的情况下是52.25.196.219
现在打开网址publicip:8042
即52.25.196.219:8042
以获得与类似的内容。单击左侧的工具,然后单击本地日志。
几乎在那里再等一会儿。
现在你会得到另一个页面nagivate
点击容器 - >你的工作ID(我们在图片2中找到)(在我的情况下是application_1443585172695_0021 / 4096字节2015年9月30日上午5:28:53)--->然后会有许多文件以容器作为前缀,打开一个,你会发现stdout目录打开它以查看system.out.println消息。
那么你有你的日志。唷。这是一些麻烦的工作。做几次,你会成为专业人士。
要记住的事情 1)在本地计算机上测试UDF 2)学习单元测试用例有助于调试
以上2件事将节省查找日志的所有麻烦
有一种方法可以找到实际的容器编号但是我忘了,如果有人知道请告诉我。
PS:如果答案太长,我很抱歉。想解释它,并原谅我的英语。
答案 2 :(得分:0)
如果您在pig脚本中注册并使用此UDF,那么输出将存储在诸如stdoutlogs之类的pig日志文件中。