您的位置:首页 > 编程语言 > Java开发

Hadoop源码下载及Eclipse导入后常见问题解决

2017-03-22 10:33 537 查看
部分内容转载自:Eclipse导入Hadoop源码

-----------------这里开始是转载内容-------------------------------------------

1. 安装环境介绍如下:

系统:Ubuntu14.04
Hadoop版本:hadoop-2.5.0(点击下载)
Java版本:openjdk-1.7.0_55
Eclipse版本:Release 4.4.0 (点击下载)
2. 把下载Hadoop源码包 hadoop-2.5.0-src.tar.gz 解压到工作目录(本文为/home/baisong),
得到 hadoop-2.5.0-src 文件夹。
3. 安装Maven,命令如下:
$ sudo apt-get install maven
4. 安装Google开源的序列化框架 Protocol Buffers。
1) 下载 protobuf-2.5.0.tar.gz(点击下载),然后解压得到 protobuf-2.5.0 文件夹。
2) 进入protobuf-2.5.0,输入下属命令:
$ ./configure
遇到如下错误:



分析:此属于Ubuntu的常见错误,可以把常用的库全部下载,命令如下:
$ sudo apt-get install build-essential
然后再输入 $ ./configure 命令即可。
3) 顺序执行下面三个命令。 
$ make
$ make check
$ sudo make install
4) 查看Protocol版本号,检查是否安装成功。
$ protoc --version
遇到如下错误,如下: 



