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/ 可访问了
下面在伪分布式下运行一个自带的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 下查看任务运行情况了。
如果不想启动 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插件安装