好像hadoop 2.x 没有50030端口,2.x 好像没有jobTracker跟TaskTracker------摘自贴吧。
这个过程真的很折磨人啊………………………………
两台ubuntu server 和一台 ubuntu desktop
至于为什么要用一个桌面的ubuntu ,是因为我是新手,确实有时候命令不是很熟悉,
比如下载hadoop 这种工作,我还是十分喜欢在浏览器里点来点去。
其实我觉得功能没差。
补充:
译注:递归地创建目录
mkdir -p letter/important/xxx/xxxx/xxxx
设置访问权限
$ mkdir -m=r-- letter
先上手把。
这里要和所有人说声道歉!!!
这里要和所有人说声道歉!!!
这里要和所有人说声道歉!!!
重要的事要说三遍!!!
记得前面虚拟机安装ubuntu server的时候取名字,用了luis1 和 luis2 但是 ubuntu desktop 用户名叫 luis……
这个问题直接导致了后来我怎么都不能用ubuntu免密码ssh登陆(直接ssh 是可以免密码登陆的,就是hadoop控制的时候,怎么都不对)
困扰了我很久啊。(就是ssh可以免密码互相连接,但是hadoop就一定要重新输入密码,而且还每次都输不对)
后来在网上看到了ssh 专家解释:
ssh在登录其他主机时采用的“ ssh 目的主机用户名@目的主机的ip”的模式,
如这里“sshHadoop@192.168.0.2”,ip确定唯一主机,用户名确定主机上的有效用户,密码用于切换到该用户目录下。
在hadoop的集群中,slave文件中给的是datanode的主机ip,在启动hadoop的时候,
hadoop会依照该文件提供的ip地址逐个启动datanode节点上的tasktracker和datanode守护进程,
但是由于没有提供datanode主机的用户名,因而ssh默认以当前用户(假设为namenode)做为目标主机的用户(假设为datanode),
但ssh不会检测目标主机是否存在该用户(这显然不是它的工作),
在本机~/.ssh/known_hosts中没有存放有namenode@datanode‘s ip,因而需要输入密码,
但是由于目标主机没有namenode用户,因而无论怎么输入密码都是错的,或者提示权限不够。
没办法,只能在server 的那两台机子的终端,重新建立用户
sudo adduser luis
然后ubuntu就会弹出一系列可能需要改动的参数内容。
反正我是一个都没改,全部回车,最后y就可以了
切换用户 su - luis
注意这个‘-’ 两边都有空格的,不是连着luis的
这个是连用户根目录都换成了luis了,如果仅仅是su xxx ,那就是换个用户,但是当前路径不变。
然后这个就直接导致了另外一个问题,因为用户换了,所以rsa_pub 肯定也要跟着换,
因为口令是根据用户来生成的,不仅同机不同用户不同,就连普通用户和root用户的切换都要重新生成不同信任口令
所以没办法,只能重新生成。这次我的做法变得聪明一些(做多了总会学着偷点懒)
我把生成的口令拷贝到同一台电脑的authorized_keys文件里,然后直接把authorized_keys拷贝到另外两台机子上,
这样三台机子的信任口令大家都一样了,都相互拥有了。
这里要和所有人说声道歉!!!
这里要和所有人说声道歉!!!
这里要和所有人说声道歉!!!
重要的事要再说三遍!!!
这里我在补充一下linux 目录权限的问题:
777是什么意思?还有w+o是什么意思?有两种写法?
drwxr-xr-x 中的第一位(左数)表示当前目录是目录还是文件,d表示目录,-表示普通文件.
后面9位分为3组,每3组作为1组,从左到右分别表示文件属主,文件属组,和其他所有用户的权限.
r表示文件可读,w表示文件可写,x表示文件可以执行.
用命令chmod改变文件权限.有两种
第一种
chmod (ugoa) (=-+) (rwx) file
u代表文件属主,g代表文件属组,o代表系统中除属主和属组成员之外的其他用户,a代表所有用户(u,g,o)总和
+代表增加相应的权限,-代表减少相应的权限,=代表只有相应的权限
chmod g-w file就可以完成上面那个文件的权限改正.
第二种
用数字改正,r为4,w为2,x为1
把数字相加就是所对应的权限,不如rwx就是7,rw就是6
改正上面问题的权限方法为
chmod 775 file 就行了
这里文件夹的权限配置是:
用户目录755或700,不能使77*
.ssh目录755
authorized_key 644
全部弄好了后
需要切换到root用户下,修改/etc/ssh/sshd_config文件
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
将前面的#去掉
别忘了马上切换回来用户 exit 或者 su 就可以了
这期间,我也重新配置了一下java的环境变量,虽然,java环境变量在apt-get install 的时候就已经被操作系统配好了
但是我还是不放心,重新配置了一下,
sudo nano /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
这三条语句夹在done 和unset i 这个包扣的中间
还有要十分注意,我看不懂这个是什么语法,后来我一想,这个该不会是python版本吧
我真猜中了,Python有个很不成形的规定,它是靠缩进来限定语句块的,所以,这三条语句的位置一定要对齐
而且要在这个包扣里往里在移一点。这样才能看成一块(才会被程序理解成被大括号包起来的感觉)
三台我都重新配置了一下,本来JAVA_HOME 是oracle-java-8 现在就变成了上面的那个java7的版本。
说了那么多,总结起来就是,三台机器的用户一定要一样,至少控制hadoop的一定要一样(这里我都叫 luis )
一定要一样,否则就是血的教训。
这样就导致 scp 跨服务器拷贝的时候都是目的地址都是luis@h* :home/luis/
反正我是把配好的hadoop放到用户目录下的,结构就变成了home/luis/hadoop-2.6.0/*
各个机器的防火墙都需要关闭:选择永修生效把,局域网里要它没它一样。完全不用担心不安全的问题。
1) 永久性生效,重启后不会复原
开启:chkconfig iptables on
关闭:chkconfig iptables off
2) 即时生效,重启后复原
开启:service iptables start
关闭:service iptables stop
言归正传,现在开始
把昨天编译好的64位压缩包,解压到用户根目录:home/luis/hadoop-2.6.0/
修改hadoop-2.6.0/etc/hadoop/hadoop-env.sh,添加JDK支持:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
一定要写绝对路径。。。不能写${JAVA_HOME},因为编译用的是java7,所以这里我就一直用这个了。
这里我还碰到一个特别奇怪的问题,我把这个文件里的所有没有#号注释的地方的空行全部删了,
只有这样才能准确识别,否则就会报错,不知道其他人碰到没有。
修改hadoop-2.6.0/etc/hadoop/core-site.xml
注意:必须加在<configuration></configuration>节点内
#因为名字统一了,所以接下来配置的路径也都一样了
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/luis/hadoop-2.6.0/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
还有个问题luis/hadoop-2.6.0 路径下是没有tmp文件夹的
所以一定要自己建一个 mkdir luis/hadoop-2.6.0/tmp
才不会导致出错
修改hadoop-2.6.0/etc/hadoop/hdfs-site.xml
这里除了要改路径之外还有 replication你有几个副本就有几份拷贝,我这里有两个datanode节点,所以写2就可以了
同样开始没有这两个文件夹,先建好data 和name文件夹再配置。mkdir XXXX
<property>
<name>dfs.name.dir</name>
<value>/home/luis/hadoop-2.6.0/dfs/name</value>
<description>Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/luis/hadoop-2.6.0/dfs/data</value>
<description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
修改hadoop-2.6.0/etc/hadoop/mapred-site.xml
其实从2.*版本以后hadoop-2.6.0/etc/hadoop 目录里没有mapred-site.xml只有mapred-site.xml.template,用户需要复制一份模板,
cat mapred-site.xml.template >> mapred-site.xml 然后再作改动
这里的路径是namenode节点的路径。我这里namenode是ubuntu_desktop,所以是h5 ,写ip地址也没关系
<property>
<name>mapred.job.tracker</name>
<value>h5:9001</value>
<description>Host or IP and port of JobTracker.</description>
</property>
修改hadoop-2.6.0/etc/hadoop/masters
尽量使用IP,其实从2.*版本以后hadoop-2.6.0/etc/hadoop没有masters文件
touch masters 一个,然后写入
列出所有的master节点:(尽量使用IP)
h5
修改hadoop-2.6.0/etc/hadoop/slaves
这个是所有datanode的机器(尽量使用IP)
h1
h2
最后:
将master结点上配置好的hadoop文件夹拷贝到所有的slave结点上
以slave1为例:命令如下:
scp -r ~/hadoop-2.6.0 luis@h1:~/
scp -r ~/hadoop-2.6.0 luis@h2:~/
这里我还修改了这个修改好的hadoop-2.6.0 文件夹的权限
三台我都改了,改成了777,因为我想啊ubuntu要读要写啊,所以就改了。其实想想不用改啊,用户自己就有权限的
(网上说这么改会出错,我不知道,那么大家先别改,如果没改有错误,再改)
这里就大功告成了
先格式化namenode节点,就是主节点
(这里一定要进入hadoop-2.6.0目录):
cd hadoop-2.6.0 //进入hadoop-2.6.0目录
bin/hdfs namenode -format //格式化
然后开启进程,都是在namenode开启。另外两台不要动。
sbin/start-dfs.sh //开启进程
停止进程用
关闭hdfs集群的命令如下:
sbin/stop-dfs.sh
验证:
在namenode执行:jps 命令
在datanode执行:jps 命令
我们也可以通过网页来看是否正常安装与配置,地址如下:http://h5:50070/
或者在namenode 执行 :hadoop dfsadmin -report 命令
端口:描述
50030:mapred.job.tracker.http.address
JobTracker administrative web GUI JOBTRACKER的HTTP服务器和端口
50070:dfs.http.address
NameNode administrative web GUI NAMENODE的HTTP服务器和端口
50010 :dfs.datanode.address
DataNode control port (each DataNode listens on this port and registers it with the NameNode on startup) DATANODE控制端口,主要用于DATANODE初始化时向NAMENODE提出注册和应答请求
这里我没有配置HADOOP_HOME 是因为我想着多敲几遍结构路径代码就能熟悉一些结构。
你想配置的也可以,类似于java 的环境变量,就不用打路径就可以直接执行bash的作用
#Hadoop 这里貌似还配置了hive的环境变量
export HADOOP_HOME=/home/luis/hadoop-2.6.0
export HIVE_HOME=/home/hadoop/hive-0.11.0
export HADOOP_HOME_WARN_SUPPRESS=1
export PATH=$PATH:$HADOOP_HOME/bin:$HIVE_HOME/bin
因为我没配,所以我也不敢保证准确的放在哪里,你们大家可以试试放JAVA_HOME一起,看看会有什么问题没有。
实例运行(运行wordcount程序)(摘自来源:Linux社区 作者:lizhangyong1989博客)
创建 input目录
在Hadoop-2.6.0目录下创建input目录命令如下:
mkdir input
在input创建f1、f2并写内容
命令如下:
cat input/f1 Hello world bye luis
cat input/f2 Hello world bye luis
在hdfs创建/porrylee/input目录
命令如下:
bin/hadoop fs -mkdir /porrylee
bin/hadoop fs -mkdir /porrylee/input
将f1、f2文件copy到hdfs /porrylee/input目录
命令如下:
bin/hadoop fs -put input/ /porrylee
查看hdfs上是否有f1、f2文件
命令如下:
bin/hadoop fs -ls /porrylee/input/
执行wordcount程序
命令如下:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /porrylee/input/ /output/wordcount3
接下来就看看单词统计结果吧~~~~
查看执行结果
命令如下:
hadoop@master:~/hadoop-2.6.0$ bin/hdfs dfs -cat /output/wordcount3/*