Open 75502881 opened 7 years ago
我想问一下这个jar文件是发到容器master节点的那个目录下去了?
同问,其实不生成jar文件一样可以成功运行代码。(remote)
用docker做开发环境,网络问题是关键。 可以一起讨论一下。
用老师提供的 shell版本的docker: 可以通过本地ide访问namenode,但因为datanode的连接情报是通过namenode取得的。 各种配置文件修改确认中。。。 PS:resource文件夹下面的xml全部删除一样可以成功运行代码。(remote)
compose版本的docker: 通过本地ide访问namenode失败, 原因确认中。。。
之前,qq上面有同学提过类似的问题,可以稍微翻翻聊天记录 client端获得datanode的信息,是通过namenode来得到的 默认情况下,获得位置信息包含ip和port 但是是docker内部的话,这样还好,毕竟都在一个网络内部 如果是mac访问docker的话,还是走hostname方便些 需要修改hdfs-default.xml中的参数 dfs.client.use.datanode.hostname dfs.datanode.use.datanode.hostname 参看下面的页面 https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
实验过程中,可能会涉及一些网络知识 继续努力哈
关于mapreduce的jar文件,发送到jobtracker以后,实际的存储位置 我感觉倒不是重点,所以之前自己也没有仔细看过 既然提到了,顺便查一下 apache hadoop的官方文档里面,对这部分没有详细提及,只是说放到了hdfs 我以官方提供的WordCount,作为入口,一步一步找下去 大概是下面的调用过程,可以参考一下(github上面的hadoop代码结构感觉有点儿乱,可以直接在官网下载源码版本的,这样方便些吧) https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v1.0
https://github.com/apache/hadoop-common/blob/HADOOP-3628/src/core/org/apache/hadoop/conf/Configuration.java org.apache.hadoop.conf.Configuration
https://github.com/apache/hadoop-mapreduce/blob/HDFS-641/src/java/org/apache/hadoop/mapreduce/Job.java org.apache.hadoop.mapreduce.Job.waitForCompletion(true) submit() cluster.getFileSystem()
https://github.com/apache/hadoop-mapreduce/blob/HDFS-641/src/java/org/apache/hadoop/mapreduce/JobSubmitter.java org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal configureCommandLineOptions
https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml mapreduce.jobtracker.staging.root.dir
这样来起来,最终存储mapreduce jar文件的位置,应该是下面的目录 ${hadoop.tmp.dir}/mapred/staging
官方给出的参数说明 The root of the staging area for users' job files In practice, this should be the directory where users' home directories are located (usually /user) 译文:用户任务文件的存放位置
关于配置文件 场景:同一网络内的client, hdfs-namenode, hdfs-datanode-1, mapreduce-jobtracker, mapreduce-tasktacker-1 即最大化分布模式下,每个任务节点只有一个node
对于client来说 不考虑ide,通过命令行方式提交mapreduce的时候 必须要知道jobtracker的位置 如果mapreduce中需要访问hdfs的文件,那么也需要知道namenode的信息
问题来了,什么情况下,不访问hdfs的文件,还有没有其他解决方案 (我这儿跟上课一样,单口相声。。。) 不访问hdfs的话,我感觉可能有两种 1,不需要访问任何外部文件,例如:测试程序,进去转一圈,就出来了 2,访问本地文件,或者外部nfs共享等等 外部nfs共享倒还好说,另外开一个nfs服务,即可 访问本地文件的话,就要求所有tasktracker所在的节点,本地都要有这个文件,不方便,所以这个只存在于测试环境中
对于namenode和datanode,jobtracker和tasktracker 想要区分配置文件,就比较麻烦了 毕竟配置文件的个数,和里面的内容,都比较多。
不使用任何配置文件的话,可以采用参数的方式进行namenode和tasktracker配置 -fs host:port or local Optional Specify a namenode -jt host:port or local Optional Specify a job tracker
link https://hadoop.apache.org/docs/r1.2.1/streaming.html#Generic+Command+Options
对于使用ide来说,实际上和直接使用命令行运行,没有本质区别 只是把命令行里面的参数放到ide里面进行了配置 该需要的参数,还是需要,只是配置方法有些变化而已
老师您好,不好意思占用你一点时间。 我现在在宿主机上用docker开发,打包好的jar用job.setJar("/study/hadoop-remote/hadoopdev/hadoopdev.jar");发到docker的容器里执行, docker容器里现在有三个节点 master,slave1,slave2。 我想问一下这个jar文件是发到容器master节点的那个目录下去了?
还有一个问题是开发工程下的resource目录下的配置文件里的ip地址,这几个文件都需要修改成master的ip地址吗? core-site.xml yarn-site.xml hdfs-site.xml mapred-site.xml
yarn-site.xml里面的端口号怎么指定?