部置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

关闭防火墙

  1. iptables -P INPUT ACCEPT  
  2. 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

http://172.19.102.12:50070

http://172.19.102.12:50030

可看到相应的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

 

 

 

posted @ 2012-09-20 21:51  aha~  阅读(331)  评论(0编辑  收藏  举报