Trex-Group / trex-bigdata

11 stars 6 forks source link

[word count]Mac+IDEA+Gradle搭建MapReduce本地开发环境 #19

Closed McKey1911 closed 7 years ago

McKey1911 commented 7 years ago

在Mac本地试着搭建了一个开发环境。不是虚拟机。 1,安装IntelliJ IDEA。应该默认也同时安装了Gradle。 2,新建Gradle项目。 3,从 https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html 拷贝WordCount源代码。 4,在本地某个目录新建 input目录并放入一些文本文件,但是不要新建output目录。 5,build 然后run。就可以看到在指定的output目录里的结果了。

以下是一些我的build.gradle里的一些配置信息。 包的依赖:

dependencies {
    compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.7.3'
    compile group: 'org.apache.hadoop', name: 'hadoop-mapreduce-client-jobclient', version: '2.7.3'

    testCompile group: 'junit', name: 'junit', version: '4.11'
}

run task:

run {
    args += '请自行更换:input目录的path'
    args += '请自行更换:output目录的path'
}

关于如何使用IDEA和Gradle,请问Google先生,本人也是第一次使用它们。 如果使用Maven的话,依赖的包都是一样的。记得在IDE里配置启动参数。

已经打包好的jar,上传到(第一节课的环境)Hadoop的NameNode上执行即可。 详细在上面提到的 MapReduceTutorial 里面有,此处不赘述。

关于代码,我还没有copy老师的镜像,但是看到某个手顺里有代码的样子,应该与MapReduceTutorial 是一致的。

如果是在Windows上搭建的话,可能会因为user权限的问题而run失败。必要的话,可以参考:https://www.polarxiong.com/archives/Hadoop-Intellij%E7%BB%93%E5%90%88Maven%E6%9C%AC%E5%9C%B0%E8%BF%90%E8%A1%8C%E5%92%8C%E8%B0%83%E8%AF%95MapReduce%E7%A8%8B%E5%BA%8F-%E6%97%A0%E9%9C%80%E6%90%AD%E8%BD%BDHadoop%E5%92%8CHDFS%E7%8E%AF%E5%A2%83.html

LiuMing5489 commented 7 years ago

good jod, 用宿主机配置idea等开发环境。 用docker配置hadoop环境。 就可以摆脱臃肿的vb了。

xenron commented 7 years ago

docker很不错的,很方便,慢慢会喜欢上它。

McKey1911 commented 7 years ago

我用VirtualBox创建了一个vm,在vm上安装了Docker,Docker上运行了3个Container。 (老师有提供Docker的手顺及images) 3个Container是Hadoop的 1Master+ 2Slaves 节点,运行正常。 现在要解决的是如何从我的宿主机(mac)来访问Master节点,也就是Docker的Container。 在看Docker官网的文档,然而还没有什么进展。 如果老师有什么好的资料,还请分享给我们。谢谢。

xenron commented 7 years ago

内容稍多,我把log精简了一下,试试看读一下

docker在mac,windows上的运行,是通过docker-machine来实现的 之前可上提过virtual box 所以,第一步,找到docker-machine所在的ip地址 mac-mini:~ xenron$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.99.100:2376 v1.12.3

确认一下docker images mac-mini:~ xenron$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE trex/hadoop-master latest a81d85890038 2 days ago 981.4 MB trex/hbase-slave latest 7b6ed6523178 2 days ago 1.402 GB trex/hbase-master latest 88f47caab409 2 days ago 1.402 GB trex/hadoop-slave latest 8bee1e1a49f1 2 days ago 981.4 MB trex/hbase-base latest cf47e0ef1fc4 2 days ago 1.402 GB trex/hadoop-base latest 3465e96cbfbc 2 days ago 981.4 MB trex/base latest f04d04fa49b3 2 days ago 475.9 MB

