Linux系统 分布式文件系统 hadoop 调用 php 脚本

本文重要是以安装和应用hadoop-0.12.0为例,指出在陈设Hadoop的时间轻易碰到的题目以及怎样办理。


硬件环境
共有3台呆板,均应用的FC5体系,Java应用的是jdk1.6.0。IP设置如下:
dbrg-1:202.197.18.72
dbrg-2:202.197.18.73
dbrg-3:202.197.18.74
这里有一点必要夸大的就是,务须要确保每台呆板的主机名和IP所在之间能精确理会。 一个很大略的测试办法就是ping一下主机名,比如在dbrg-1上ping dbrg-2,假如能ping通就OK!若不能精确理会,可以批改/etc/hosts文件,假如该台呆板作Namenode用,则必要在hosts文件 中加上集群中全部呆板的IP所在及其对应的主机名;假如该台呆板作Datanode用,则只必要在hosts文件中加上本机IP所在和Namenode机 器的IP所在。 以本文为例,dbrg-1中的/etc/hosts文件看起来就应当是如许的:
127.0.0.0
localhost localhost
202.197.18.72
dbrg-1 dbrg-1
202.197.18.73
dbrg-2 dbrg-2
202.197.18.74
dbrg-3 dbrg-3 dbrg-2中的/etc/hosts文件看起来就应当是如许的:
127.0.0.0
localhost localhost
202.197.18.72
dbrg-1 dbrg-1
202.197.18.73
dbrg-2 dbrg-2 在上一篇学习条记中提到过,对付Hadoop来说,在HDFS看来,节点分为Namenode和Datanode,此中Namenode只有一 个,Datanode可以是很多;在MapReduce看来,节点又分为Jobtracker和Tasktracker,此中Jobtracker只有一 个,Tasktracker可以是很多。
我是将namenode和jobtracker陈设在dbrg-1上,dbrg-2,dbrg-3作为datanode和tasktracker。固然你也可以将namenode,datanode,jobtracker,tasktracker整个陈设在一台呆板上

目次结构
由于Hadoop哀求全部呆板上hadoop的陈设目次结构要相同,并且都有一个相同的用户名的帐户。
我的三台呆板上是如许的:都有一个dbrg的帐户,主目次是/home/dbrg
Hadoop陈设目次结构如下:/home/dbrg/HadoopInstall,全部的hadoop版本放在这个目次中。
将hadoop0.12.0紧缩包解压至HadoopInstall中,为了利便以后升级,提议成立一个链接指向要应用的hadoop版本,不妨设为hadoop
[dbrg@dbrg-1:HadoopInstall]$ln -s hadoop0.12.0
hadoop
如许一来,全部的设置文件都在/hadoop/conf/目次中,全部推行措施都在/hadoop/bin目次中。
但 是由于上述目次中hadoop的设置文件和hadoop的安装目次是放在一起的,如许一旦日后升级hadoop版本的时间全部的设置文件都市被覆盖,因此 提议将设置文件与安装目次星散,一种比拟好的行动就是成立一个寄放设置文件的目次,/home/dbrg/HadoopInstall/hadoop- config/,然后将/hadoop/conf/目次中的hadoop_site.xml,slaves,hadoop_env.sh三个文件拷贝到 hadoop-config/目次中(这个题目很稀疏,在官网上的Getting Started With Hadoop中说是只必要拷贝这个三个文件到本身创建的目次就可以了,但我在实际设置的时间创造还必需把masters这个文件也拷贝到hadoop- conf/目次中才行,不然启动Hadoop的时间就会报错说找不到masters这个文件),并指定环境变量$HADOOP_CONF_DIR指向该目 录。环境变量在/home/dbrg/.bashrc和/etc/profile中设定。
综上所述,为了利便以后升级版本,我们必要做到设置文件与安装目次星散,并通过设定一个指向我们要应用的版本的hadoop的链接,如许可以镌汰我们对设置文件的掩护。在下面的部分,你就会了解到如许星散以及链接的好处了。

