偶然看到家里的台式机闲置没用,于是索性想到了部署一次完全分布式的Hadoop试试看。本来伪分布式模式部署好了就用到现在,苦于装备条件不够,没办法实现真正的分布式运算。现在终于有时间又有机器,可以部署(折腾)一番。
我用的hadoop和spark是:
1. Hadoop-2.6.0
2. spark-1.6.0-hadoop2.6.0
将hadoop部署完毕之后再部署spark就很简单了,目标就是能让spark在配置好的集羣中能够运行写好的jar包的内容。
一、设置ssh无密码登录
要部署一个集羣,就需要让主机能够有权限访问集羣中所有的机器,从而分发作业。所以第一步就是完成集羣中主机对机器的无密码登录。
首先要完成的是机器对自己能够进行ssh无密码登录:
第一步先生成一个ssh密钥,-t是指定生成密钥类型,-p表示旧密码,这里为”,就表示无密码,-f表示存储密钥的位置。
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
第二步,将新生成的密钥文件复制到authorized_keys中,这里的autorized_keys就是用来存放远程主机的公钥内容。如果存有远程主机的公钥,当远程主机发起请求登录时,本地主机会发送一段随机字符串给远程主机,远程主机会用和公钥配套的私钥进行加密,再传送回来,然后本地主机使用autorized_keys文件中该远程主机相应的公钥进行解密并验证,正确后即可直接让远程主机登录shell。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
第三步,修改authorized_keys文件访问权限
$ chmod 0600 ~/.ssh/authorized_keys
三步之后主机应该就能自己ssh登录自己的shell了,使用命令ssh + ip即可尝试,当然也可以使用localhost代替ip地址的内容:
$ssh localhost
为什么localhost可以代替ip地址?因为在解析这个localhost中,有一个文件hosts设置了相关的ip地址和别名之间的映射。可以用gedit来进行查看:
$sudo gedit /etc/hosts
第一行应该是一个本地ip地址,它就对应着localhost。其实这个hosts文件的设置十分有用,后面的配置中少不了hosts的设置。我们顺便把主机和集羣中的机器相应配置在hosts文件中:
192.168.0.105 master
192.168.0.102 node1
以上配置有两台机器。
等所有机器设置好ssh之后,将主机的公钥通过ssh传输到其他节点中,使用
scp [filename] [email protected]: [filename]
这样的格式传输,ip地址和localhost一样,可以用hosts中的映射代替:例如将
$ scp ~/.ssh/id_rsa.pub user@192.168.0.102:~/.ssh/master_rsa.pub
代替成:
$ scp ~/.ssh/id_rsa.pub user@node1:~/.ssh/master_rsa.pub
同样地,如果集羣中的所有机器所用用户名相同,那就可以省略掉前面的‘[email protected]’,变成简单的:
$ scp ~/.ssh/id_rsa.pub node1:~/.ssh/master_rsa.pub
所以这里建议搭建集羣时,自己新建一个带有sudoer权限的用户,并且使用的用户面全部要相同,这点是很难避免的,因为即使你现在能够用命令手动完成ssh免密码登录,hadoop集羣运行时,仍然会严格按照[email protected]的格式进行ssh登录,不可避免地会出现问题,导致从头再来。
当然,节点机器获得到的公钥要保存进入authorized_keys:
$ cat ~/.ssh/master_rsa.pub >> ~/.ssh/authorized_keys
完成后,我们试着用ssh [email protected]
的方式进行登录,用户名相同的情况下,可以使用ssh ip
$ ssh node1
一般情况下,登录成功。
二、hadoop文件配置
我们主要对四个文件进行配置:core-site.xml,hdfs-site.xml,hadoop-env.sh,slaves 这是最简单的功能配置,其实想要配置更多功能,可以参考hadoop官方给出的解释:Hadoop Cluster Setup
首先是最简单的etc/hadoop/slaves文件,指明了集羣中机器的ip地址,这里用别名表示即可。
node1
如此简单。
然后是etc/hadoop/hadoop-env.sh文件:
这个文件用于设置hadoop集羣中的各种环境变量,例如JAVA_HOME地址,hadoop配置文件地址,namenode各项设置或是datanode各项设置。
找到JAVA_HOME设置这一行,填入相应的JAVA_HOME即可。
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
接在来是etc/hadoop/core-site.xml文件
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/coder-z/hadoop/tmp</value>
</property>
</configuration>
简单设置,按照官网给的表格相应配置。(这里是完完全全的低配版,hadoop提供了丰富的自定义属性可以针对namenode和datanode自由配置,包括namenode日志存放或最大块大小设置等。)
最后是./etc/hadoop/hdfs-site.xml设置:
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/coder-z/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/coder-z/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
dfs.replication表示复制的源文件个数根据节点个数决定,如果是伪分布式的情况值就为1,dfs.namenode.name.dir表示namdenode存储数据和log的位置。
至此就完成了hadoop的配置。
接着,将整个hadoop文件传输给其他的节点机器:
scp -r ~/hadoop-2.6.0 node1: ~
三、spark文件配置
spark主要配置/conf下的spark-env.sh和slaves,slaves和hadoop完全相同。
主要是spark-env.sh:
SPARK_LOCAL_IP=192.168.0.105
SPARK_MASTER_PORT=7077
SPARK_LOCAL_DIRS=/opt/data/spark/local
SPARK_MASTER_IP=192.168.0.105
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=2
SPARK_WORKER_DIR=/opt/data/spark/work
SPARK_LOG_DIR=/opt/data/spark/log
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SCALA_HOME=/home/coder-z/scala-2.10.5/
export SPARK_MASTER_IP=192.168.0.105
export HADOOP_HOME=/home/coder-z/hadoop-2.6.0/lib/native
export HADOOP_CONF=/home/coder-z/hadoop-2.6.0/etc/hadoop
其实主要目的就是配置spark相应的环境变量,能够启动hadoop。其中三个目录,可以事先先创建好:
$ sudo mkdir -p /opt/data/spark/work
另外,需要给整个目录权限设置:
$ sudo chmod -R 777 /opt/data/
然后,传输所有spark文件到各个节点机器:
scp -r ~/spark-1.6.2-hadoop-2.6.0 node1: ~
四、启动集羣
首先启动hadoop集羣:
进入hadoop目录后
$ sbin/start-up.sh
然后启动spark:
进入spark目录后
$ sbin/start-all.sh
进入localhost:8080页面可查看spark集羣情况。
启动spark-shell:
$ bin/spark-shell --master spark://ip:port
默认端口是7077
五、提交文件到hdfs
使用hdfs 中-put命令即可提交文件到hdfs上:
bin/hadoop fs -put [filename] hdfs://ip:port/
感谢:
http://blog.csdn.net/hit0803107/article/details/52795241
http://blog.csdn.net/ab198604/article/details/8250461
http://blog.csdn.net/stark_summer/article/details/42424279