关于Producer中的pom.xml

老师好,我自己本地创建的maven项目,pom.xml是默认的内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.chinahadoop.kafka</groupId>
<artifactId>sogoukafka</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>sogoukafka</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

但是冼老师在视频中说应用java -cp 命令时,存在有 fat jar的问题,所以老师的pom.xml多出了很多内容,比如:
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>

<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>cn.chinahadoop.kafka.consumer.TestConsumer</Main-Class>
</manifestEntries>
</transformer>

</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
请问我也需要按照老师的这个配置进行修改自己的pom.xml吗?前提是我就想直接java -cp 包名.jar,不想列举所有的依赖包。

wangxiaolei

赞同来自: zhudejun_1985

不想在命令中写依赖的jar包,想在执行mvn package命令的时候把依赖的jar包都一起打到一个jar包时,需要修改默认的pom.xml文件的。 请参考bootcamp项目中bootcamp/flume-tutorial/test_flume/pom.xml文件的配置。

wangxiaolei

赞同来自: zhudejun_1985

对,你的理解是对的。 resources目录是maven项目的标准资源文件都放在这个目录下,就像源代码文件都放在src目录下一样。

wangxiaolei

赞同来自: zhudejun_1985

Hadoop Common中定义了Configuration的基本实现,其他模块/系统,比如MapReduce,HDFS,YARN,HBase等, 均在这个基础上实现了自己的Configuration,比如MapReduce中叫JobConf,HDFS中叫HdfsConfiguration, YARN中交YarnConfiguration,HBase中叫HBaseConfiguration,这些Configuration实现非常简单, 他们继承基类Configuration,然后加载自己的xml配置文件,通常这些配置文件成对出现, 比如MapReduce分别为mapred-default.xml和mapred-site.xml,HDFS分别为hdfs-default.xml,hdfs-site.xml 你写new Configuration()就可以了  

wangxiaolei

赞同来自: zhudejun_1985

outputFileName是SubTestConsumer.java类中自定义的成员变量,是String类型, dos也是自定义的成员变量,是FSDataOutputStream类型。 destDir你说的是对的。

zhudejun_1985 - 天下大事,必作于细

赞同来自:

关于resources文件夹下面的四个配置文件,既然是在Hadoop集群中运行作业,为何还需要这四个文件呢?如果我想直接运行java -cp test_kafka-0.0.1SNAPSHOT.jar cn.chinahadoop.kafka.hadoop_consumer.TestHadoopConsumer,之前的源代码中已经将配置信息改好了,这里还需要什么resources文件夹下面的四个文件吗?有什么用?不明白。

zhudejun_1985 - 天下大事,必作于细

赞同来自:

/src/main/resources/这个目录下放置了4个配置文件,我明白了是为了给JVM指明连接到哪个Hadoop集群上,那我可以这样理解吗?把我自己hadoop集群上的这4个文件一模一样的拷贝到这个文件夹下就可以了。这个理解对吗?   还有,/src/main/目录下,我为什么必须要用resources这个目录名?其他名字可以吗?程序里是写死了要用这个名字吗?

zhudejun_1985 - 天下大事,必作于细

赞同来自:

还有一个,在Producer模块中的SubTaskConsumer,需要传入一个参数FileSystem fs,本质上是一个hdfs的句柄,在从TestHadoopConsumer内部调用它的时候,是用: executor.submit(new SubTaskConsumer(stream, threadNumber,hdfs)); 而在它的构造函数里是用这条语句来创建句柄的: hdfs = FileSystem.get(new HdfsConfiguration());  ------(1) 我想知道如果我的Hadoop集群的4个配置文件放在src/main/resources/文件夹下,这条语句就能自动找到正确的hdfs吗?还是说我需要一些其他的配置?   hdfs = FileSystem.get(new Configuration());  ------(2)   标号为(1),(2)的两条语句,在此处仅仅针对于建立一个hdfs对象会有什么不同效果吗?

zhudejun_1985 - 天下大事,必作于细

赞同来自:

第三个问题是:在kafka-tutorial/test_kafka下面的pom.xml中有这么一段: <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   <project.build.sourceVersion>1.6</project.build.sourceVersion>   <project.build.targetVersion>1.6</project.build.targetVersion>   </properties> 我想知道这个1.6指代JDK1.6版本吗?如果我本地是JDK1.8,是否需要改动为数字1.8呢?

zhudejun_1985 - 天下大事,必作于细

赞同来自:

今晚修改中又有后续的几个小问题,集中在kafka-to-hdfs中的dumpToFile函数中: 1:这行代码  hdfs.rename( new Path( outputFileName ), new Path( outputFileName + "." + System.currentTimeMillis() + ".Done" )); 逻辑我明白,碰到新传入的文件名,就将老的名字后面加上.time.Done , 但是这个变量outputFileName是哪儿传进来的?在哪儿定义的不明了。     2:关于变量dos,有好几个地方操作dos, dos = hdfs.append(path); dos = hdfs.create(path); dos.flush(); dos.close(); 等等。 我参考bootcamp中的test_kafka下属的SubTestConsumer.java中的代码,知道是这样创建的: FSDataOutputStream dos = hdfs.create(path); 是在run()函数内部创建的。 也就是说dos是kafka中消息流要写到的地方,本身是一个文件输出流。 但是在冼老师视频中,还有包括自定义的自动刷新线程中也用到这个变量dos.hsync(); 我的理解是dos应该属于类SubTestConsumer,是类的自身拥有的类成员变量才能在多个内部函数中调用吧?不能仅仅放在一个run里,或者放在dumpToFile里,这个理解对吗?     3:还有个变量destDir,这个应该是从TestConsumer中传入的,这个值也可以放在main()中,和那些zookeeper,topic,groupId一起指定吗?  

要回复问题请先登录注册