SSH设置
在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和收场各个节点上的种种守卫进程的,这就必要在节点之间推行指令的时间是不必要输入暗码的行动,故我们必要设置SSH应用无暗码公钥认证的行动。
起首要担保每台呆板上都装了SSH做事器,且都正常启动。实际中我们用的都是OpenSSH,这是SSH协议的一个免费开源实现。FC5中默认安装的OpenSSH版本是OpenSSH4.3P2。
以 本文中的三台呆板为例,如今dbrg-1是主节点,它必要主动提倡SSH毗连到dbrg-2和dbrg-3,对付SSH做事来说,dbrg-1就是SSH 客户端,而dbrg-2、dbrg-3则是SSH做事端,因此在dbrg-2,dbrg-3上必要断定sshd做事已经启动。大略的说,在dbrg-1上 必要天生一个密钥对,即一个私钥,一个公钥。将公钥拷贝到dbrg-2,dbrg-3上,如许,比如当dbrg-1向dbrg-2提倡ssh毗连的时 候,dbrg-2上就会天生一个随机数并用dbrg-1的公钥对这个随机数举办加密,并发送给dbrg-1;dbrg-1收到这个加密的数以后用私钥举办 解密,并将解密后的数发送回dbrg-2,dbrg-2确认解密的数无误后就允许dbrg-1举办毗连了。这就完成了一次公钥认证过程。
对付本文中的三台呆板,起首在dbrg-1上天生密钥对:
[dbrg@dbrg-1:~]$ssh-keygen -t rsa
这 个下令将为dbrg-1上的用户dbrg天生其密钥对,扣问其生涯路径时直接回车采用默认路径,当提醒要为天生的密钥输入passphrase的时间,直 接回车,也就是将其设定为空暗码。天生的密钥对id_rsa,id_rsa.pub,默认存储在/home/dbrg/.ssh目次下。然后将 id_rsa.pub的内容复制到每个呆板(也包孕本机)的/home/dbrg/.ssh/authorized_keys文件中,假如呆板上已经有 authorized_keys这个文件了,就在文件末端加上id_rsa.pub中的内容,假如没有authorized_keys这个文件,直接cp 可能scp就好了,下面的操纵假设各个呆板上都没有authorized_keys文件。
对付dbrg-1
[dbrg@dbrg-1:.ssh]$cp id_rsa.pub authorized_keys
对付dbrg-2(dbrg-3同dbrg-2的行动)
[dbrg@dbrg-2:~]$mkdir .ssh
[dbrg@dbrg-1:.ssh]$scp authorized_keys dbrg-2:/home/dbrg/.ssh/
此处的scp就是通过ssh举办长途copy,此处必要输入长途主机的暗码,即dbrg-2呆板上dbrg帐户的暗码,固然,你也可以用其他行动将authorized_keys文件拷贝到其他呆板上
[dbrg@dbrg-2:.ssh]$chmod 644 authorized_keys
这一步非常关键,必需担保authorized_keys只对其全部者有读写权限,其他人不允许有写的权限,不然SSH是不会事变的。我就曾经在设置SSH的时间纳闷了好久。
[dbrg@dbrg-2:.ssh]ls -la
drwx------ 2 dbrg dbrg .
drwx------ 3 dbrg dbrg ..
-rw-r--r-- 1 dbrg dbrg authorized_keys
留意每个呆板上的.ssh目次的ls -la都应当和上面是一样的

接着,在三台呆板上都必要对sshd做事举办设置(着实是可以不消设置的,完成了上面的那些操纵了以后SSH就已经可以事变了),在三台呆板上批改文件/etc/ssh/sshd_config
#去除暗码认证
PasswordAuthentication no
AuthorizedKeyFile
.ssh/authorized_keys

至此各个呆板上的SSH设置已经完成,可以测试一下了,比如dbrg-1向dbrg-2提倡ssh毗连
[dbrg@dbrg-1:~]$ssh dbrg-2
假如ssh设置好了,就会出现以下提醒信息
The authenticity of host [dbrg-2] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
OpenSSH见告你它不知道这台主机,但是你不消担忧这个题目,由于你是第一次登录这台主机。键入“yes”。这将把这台主机的“识别符号”加到“~/.ssh/know_hosts”文件中。第二次拜访这台主机的时间就不会再表现这条提醒信息了。
然后你会创造不必要输入暗码就可以成立ssh毗连了,恭喜你,设置乐成了
不外,别忘了测试本机ssh dbrg-1

Hadoop环境变量
在/home/dbrg/HadoopInstall/hadoop-conf目次下的 hadoop_env.sh中设置Hadoop必要的环境变量,此中JAVA_HOME是必需设定的变量。HADOOP_HOME变量可以设定也可以不设 定,假如不设定,HADOOP_HOME默认的是bin目次的父目次,即本文中的/home/dbrg/HadoopInstall/hadoop。我的 是如许设置的
export HADOOP_HOME=/home/dbrg/HadoopInstall/hadoop
export JAVA_HOME=/usr/java/jdk1.6.0
从这个地方就可以看出前面所述的创建hadoop0.12.0的链接hadoop的利益了,当以后更新hadoop的版本的时间,就不必要在改设置文件,只必要变动链接就可以了。

Hadoop设置文件
如前所述,在hadoop-conf/目次下,打开slaves文件,该文件用来指定全部的从节点,一行指定一个主机名。即本文中的dbrg-2,dbrg-3,因此slaves文件看起来应当是如许的
dbrg-2
dbrg-3
在 conf/目次中的hadoop-default.xml中包孕了Hadoop的全部设置项,但是不允许直接批改!可以在hadoop-conf/目次下 的hadoop-site.xml内里界说我们必要的项,其值会覆盖hadoop-default.xml中的默认值。可以按照本身的实际必要来举办定 制。以下是我的设置档:
<?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>dbrg-1:9000</value>
<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>
</property>
<property>
<name>mapred.job.tracker</name>
<value>dbrg-1:9001</value>
<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/dbrg/HadoopInstall/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/dbrg/HadoopInstall/filesystem/name</value>
<description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/dbrg/HadoopInstall/filesystem/data</value>
<description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.</description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description>
</property>
</configuration>

