Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发M(2)

Ssh连接linux服务器,除了用账户密码连接,还提供通过公钥私钥配对登录的方式,这里让SSH无密码登录Linux,主要是为了方便Hadoop的Master直接连接各个Slave机器。因此创建SSH无密码登录Linux和Hadoop的功能没有关系,创建方式可以参考:

cd ~/.ssh/ #进入当前用户主目录下的.ssh文件夹下

rm ./id_rsa*  #先删除已经存在的id_rsa开头的公钥文件,可能没有

ssh-keygen -t rsa  #创建公钥文件,有提示,全部按确定即可

cat ./id_rsa.pub >> ./authorized_keys #把生成的id_rsa.pub公钥文件内容追加到当前目录下authorized_keys文件

创建公钥文件完成,测试可以试试:

ssh Master #Master为当前机器名,或ssh 当前ip。如果不需要输入密码,则说明成功

然后执行:

scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/  #这条指令执行有前提,需要有一台Slave1的机器,并且当前机器Hosts对Slave1机器做了IP 机器猫映射,并且Slave1机器有一个用户名hadoop,并且用户的文件目录是/home/hadoop/。这条指令意思是把当前机器所属用户主目录下.ssh文件夹下的id_rsa.put公钥文件复制到远程机器Slave1的/home/hadoop目录下,并且访问远程机器的用户名是hadoop。

输入该指令后会要求输入Slave1机器hadoop用户的密码,输入成功后则会把id_rsa.pub文件传递到Slave1机器上。比如会有显示:

id_rsa.pub                                    100%  391    0.4KB/s  00:00 

然后再Slave1上把Master机器的公钥文件放到用户主目录的/.ssh/authorized_keys文件里,在Slave1上操作的命令如下:

mkdir ~/.ssh #如果不存在则先创建

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

rm ~/id_rsa.pub    #复制完就可以删掉了

现在在Master机器上测试,因为把Master上生成的公钥文件放到Slave1机器hadoop用户的制定位置,就可以免密码登录Slave1机器了。

[hadoop@Master .ssh]$ ssh Slave1

[hadoop@Slave1 ~]$ exit  #显示不用密码已经进入了Slave1机器,exit回到Master机器

logout

Connection to Slave1 closed.

[hadoop@Master .ssh]$  #显示回到了Master机器

SSH无密码登陆Linux就完成了。

前段时间Redis未授权访问(就是无密码)导致可以远程连接Redis后修改Redis持久文件,并写入公钥文件到特定目录,导致可以远程无密码连接到ssh,就是可以通过这样配置公钥,并通过redis写入特定目录。

四、Hadoop单机安装

单机模式我在一台测试服务器172.26.5.187上做的测试,把187服务器的主机名修改为Master,并修改Hosts文件机器名和IP映射,需要用root去执行命令:

vi /etc/sysconfig/network

修改:HOSTNAME=Master

vi /etc/hosts

172.26.5.187 Master

然后在187服务器上创建一个hadoop用户:

useradd -m hadoop -s /bin/bash 创建hadoop用户,-m创建主目录 -s /bin/bash 指定用户的登录Shell

passwd hadoop

mima.. #修改设置hadoop密码

usermod -g root hadoop #加入root组

通过 镜像地址下载2.6.3版本。

把hadoop安装到/usr/local/hadoop下,把hadoop-2.6.3.tar.gz放到/usr/local目录,执行命令:

1

2

3

rm -rf /usr/local/hadoop    # 删掉旧的(如果存在)

tar -zxf ~/hadoop-2.6.3.tar.gz -C /usr/local

把文件夹修改为hadoop,执行命令,修改文件夹所属用户和组:

chown -R hadoop:hadoop /usr/local/hadoop

然后用hadoop登录后执行:

cd /usr/local/hadoop

./bin/hadoop version

输出结果:

[hadoop@Master hadoop]$ ./bin/hadoop version

Hadoop 2.6.3

Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r cc865b490b9a6260e9611a5b8633cab885b3d247

Compiled by jenkins on 2015-12-18T01:19Z

Compiled with protoc 2.5.0

From source with checksum 722f77f825e326e13a86ff62b34ada

This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.3.jar

表示安装成功

五、Hadoop单机模式运行

把hadoop-2.6.3.tar.gz解压到187服务器:/usr/local/hadoop后,执行命令:

mkdir ./input

cp ./etc/hadoop/*.xml ./input

直接测试自带的jar包程序,从input文件夹下的文件分析含有dfs..正则的字符串,如果有就输出到output文件夹:

[hadoop@Master  hadoop]$./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar grep ./input ./output 'dfs[a-z]+'

发现会有报错,大意是说权限不够,执行命令:

chmod -R 744 ./bin/  #改变当前目录读写权限

再次执行:

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar grep ./input ./output 'dfs[a-z]+'

执行后输出一串......

File Input Format Counters

Bytes Read=123

File Output Format Counters

Bytes Written=23

..........

说明执行成功,查���:

[hadoop@p5 hadoop]$ cat ./output/*

dfsadmin

这里的数据实际为part-r-00000的内容

[hadoop@p5 hadoop]$ ls output

part-r-00000  _SUCCESS

注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。

rm -r ./output

单机模式运行成功。

六、Hadoop伪分布式部署

首先进入到/usr/local/hadoop下:

[hadoop@Master hadoop]$ pwd

/usr/local/hadoop

修改core-site.xml和hdfs-site.xml配置文件,执行:

vi ./etc/hadoop/core-site.xml

<configuration>

<property>

<name>hadoop.tmp.dir</name>

<value>file:/usr/local/hadoop/tmp</value>

<description>Abase for other temporary directories.</description>

</property>

<property>

<name>fs.defaultFS</name>

<value>hdfs://172.26.5.187:9000</value>

</property>

</configuration>

vi ./etc/hadoop/hdfs-site.xml

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>file:/usr/local/hadoop/tmp/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:/usr/local/hadoop/tmp/dfs/data</value>

</property>

</configuration>

配置完成后,执行 NameNode 的格式化(只执行一次即可,以后不需要执行了):

./bin/hdfs namenode -format

成功的话,会看到 “successfully formatted” 和 “Exiting with status 0″ 的提示,若为 “Exiting with status 1″ 则是出错。

开启 NaneNode 和 DataNode 守护进程:

[hadoop@Master hadoop]$ ./sbin/start-dfs.sh

可能会报错:

bash: ./sbin/start-dfs.sh: 权限不够

执行命令,添加执行权限:

chmod -R 744 ./sbin

再执行./sbin/start-dfs.sh可能还会报错:

localhost: Error: Java_HOME is not set and could not be found.

执行下面命令解决:

[hadoop@Master hadoop]$ vi ./etc/hadoop/hadoop-env.sh

新增:

export JAVA_HOME=/usr/java/jdk1.6.0_38

这里设置Jdk的路径

再次执行:

[hadoop@p5 hadoop]$ ./sbin/start-dfs.sh

16/01/06 16:05:50 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Starting namenodes on [localhost]

可以忽略,并不会影响正常使用。

Jps查看当前java进程情况:

[hadoop@p5 hadoop]$ jps

25978 Jps

25713 DataNode

25876 SecondaryNameNode

25589 NameNode

如果缺少任何一个进程,都表示启动失败,需要./sbin/stop-dfs.sh停止后,检查/usr/local/hadoop/logs/hadoop-hadoop-XXX-Master.log对应XXX名称的日志

浏览器输入::50070/ 可访问了

Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发M

下面在伪分布式下运行一个自带的demo实例:

首先创建HTFS用户目录和input文件夹:

./bin/hdfs dfs -mkdir -p /user/hadoop

./bin/hdfs dfs -mkdir input

./bin/hdfs dfs -put ./etc/hadoop/*.xml input  #复制当前目录下/etc/hadoop/下的所有xml文件到HTFS的input目录里,

通过下面指令查看复制过去的文件夹:

./bin/hdfs dfs -ls input

执行刚才单机版的测试jar包程序:

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

执行后输出一串..

File Input Format Counters

Bytes Read=219

File Output Format Counters

Bytes Written=77

查看HDFS里output文件夹:

./bin/hdfs dfs -cat output/*

dfsadmin

dfs.replication

dfs.namenode.name.dir

dfs.datanode.data.dir

截图是之前没有修改hostname,所以机器名还是p5。

发现已找到多个字符串,可以把HDFS里的文件取回到output文件夹:

rm -r ./output    # 先删除本地的 output 文件夹(如果存在)

./bin/hdfs dfs -get output ./output    # 将 HDFS 上的 output 文件夹拷贝到本机

cat ./output/*  #查看当前用户目录下的output文件夹下内容

这里伪分布式程序就运行完成了。

上述通过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动 YARN ,让 YARN 来负责资源管理与任务调度。

修改文件:

mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml

[hadoop@p5 hadoop]$ vi ./etc/hadoop/mapred-site.xml

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

[hadoop@p5 hadoop]$ vi ./etc/hadoop/yarn-site.xml

<configuration>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

执行命令:

./sbin/start-yarn.sh      # 启动YARN

./sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行情况

Jps查看:

[hadoop@Master hadoop]$ jps

27492 Jps

27459 JobHistoryServer

25713 DataNode

27013 ResourceManager

27283 NodeManager

25876 SecondaryNameNode

25589 NameNode

启动成功后可以在 :8088/cluster 下查看任务运行情况了。

Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发M

如果不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改成 mapred-site.xml.template

关闭 YARN 的脚本如下:

./sbin/stop-yarn.sh

./sbin/mr-jobhistory-daemon.sh stop historyserver

七、Hadoop集群部署

使用172.26.5.187 做Master和172.26.5.20 做Slave 测试

先187上操作:

[hadoop@Master ~]$ su root

密码:

[root@p5 hadoop]# vi /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=p5

修改:HOSTNAME=Master

再修改hosts文件

[root@p5 hadoop]# vi /etc/hosts

172.26.5.187 Master

172.26.5.20 Slave1

然后在20服务器上操作:

useradd -m hadoop -s /bin/bash 创建hadoop用户,-m创建主目录 -s /bin/bash 指定用户的登录Shell

passwd hadoop

mima...

usermod -g root hadoop

然后root权限下:

[root@Slave1 ~]# vi /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=p2

修改:HOSTNAME=Slave1

[root@Slave1 ~]# vi /etc/hosts

172.26.5.20 Slave1

172.26.5.187 Master

测试:

ping Master -c 3

ping Slave1 -c 3

187和20都能ping通说明配置没有问题了。

187 Master上操作(单机模式下已操作过):

cd ~/.ssh

rm ./id_rsa*

ssh-keygen -t rsa      # 一直按回车就可以

cat ./id_rsa.pub >> ./authorized_keys

完成后可执行 ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点:

scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/

输入完成后会提示传输完毕,如下图所示:

id_rsa.pub                                    100%  391    0.4KB/s  00:00 

接着在 Slave1  172.26.5.20节点上,将 ssh 公匙加入授权:

mkdir ~/.ssh      # 如果不存在该文件夹需先创建,若已存在则忽略

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

rm ~/id_rsa.pub    # 用完就可以删掉了

172.26.5.187上测试无密码连接20服务器:

[hadoop@Master .ssh]$ ssh Slave1

[hadoop@Slave1 ~]$ exit  #exit回到187服务器

logout

Connection to Slave1 closed.

[hadoop@Master .ssh]$ 

187上执行:

[hadoop@Master .ssh]$ vi ~/.bashrc

export PATH=$PATH:/usr/local/hadoop/bin:usr/local/hadoop/sbin

修改187配置文件:

[hadoop@Master .ssh]$ cd  /usr/local/hadoop/etc/hadoop

[hadoop@Master hadoop]$ vi slaves

删除localhost,新增一行:Slave1

文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个。

187上cd到 /usr/local/hadoop/etc/hadoop目录,修改配置文件:

vi core-site.xml

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://Master:9000</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>file:/usr/local/hadoop/tmp</value>

<description>Abase for other temporary directories.</description>

</property>

</configuration>

vi hdfs-site.xml

<configuration>

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>Master:50090</value>

</property>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>file:/usr/local/hadoop/tmp/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:/usr/local/hadoop/tmp/dfs/data</value>

</property>

</configuration>

vi mapred-site.xml

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<property>

<name>mapreduce.jobhistory.address</name>

<value>Master:10020</value>

</property>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>Master:19888</value>

</property>

</configuration>

vi yarn-site.xml

<configuration>

<property>

<name>yarn.resourcemanager.hostname</name>

<value>Master</value>

</property>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

cd /usr/local

rm -rf ./hadoop/tmp    # 删除 Hadoop 临时文件

rm -rf ./hadoop/logs/*  # 删除日志文件

然后把187上修改了配置文件后的hadoop文件夹压缩后发送到Slave机器上,这里上传到20服务器。

tar -zcf ~/hadoop.master.tar.gz ./hadoop  # 先压缩到用户主目录下

cd ~

[hadoop@Master ~]$ scp ./hadoop.master.tar.gz Slave1:/home/hadoop  #再复制到Salve1

hadoop.master.tar.gz                          100%  187MB  11.0MB/s  00:17 

复制完成后,到Slave1 20服务器上操作:

rm -rf /usr/local/hadoop    # 删掉旧的(如果存在)

tar -zxf ~/hadoop.master.tar.gz -C /usr/local

chown -R hadoop:hadoop /usr/local/hadoop

然后在187上start启动:

[hadoop@Master hadoop]$ ./sbin/start-dfs.sh

./sbin/start-yarn.sh      # 启动YARN

./sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行情况

执行后可能会报错:

namenode进程启动不了,报错:Storage directory /usr/local/hadoop/tmp/dfs/name does not exist,需要重新格式化namenode。

在187上执行:hdfs namenode -format

然后需要关闭187和20服务器的防火墙,否则会导致端口访问不通,莫名其妙的错误:

[hadoop@Master local]$ service iptables stop

[hadoop@Slave1 local]$ service iptables stop

再次187上start启动后,然后在187上查询如下:

[hadoop@Master hadoop]$ hdfs dfsadmin -report

16/01/21 17:55:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Configured Capacity: 52844687360 (49.22 GB)

Present Capacity: 44751773696 (41.68 GB)

DFS Remaining: 44741738496 (41.67 GB)

DFS Used: 10035200 (9.57 MB)

DFS Used%: 0.02%

Under replicated blocks: 7

Blocks with corrupt replicas: 0

Missing blocks: 0

-------------------------------------------------

Live datanodes (1):

Name: 172.26.5.20:50010 (Slave1)

Hostname: Slave1

Decommission Status : Normal

Configured Capacity: 52844687360 (49.22 GB)

DFS Used: 10035200 (9.57 MB)

Non DFS Used: 8092913664 (7.54 GB)

DFS Remaining: 44741738496 (41.67 GB)

DFS Used%: 0.02%

DFS Remaining%: 84.67%

Configured Cache Capacity: 0 (0 B)

Cache Used: 0 (0 B)

Cache Remaining: 0 (0 B)

Cache Used%: 100.00%

Cache Remaining%: 0.00%

Xceivers: 1

Last contact: Thu Jan 21 17:55:44 CST 2016

如果显示Live datanodes (1)表示有 1 个 Datanodes,表示启动成功。

在这个过程中,可能还会出现问题:

比如20服务器上DataNode和NodeManager进程启动成功后自动死亡,查看日志报错:

Caused by: java.net.UnknownHostException: p2: p2...

说明可能是机器名没有修改成功,推出shh,重新连接后修改/etc/sysconfig/network里的HOSTNAME值即可。

最后启动服务在187上查看:

[hadoop@Master hadoop]$ jps

10499 ResourceManager

10801 Jps

10770 JobHistoryServer

10365 SecondaryNameNode

10188 NameNode

20上查看:

[hadoop@Slave1 ~]$ jps

4977 NodeManager

5133 Jps

4873 DataNode

表示启动成功了。

下面在集群上执行刚才测试过的自带demo程序:

187服务器执行:(如果再次执行,需要先删除:./bin/hdfs dfs -rm -r output    # 删除 output 文件夹)

hdfs dfs -mkdir -p /user/hadoop

hdfs dfs -mkdir input

hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

[hadoop@Master hadoop]$ hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

可能会报错:java.net.NoRouteToHostException: No route to host

这时需要确保187和20服务器防火墙是否关闭,root权限下查看防火墙:

service iptables status

需要保证用root账户关闭防火墙:service iptables stop

在187上执行:

[hadoop@Master hadoop]$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input

[hadoop@Master hadoop]$ ./bin/hdfs dfs -rm -r output

[hadoop@Master hadoop]$ ./bin/hdfs dfs -ls input

[hadoop@Master hadoop]$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

集群测试成功!

八、Eclipse插件安装

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d95e7b8a3c8953a66d5bc495a2a61601.html