确认 docker container 的运行状态 注意观察 0.0.0.0:33608->22/tcp,docker container 对外公开了22端口,但是访问只能通过 docker-machine mac-mini:~ xenron$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
fefa668071e3 trex/hadoop-master:latest "sh /etc/init.d/ssh s" 5 minutes ago Up 5 minutes 0.0.0.0:33608->22/tcp, 0.0.0.0:33607->7373/tcp, 0.0.0.0:33606->7946/tcp, 0.0.0.0:33605->8030/tcp, 0.0.0.0:33604->8031/tcp, 0.0.0.0:33603->8032/tcp, 0.0.0.0:33602->8033/tcp, 0.0.0.0:33601->8040/tcp, 0.0.0.0:33600->8042/tcp, 0.0.0.0:33599->8060/tcp, 0.0.0.0:33598->8088/tcp, 0.0.0.0:33597->9000/tcp, 0.0.0.0:33596->50010/tcp, 0.0.0.0:33595->50020/tcp, 0.0.0.0:33594->50060/tcp, 0.0.0.0:33593->50070/tcp, 0.0.0.0:33592->50075/tcp, 0.0.0.0:33591->50090/tcp, 0.0.0.0:33590->50475/tcp master

尝试直接在 host 宿主机上,通过ssh连接docker container 注意ip和端口 mac-mini:~ xenron$ ssh -p 33608 root@192.168.99.100 The authenticity of host '[192.168.99.100]:33608 ([192.168.99.100]:33608)' can't be established. ECDSA key fingerprint is SHA256:LUsF9xcD5z7GOkGbipnwxFGkAYEDAxmDbmoIbGNVejk. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[192.168.99.100]:33608' (ECDSA) to the list of known hosts. root@192.168.99.100's password: Permission denied, please try again.

出现错误提示 但是简单分析一下,不是ip地址找不到,也不是端口未开放,而是无权限 原因是默认不允许root通过ssh访问

查看ssh配置文件 cat /etc/ssh/sshd_config

这个要修改一下,就可以用root用户登陆ssh了 PermitRootLogin without-password

McKey1911 commented 7 years ago

我的机器没有docker-machine。“docker-machine ls” 是无法执行的。 根据官方文档,在老版本的系统上可能是需要docker-machine的。