陈设Hadoop
前面讲的这么多Hadoop的环境变量和设置文件都是在dbrg-1这台呆板上的,如今必要将hadoop陈设到其他的呆板上,担保目次结构同等。
[dbrg@dbrg-1:~]$scp -r /home/dbrg/HadoopInstall dbrg-2:/home/dbrg/
[dbrg@dbrg-1:~]$scp -r /home/dbrg/HadoopInstall dbrg-3:/home/dbrg/
至此,可以说,Hadoop已经在各个呆板上陈设完毕了下面就让我们起头启动Hadoop吧

启动Hadoop
启动之前,我们先要技俩化namenode,先辈入~/HadoopInstall/hadoop目次,推行下面的下令
[dbrg@dbrg-1:hadoop]$bin/hadoop namenode -format
不出不测,应当会提醒技俩化乐成。假如不乐成,就去hadoop/logs/目次下去查察日记文件
下面就该正式启动hadoop啦,在bin/下面有很多启动脚本,可以按照本身的必要来启动。
* start-all.sh 启动全部的Hadoop守卫。包孕namenode, datanode, jobtracker, tasktrack
* stop-all.sh 收场合有的Hadoop
* start-mapred.sh 启动Map/Reduce守卫。包孕Jobtracker和Tasktrack
* stop-mapred.sh 收场Map/Reduce守卫
* start-dfs.sh 启动Hadoop DFS守卫.Namenode和Datanode
* stop-dfs.sh 收场DFS守卫
在这里,大略启动全部守卫
[dbrg@dbrg-1:hadoop]$bin/start-all.sh
同样,假如要收场hadoop,则
[dbrg@dbrg-1:hadoop]$bin/stop-all.sh

HDFS操纵
运行bin/目次的hadoop下令,可以查察Haoop全部支持的操纵及其用法,这里以几个大略的操纵为例。
成立目次
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -mkdir testdir
在HDFS中成立一个名为testdir的目次
复制文件
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -put /home/dbrg/large.zip testfile.zip
把内地文件large.zip拷贝到HDFS的根目次/user/dbrg/下,文件名为testfile.zip
查察现有文件
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -ls

下边是我改写的php脚本


maper.php


#!/usr/local/php/bin/php
<?php
$word2count = array();
while($line = fgets(STDIN)) {
if($line == 'end'."\n"){
break;
}
// remove leading and trailing whitespace and lowercase
$line = strtolower(trim($line));
// split the line into words while removing any empty string
$words = preg_split("/\W/", $line, -1, PREG_SPLIT_NO_EMPTY);
// increase counters
foreach ($words as $word) {
$word2count[$word] += 1;
}
}
// write the results to STDOUT (standard output)
// what we output here will be the input for the
// Reduce step, i.e. the input for reducer.py
foreach ($word2count as $word => $count) {
// tab-delimited
echo $word,chr(9),$count, "\n";
}
?>

reducer.php


#!/usr/local/php/bin/php
<?php
$word2count = array();
// input comes from STDIN
while (($line = fgets(STDIN)) !== false) {
if(empty($line) || ($line == "\n")){
break;
}
// remove leading and trailing whitespace
$line = trim($line);
// parse the input we got from mapper.php
list($word, $count) = explode(chr(9), $line);
// convert count (currently a string) to int
$count = intval($count);
// sum counts
if ($count > 0) $word2count[$word] += $count;
}


ksort($word2count);

// write the results to STDOUT (standard output)
foreach ($word2count as $word => $count) {
echo $word, chr(9), $count, "\n";
}
?>

  • 预备措施所必要的作为输入的文本文件的目次,

mkdir /tmp/countfile

  • 下载长途的两个TXT文本作为输入

wget http://pge.rastko.net/dirs/2/0/4/1/20417/20417-8.txt

  • 把文件放入HADOOP 的DFS中

cd /home/guest/hadoop/

bin/hadoop dfs -copyFromLocal /tmp/countfile countfile

  • 推行php措施处理赏罚这些文本

./bin/hadoop jar /home/hadoop/contrib/streaming/hadoop-0.19.2-streaming.jar -mapper /home/hadoop/mapper.php -reducer /home/hadoop/reducer.php -input countfile/pgmonthly_2009_01_21.txt -output coutout/ -file /home/hadoop/reducer.php -file /home/hadoop/mapper.php


记取肯定要加-file 参数 如许手法把php 脚天职发给其他的slave 呆板 举办运算 每台呆板都要安装php

别忘怀变动主机名称 和hosts文件 然后重新天生namenode hadoop namenode -format

  • 查察输出的结果

bin/hadoop dfs -ls countfile-output

bin/hadoop dfs -cat countfile-output/part-00000

你可能感兴趣的:(java,linux,localhost)