这两天接到的任务是在全新的服务器上搭建spark+hdfs集群,用于测试刚刚release的工程。
master:sr288(10.1.0.188)
slaves:
sr494(10.1.2.94)
sr495(10.1.2.95)
sr496(10.1.2.96)
sr497(10.1.2.97)
由于hdfs需要ssh进行通信,而且文件传输scp也需要ssh。我第一步是建立起所有节点之间的ssh无需密码通信。
一、建立ssh无密码连接
ssh密码连接:服务器先给用户公钥,用户用公钥对密码进行加密,发送给服务器,服务器用私钥解密。
ssh无密码连接:每个服务器保存其他用户的公钥authorized_keys,但用户访问将公钥pub发给服务器,服务器比对无误利用pub加密质询q,用户利用私钥p解密质询发送给服务器。
1.以root权限登陆sr288,新建用户yb,并赋予该用户bash的权限
useradd -d /home/yb -m yb
passwd yb
visudo下加入
yb ALL=(ALL)ALL
在/etc/passwd下加入yb:/bin/bash
2.ssh 生成rsa
切换到用户yb生成rsa
ssh-keygen -t rsa
生成authorized_keys将公钥放入
cp id_rsa.pub authorized_keys
3.在其他服务器上同样新建用户yb
将~/.ssh复制到所有的服务器上。这里简单起见将所有的服务器的rsa都设成一样的,这样他们相当于在访问自己。实际应该将服务器A,B,C的公钥分别放入authorized_keys然后共享authorized_keys。
二、将jdk,scala,spark,hadoop文件放入master:sr288
jdk:/usr/java/jdk1.7.0_04
scala:/home/yb/GenBase/scala-2.11.7
spark:/home/yb/GenBase/spark
hadoop:/home/yb/GenBase/hadoop-1.0.4
三、配置系统环境变量
为了不影响其他用户,我在yb下的~/.bashrc里面设置环境变量
除了导入上述路径,还需制定PATH和CLASSPATH
PATH=$JAVA_HOME/bin:$SCALA_HOME:/bin:$HADOOP_HOME:/bin:$PATH
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
然后将相同的文件和配置传入slaves
四、配置hadoop集群
修改conf下的配置文件
1.core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://sr288:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
</property>
</configuration>
2.hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_04
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
export HADOOP_PID_DIR=/home/yb/GenBase/hadoop-1.0.4/pid/
3.hdfs-site.xml
需要注意name和data不需要自己建立到时候hadoop namenode -format就行
<property>
<name>dfs.replication</name>
<value>3</value>
<description>Default block replication. </description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/mnt/DP_disk2/hadoop-1.0.4/hdfs/namenode,/mnt/DP_disk1/hadoop-1.0.4/hdfs/namenode</value>
<description>Default block replication. </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/mnt/DP_disk1/hadoop-1.0.4/hdsf/datanode,/mnt/DP_disk2/hadoop-1.0.4/hdfs/datanode,/mnt/DP_disk3/hadoop-1.0.4/hdfs/datanode/mnt/DP_disk4/hadoop-1.0.4/hdfs/datanode,/mnt/DP_disk5/hadoop-1.0.4/hdfs/datanode</value>
<description>Default block replication. </description>
</property>
4.mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>10.1.0.188:54312</value>
<description></description>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/yb/GenBase/hadoop/hdfs/local</value>
<description></description>
</property>
<property>
<name>mapred.hosts.exclude</name>
<value>~/GenBase/hadoop-1.0.4/conf/excludes</value>
<final>true</final>
</property>
5.masters
sr288
6.slaves
sr494
sr495
sr496
s4497
五、配置spark集群
1.在conf/slaves下加入所有slaves
2.配置spark-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_04
export SPARK_EXECUTOR_INSTANCES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_EXECUTOR_CORES=72
export SPARK_EXECUTOR_INSTANCES=1
#export SPARK_DRIVER_MEMORY=170g
#SPARK_WORKER_CORES=72
#export SPARK_WORKER_MEMORY=170g
export SPARK_PID_DIR=/home/yb/GenBase/spark/pid/
PYSPARK_PYTHON=/usr/bin/python2.7
SPARK_WORKER_DIR=/mnt/DP_disk1/spark
SPARK_LOCAL_DIRS=/mnt/DP_disk2/spark/local
SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true"
SPARK_MASTER_PORT=7180
SPARK_WORKER_PORT=7181
SPARK_MASTER_WEBUI_PORT=8090
SPARK_WORKER_WEBUI_PORT=8091
SPARK_DRIVER_MEMORY根据master的内存大小设置,如果不设置则根据master内存自动分配。
SPARK_WORKER_MEMORY根据slaves的内存大小设置。
需要注意的是这两个地方在设置前需要查看一下当前机器的内存大小
cat /proc/meminfo
如果设置的过大会产生如下错误
Error occurred during initialization of VM
Could not reserve enough space for object heap
最后将spark文件复制到其他slaves上
运行sbin/start-all.sh就可以启动spark集群开始测试了。