分析知是因为系统找不到lib库,修改 /etc/ld.so.conf 文件,添加 /usr/local/lib 。如下:
$ sudo gedit /etc/ld.so.conf
内容:include /etc/ld.so.conf.d/*.conf /usr/local/lib
执行下述命令更新库文件路径,然后就能通过 $ protoc --version 命令查看版本号。
$ sudo ldconfig



5. 编译Hadoop源码生成Jar包,无需编译native code、测试用例和生成文档,在/home/baisong/adoop-2.5.0-src目录下,输入下述命令:
$ mvn package -Pdist -DskipTests -Dtar
编译成功后,输出信息如下:



6. 生成Eclipse工程文件,命令如下:
$ cd hadoop-maven-plugins 
$ mvn install
$ cd hadoop-2.5.0-src
$ mvn eclipse:eclipse -DskipTests
成功后的输出信息如下图:



7. 在Eclipse中导入源代码:”File“ >> "Import" >> "Existing Projects into Workspace",选择hadoop-2.5.0-src,然后确认。


 
如上图所示,导入后遇到错误,共有59个错误,但总体上分为3类。解决方法如下:
错误1: org.apache.hadoop.ipc.protobuf.× 无法解析
解决方法如下,依次执行下述命令。
$ cd hadoop-2.5.0-src/hadoop-common-project/hadoop-common/src/test/proto //注释:进入该目录
$ protoc --java_out=../java *.proto
最后,刷新Eclipse中的所有工程。至此,只剩下 6 个错误。
错误2:AvroRecord cannot be resolved to a type TestAvroSerialization.java
解决方法如下:
首先,下载 avro-tools-1.7.4.jar(点此下载avro-tools)。存放于 hadoop-2.5.0-src
目录中。
然后执行下述命令:
$ cd hadoop-2.5.0-src/hadoop-common-project/hadoop-common/src/test/avro
$ java -jar ~/hadoop-2.5.0-src/avro-tools-1.7.4.jar compile schema avroRecord.avsc ../java
最后,刷新Eclipse工程。只剩下 3个错误。
错误3: Project 'hadoop-streaming' is missing required source ... Build Path Problem
解决方法如下:
右键 hadoop-streaming 项目->properties->左边Java Build Path->Source->选定错误项->右边Remove,如下图所示。



至此,在Eclipse中创建Hadoop工程完成。

-------------这里开始是本人的操作情况记录------------------------------------------------

本人使用的是ubuntu16.0.4,Hadoop2.7.3,JDK1.8.0_111。是通过Linux下载的源码。

如果是在Linux环境下的Eclipse中导入源码。也会遇到以上几个问题。

如果是在Windows环境下导入源码,每个工程还会提示什么tools.jar缺失,只需要在Build Path中选择Libraries项将tools.jar移除掉,然后添加本地的$JAVA_HOME/lib/tools.jar即可。

另外,在执行java -jar ~/hadoop-2.5.0-src/avro-tools-1.7.4.jar compile schema avroRecord.avsc ../java这行代码的时候,如果jar包不是用的avro-tools-1.7.4.jar(比如说用的是avro-tools-1.8.1.jar),则可能会报如下的错误:

Input files to compile:

  avroRecord.avsc

log4j:WARN No appenders could be found for logger (AvroVelocityLogChute).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

网上对于此错误的解决方法大多说的是在src目录下新建一个log4j.properties文件,然后加入如下内容:

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender

log4j.appender.logfile.File=target/spring.log

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

但是我试了这种方法,还是会报错。

本人用的另一种解决方法,由于我下载了avro-tools-1.8.1.jar,结果报了上面的错误,也用了上面的方法,但是还是有问题。后来发现1.8.1.jar中没有log4j.properties,但是

1.7.4.jar包中有log4j.properties文件。于是我将log4j.properties拷贝到了1.8.1.jar当中。执行命令成功了。

完整的log4j.properties内容如下:

# Define some default values that can be overridden by system properties
hadoop.root.logger=INFO,console
hadoop.log.dir=.
hadoop.log.file=hadoop.log

#
# Job Summary Appender
#
# Use following logger to send summary to separate file defined by
# hadoop.mapreduce.jobsummary.log.file rolled daily:
# hadoop.mapreduce.jobsummary.logger=INFO,JSA
#
hadoop.mapreduce.jobsummary.logger=${hadoop.root.logger}
hadoop.mapreduce.jobsummary.log.file=hadoop-mapreduce.jobsummary.log

# Define the root logger to the system property "hadoop.root.logger".
log4j.rootLogger=${hadoop.root.logger}, EventCounter

# Logging Threshold
log4j.threshhold=ALL

#
# Daily Rolling File Appender
#

log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}

# Rollver at midnight
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

# 30-day backup
#log4j.appender.DRFA.MaxBackupIndex=30
log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout

# Pattern format: Date LogLevel LoggerName LogMessage
log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
# Debugging Pattern format
#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n

#
# console
# Add "console" to rootlogger above if you want to use this
#

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

#
# TaskLog Appender
#

#Default values
hadoop.tasklog.taskid=null
hadoop.tasklog.iscleanup=false
hadoop.tasklog.noKeepSplits=4
hadoop.tasklog.totalLogFileSize=100
hadoop.tasklog.purgeLogSplits=true
hadoop.tasklog.logsRetainHours=12

log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender
log4j.appender.TLA.taskId=${hadoop.tasklog.taskid}
log4j.appender.TLA.isCleanup=${hadoop.tasklog.iscleanup}
log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize}

log4j.appender.TLA.layout=org.apache.log4j.PatternLayout
log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n

#
#Security audit appender
#
hadoop.security.log.file=SecurityAuth.audit
log4j.appender.DRFAS=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFAS.File=${hadoop.log.dir}/${hadoop.security.log.file}

log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout
log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
#new logger
log4j.logger.SecurityLogger=OFF,console
log4j.logger.SecurityLogger.additivity=false

#
# Rolling File Appender
#

#log4j.appender.RFA=org.apache.log4j.RollingFileAppender
#log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}

# Logfile size and and 30-day backups
#log4j.appender.RFA.MaxFileSize=1MB
#log4j.appender.RFA.MaxBackupIndex=30

#log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} - %m%n
#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n

#
# FSNamesystem Audit logging
# All audit events are logged at INFO level
#
log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=WARN

# Custom Logging levels

hadoop.metrics.log.level=INFO
#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG
#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
log4j.logger.org.apache.hadoop.metrics2=${hadoop.metrics.log.level}

# Jets3t library
log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR

#
# Null Appender
# Trap security logger on the hadoop client side
#
log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender

#
# Event Counter Appender
# Sends counts of logging messages at different severity levels to Hadoop Metrics.
#
log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter

#
# Job Summary Appender
#
log4j.appender.JSA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.JSA.File=${hadoop.log.dir}/${hadoop.mapreduce.jobsummary.log.file}
log4j.appender.JSA.layout=org.apache.log4j.PatternLayout
log4j.appender.JSA.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
log4j.appender.JSA.DatePattern=.yyyy-MM-dd
log4j.logger.org.apache.hadoop.mapred.JobInProgress$JobSummary=${hadoop.mapreduce.jobsummary.logger}
log4j.additivity.org.apache.hadoop.mapred.JobInProgress$JobSummary=false

虽然根据网上的资料及部分自己的方法解决了一些问题,但是hadoop-2.7.3的源码当中还是有4处错误:

(1)The method getDecoder(ObjectInput) is undefined for the type SpecificData
AvroRecord.java /hadoop-common/src/test/java/org/apache/hadoop/io/serializer/avro

(2)The method readExternal(ObjectInput) of type AvroRecord must override or implement a supertype method
AvroRecord.java /hadoop-common/src/test/java/org/apache/hadoop/io/serializer/avro

(3)The method writeExternal(ObjectOutput) of type AvroRecord must override or implement a supertype method
AvroRecord.java /hadoop-common/src/test/java/org/apache/hadoop/io/serializer/avro

第4处也是在AvroRecord.java文件当中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Hadoop eclipse maven java