部置haoop全分布模式
机子资源有限,计划用两台PC服务器,加一台个人VM虚拟机上的Ubuntu作TaskTracker结点。
问题:
如何解决虚拟机与物理机器相联:
1.在虚拟机设置里改“NAT”为“Bridged”
2.ifconfig eth0 down然后ifconfig eth0 up重启网卡,这时可以与外部机器互ping
在.12测试机上mysql -u root,
然后授权:mysql> grant all on *.* to 'brian'@172.19.32.108 identified by '123456'
这时在虚拟机上mysql -h 172.19.102.12 -u brian -p123456登录成功,说明可以互联。
----------
.12:作namenode+jobtracker+tasktracker; .11:snn+tasktracker
步骤一:先在两台测试机上搭建两个结点,随后再加结点。
在.12机子上:
1.
下载hadoop-1.0.3
wget http://labs.mop.com/apache-mirror/hadoop/common/hadoop-1.0.3/hadoop-1.0.3.tar.gz
解压
tar zxvf hadoop-1.0.3.tar.gz
在.12上输入java说明没有安装
2.安装java及环境配置
sudo apt-get install openjdk-6-jdk (为什么在.12上下载上java都超慢,是源的问题吗?)
2.1
免密码ssh设置
现在确认能否不输入口令就用ssh登录localhost:
$ ssh localhost
如果
sudo ssh localhost
ssh: connect to host localhost port 22: Connection refused,
但ps -el | grep却看到sshd运行了,
也不用sudo apt-get install openssh-server
关闭防火墙
- iptables -P INPUT ACCEPT
- iptables -P OUTPUT ACCEPT
但也是一样connection refused
# 查看端口号对应的系统服务名称
cat /etc/services
# 启动|停止|重启系统服务
sudo /etc/init.d/service start|stop|restart
重新sudo /etc/init.d/ssh restart后还是一样,而且这里说的
ssh start/running, process 16658,ps却找不到想应的pid???!!!
输入
sudo netstat -apn | grep ssh 或(tcp)
发现端口是32200,用ssh local -p32200就可以
如果不输入口令就无法用ssh登陆localhost,执行下面的命令:
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
如果登录了,可用who am i 看是在哪个终端,如果是在ssh可用ctrl+D退出。
2.2
sudo find / -name javac 查看java所以目录,
如/usr/lib/jvm/java-6-sun-1.6.0.22/bin/javac,便在conf/hadoop-env.sh中配置,加上
如export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.22
(为何12上的vim与11上的vim不同,插入模式下回车键不能正常回车!!先用nano改)
mkdir input
cp conf/*.xml input
然后运行bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+',
成功后说明单机模式可运行。
cat output/*
3.伪分布式模式
Configuration Use the following: conf/core-site.xml: <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> conf/hdfs-site.xml: <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> conf/mapred-site.xml: <configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> </configuration>
格式化一个新的分布式文件系统:
$ bin/hadoop namenode -format
启动Hadoop守护进程:
$ bin/start-all.sh
这时出现:
ssh: connect to host localhost port 22: Connection refused,
sudo nano /etc/ssh/sshd_config ,在Port 32200下面加上
Port 22 # add by brian
或者在hadoop-env.sh配置文件中指定ssh的端口:
hadoop-env.sh:export HADOOP_SSH_OPTS="-p 32200"
然后重启sshd
执行/etc/init.d/sshd restart (我这里用ssh,估计是如mysqld服务有时用mysql来命名)
这样SSH端口将同时工作与22和50000上。
jps看到有:
6857 TaskTracker 6603 SecondaryNameNode 6947 Jps 6705 JobTracker 6291 NameNode 6442 DataNode
说明伪分布式已启动服务
将输入文件拷贝到分布式文件系统:
bin/hadoop fs -put conf input
运行发行版提供的示例程序:
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+'
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop fs -cat output/*
1 dfs.replication 1 dfs.server.namenode. 1 dfsadmin
看到有结果。
登录
http://172.19.102.11:50030/jobtracker.jsp(或12),看到作业情况,有两个作业完成,即刚在的例子是有
grep-search和grep-sort两个作业,这是怎么连接两个mapreduce的呢,可回头看一下这个example的源码。
---------------------------------------
配置两个结点的分布式模式
对每个节点需要修改conf下的:core-site.xml,mapred-site.xml,hdfs-site.xml及 masters,slaves文件
相关配置内容如下:
core-site.xml:定位文件系统的NameNode
1 <?xml version="1.0"?> 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 4 <!-- Put site-specific property overrides in this file. --> 5 <configuration> 6 <property> 7 <name>fs.default.name</name> 8 <value>hdfs://backtest12:9000</value> 9 </property> 10 </configuration>
mapred-site.xml:定位JobTracker所在主节点
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://backtest12:9000</value> </property> </configuration>
hdfs-site.xml:增大HDFS备份参数,及其它一些路径,默认是会在/tmp下,重启会被删除
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.name.dir</name> <value>/home/huangshaobin/hadoop-brian/hdfs/name</value> <final>true</final> </property> <property> <name>dfs.data.dir</name> <value>/home/huangshaobin/hadoop-brian/hdfs/data</value> <final>true</final> </property> <property> <name>fs.checkpoint.dir</name> <value>/home/huangshaobin/hadoop-brian/hdfs/namesecondary</value> <final>true</final> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/huangshaobin/hadoop-brian/tmp</value> <description>A base for other temporary directories.</description> </property> </configuration>
masters文件内容:指定SNN进程节点的位置
backtest11
slaves:
backtest11
backtest12
masters和slaves可只存在于namenode上。
先停下服务再重启bin/stop-all.sh
为保证可靠,可将之前的数据删除配置文件里接定的数据目录:
rm -R ~/hadoop-brian/ (或慎用rm -R -f~/hadoop-brian/ )
格式化一个新的分布式文件系统:
bin/hadoop namenode -format
然后在master上
bin/start-all.sh
然后在各结点运行jps列出所有守护进程来验证。
huangshaobin@backtest12:~/hadoop-1.0.3$ jps
16337 TaskTracker 16465 Jps 16082 JobTracker 15643 NameNode 15897 DataNode
huangshaobin@backtest11:~$ jps
11072 DataNode 11208 SecondaryNameNode 11334 TaskTracker 11776 Jps
然后测试:
bin/hadoop fs -put conf input
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+'
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop fs -cat output/*
将输入文件拷贝到分布式文件系统:
bin/hadoop fs -put conf input
出错:12/09/20 17:16:15 WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File
/user/huangshaobin/input/taskcontroller.cfg could only be replicated to 0 nodes, instead of 1
。。。
是因为dfs.replication配置问题吗(最少要3??)?还是因为之前残留的文件冲突(要清理数据)???
是ssh权限问题,权限解决后,
重新清掉数据重启就好
---------------
ssh本地登录及远程登录的问题:
本地登录用下面两条语句解决:
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh localhost测试是否成功可以不用输入密码。
而远程登录
参考http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html(有说原理)
为了让sshd也工作在22端口上(hadoop默认是22端口?)
sudo nano /etc/ssh/sshd_config ,在Port 32200下面加上
Port 22 # add by brian
然后重启sshd
执行/etc/init.d/sshd restart (我这里用ssh,估计是如mysqld服务有时用mysql来命名)
这样SSH端口将同时工作与22和50000上。
从12上sz ~/.ssh/id_rsa.pub,把master公钥拷到本地,然后再用SecureCRT传到11上,重令名一下
mv id_dsa.pub master_key
然后
(如果没有~/.ssh目录的话,mkdir ~/.ssh, chmod 700 ~/.ssh)
cat master_key >> ~/.ssh/authorized_keys (注意是追加,如果是替换该文件的话,会导致secureCRT登录不上)
chmod 600 ~/.ssh/authorized_keys
这样可以从12成功登录到11
ssh backtest11
运行发行版提供的示例程序:
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+'
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop fs -cat output/*
huangshaobin@backtest12:~/hadoop-1.0.3$ bin/hadoop fs -cat output/*
1 dfs.data.dir 1 dfs.name.dir 1 dfs.replication 1 dfs.server.namenode. 1 dfsadmin
在两个节点上均能看到一样的hdfs输出。
运行发行版提供的示例程序:
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+'
huangshaobin@backtest11:~/hadoop-1.0.3$ bin/hadoop fs -cat output/*
两个节点上运行均相同
另外,访问web
可看到相应的NameNode和Jobtracker
进一步,可以改相应的配置文件并加入虚拟机节点作TaskTracker。
参考:
1.《hadoop in action》2.2 2.3
2.官方文档http://hadoop.apache.org/docs/r1.0.3/cluster_setup.html
3.Hadoop集群(第5期)_Hadoop安装配置http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html