我有看 start-hadoop-container.sh 脚本,run的时候指定了-P,所以需要的端口都被开放了。 问题上我本机浏览器无法打开连接这些端口。 docker ps 的出力结果:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9c64d5c9225b nginx "nginx -g 'daemon ..." 27 minutes ago Up 27 minutes 0.0.0.0:80->80/tcp, 443/tcp webserver 43b0ac8ecab8 trex/hadoop-slave:latest "/bin/sh -c ''/roo..." 3 days ago Up 40 minutes 0.0.0.0:32824->22/tcp, 0.0.0.0:32823->7373/tcp, 0.0.0.0:32822->7946/tcp, 0.0.0.0:32821->8030/tcp, 0.0.0.0:32820->8031/tcp, 0.0.0.0:32819->8032/tcp, 0.0.0.0:32818->8033/tcp, 0.0.0.0:32817->8040/tcp, 0.0.0.0:32816->8042/tcp, 0.0.0.0:32815->8060/tcp, 0.0.0.0:32814->8088/tcp, 0.0.0.0:32813->9000/tcp, 0.0.0.0:32812->50010/tcp, 0.0.0.0:32811->50020/tcp, 0.0.0.0:32810->50060/tcp, 0.0.0.0:32809->50070/tcp, 0.0.0.0:32808->50075/tcp, 0.0.0.0:32807->50090/tcp, 0.0.0.0:32806->50475/tcp slave2 d6d453884b23 trex/hadoop-slave:latest "/bin/sh -c ''/roo..." 3 days ago Up 41 minutes 0.0.0.0:32805->22/tcp, 0.0.0.0:32804->7373/tcp, 0.0.0.0:32803->7946/tcp, 0.0.0.0:32802->8030/tcp, 0.0.0.0:32801->8031/tcp, 0.0.0.0:32800->8032/tcp, 0.0.0.0:32799->8033/tcp, 0.0.0.0:32798->8040/tcp, 0.0.0.0:32797->8042/tcp, 0.0.0.0:32796->8060/tcp, 0.0.0.0:32795->8088/tcp, 0.0.0.0:32794->9000/tcp, 0.0.0.0:32793->50010/tcp, 0.0.0.0:32792->50020/tcp, 0.0.0.0:32791->50060/tcp, 0.0.0.0:32790->50070/tcp, 0.0.0.0:32789->50075/tcp, 0.0.0.0:32788->50090/tcp, 0.0.0.0:32787->50475/tcp slave1 fbd67f751be5 trex/hadoop-master:latest "/bin/sh -c ''/roo..." 3 days ago Up 41 minutes 0.0.0.0:32786->22/tcp, 0.0.0.0:32785->7373/tcp, 0.0.0.0:32784->7946/tcp, 0.0.0.0:32783->8030/tcp, 0.0.0.0:32782->8031/tcp, 0.0.0.0:32781->8032/tcp, 0.0.0.0:32780->8033/tcp, 0.0.0.0:32779->8040/tcp, 0.0.0.0:32778->8042/tcp, 0.0.0.0:32777->8060/tcp, 0.0.0.0:32776->8088/tcp, 0.0.0.0:32775->9000/tcp, 0.0.0.0:32774->50010/tcp, 0.0.0.0:32773->50020/tcp, 0.0.0.0:32772->50060/tcp, 0.0.0.0:32771->50070/tcp, 0.0.0.0:32770->50075/tcp, 0.0.0.0:32769->50090/tcp, 0.0.0.0:32768->50475/tcp master

其中有一个叫webserver的container,它的80端口被map到宿主机的80端口,我在浏览器键入localhost可以正常访问这个container。 然而其它container却不行,比如我想访问slave2的50070端口,我在浏览器地址栏键入 http://localhost:32809/ 却得到这样的结果:

screen shot 2017-03-14 at 23 38 56

这让我很困惑,按照官方site上的记述,端口就是这样开放的。

LiuMing5489 commented 7 years ago

既然都用docker了,为啥不直接在mac上挑战一下?

xenron commented 7 years ago

@chengwei1987 在mac安装docker的版本是Docker Community Edition?不是toolbox? 我这边mac-mini主机上安装的是toolbox版本 不同版本的实现可能不太一样。。。坑。。。

单纯从 docker ps 的返回结果中,container 的状态应该没有问题,端口映射也都在 1,通过命令(jps,$HADOOP_HOME/bin/hdfs dfsadmin -report),确认一下,namenode的运行状态 2,在namenode节点上,确认WebUI页面能否访问(curl 或者 wget) curl http://localhost:50070/ curl http://master.trex.com:50070/ 3,在datanode节点上,确认WebUI页面能否访问(curl 或者 wget) curl http://master.trex.com:50070/ 4,尝试一下 http://localhost:32809/ http://127.0.0.1:32809/ http://ip地址:32809/ 5,编辑宿主机(mac)的hosts文件,增加master.trex.com的指向为127.0.0.1或者宿主机的ip地址 测试 curl http://master.trex.com:32809/

上述123枚问题的话,分别尝试45。

McKey1911 commented 7 years ago

@LiuMing5489 我构建了两个Docker。 一个是mac本地的。 一个是在VM上的。 不过VM是Server版的,所以我想在mac运行浏览器访问VM上的Docker的container。 不过两种case都没成功 😓

McKey1911 commented 7 years ago

@xenron Oops! My mistake. 我没有进到Container里面启动hdfs和yarn。。。 非常感谢回答。

xenron commented 7 years ago

:alien::alien::alien:

LiuMing5489 commented 7 years ago

👽👽👽