大数据开发环境无外乎是离线和实时两套开发环境,不过目前已经流行实时数仓体系的搭建了,但是底层主要还是Hadoop集群环境,给予Hadoop集群的spark集群,以及hive、flink等中间件的搭建。
本篇文章主要是搭建伪分布式的hadoop集群以及spark集群,并安装hive、flink等离线和实时的开发中间件,并测试demo。
Hadoop伪分布式集群搭建
- 环境与依赖
JDK:1.8.0_221
Hadoop:2.7.7
spark:2.1.1
scala:2.11.8
系统:MacOS
- Hadoop安装和配置
1、安装JDK
选择最新版本下载,地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
安装完成之后,打开终端,输入java -version ,出现类似如下说明安装成功
2、配置ssh,无密码登录
cd ~/.ssh
ssh-keygen -t rsa #生成秘钥,之后一路回车即可,不需要输入任何内容。我之前已经生成过,所以提示是否overwrite。如果是第一次生成,不会有这个提示。
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys #将公钥复制到制定文件
ssh localhost#测试ssh连接,首次连接需要输入yes,但不需要输入密码,之后不需要输入yes,如果能不输入密码连接,就配置成功了
如果Connection refused,可以执行
sudo systemsetup -f -setremotelogin on
执行ssh localhost
2、下载Hadoop并修改
地址:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.7/
解压完成后,进入$HADOOP_HOME/etc/hadoop目录:
修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/Users/gaowei/Package/hadoop-2.7.7/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/Users/gaowei/Package/hadoop-2.7.7/tmp/dfs/data</value>
</property>
</configuration>
修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
剔除警告(可选):
目录$HADOOP_HOME/etc/hadoop/log4j.properties
添加:
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
3、启动hadoop
进入hadoop文件夹,用如下命令格式化
cd bin
./hadoop namenode –format
注意:如果多次hadoop namenode -format,如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。
所以每次重启都需要删除tmp,可以避免这个情况
rm -rf $HADOOP_HOME/tmp
hadoop namenode -format
启动Hadoop
sh $HADOOP_HOME/sbin/start-all.sh
结果:
HDFS监控页面查询:
http://localhost:50070/
Yarn监控页面查询:
http://localhost:8088/cluster
其他端口说明:
port 8088: cluster and all applications
port 50070: Hadoop NameNode
port 50090: Secondary NameNode
port 50075: DataNode
4、demo测试
结果:
调度情况:
Spark集群搭建
- 安装Scala
Scala 2.11.8下载链接:http://www.scala-lang.org/download/2.11.8.html
配置Scala
.bash_profile
export SCALA_HOME=/Users/gaowei/Package/scala-2.11.8
source /etc/profile 命令使修改生效,输入 scala 检查配置是否成功
2.安装spark
spark下载链接:http://archive.apache.org/dist/spark/spark-2.1.1/
下载完成后解压,并添加配置
cat .bash_profile
export LS_OPTIONS='--color=auto'
export CLICOLOR='Yes'
export LSCOLORS='CxfxcxdxbxegedabagGxGx'
export JAVA_HOME=$(/usr/libexec/java_home)
export MYSQL_HOME=/usr/local/mysql
#export SCALA_HOME=/usr/local/Cellar/scala/2.13.0
export SCALA_HOME=/Users/gaowei/Package/scala-2.11.8
export SPARK_HOME=/Users/gaowei/Package/spark-2.1.1-bin-hadoop2.7
export HADOOP_HOME=/Users/gaowei/Package/hadoop-2.7.7
PATH="$SCALA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$MYSQL_HOME/bin:$PATH"
source /etc/profile
进入Spark conf目录,复制并重命名spark-env.sh.template、log4j.properties.template、slaves.template
cp spark-env.sh.template spark-env.sh
cp log4j.properties.template log4j.properties
cp slaves.template slaves
添加配置到spark-env.sh
export JAVA_HOME=$(/usr/libexec/java_home)
export SCALA_HOME=/Users/gaowei/Package/scala-2.11.8
export SPARK_HOME=/Users/gaowei/Package/spark-2.1.1-bin-hadoop2.7
export HADOOP_HOME=/Users/gaowei/Package/hadoop-2.7.7
export SPARK_WORKER_MEMORY=1G
export HADOOP_CONF_DIR=/Users/gaowei/Package/hadoop-2.7.7/etc/hadoop
export SPARK_MASTER_IP=localhost
3.启动spark
/Users/gaowei/Package/spark-2.1.1-bin-hadoop2.7/sbin/start-all.sh
如果报错:
Stack trace: ExitCodeException exitCode=127:
修改:
hadoop-env.sh中的java_home环境变量修改为:
if [ "Darwin" == "$(uname -s)" ]; then
if [ -x /usr/libexec/java_home ]; then
export JAVA_HOME=$(/usr/libexec/java_home)
else
export JAVA_HOME=/Library/Java/Home
fi
fi
成功后:
UI访问:http://localhost:8080/
4.Demo测试
Yarn模式调度
yarn调度界面:
进入Log
结果能显示出来。
其中clinet模式可以在终端显示结果:
spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --driver-memory 1g --executor-memory 1g --executor-cores 1 ./spark-examples_2.11-2.1.1.jar 100
在Client模式下,Driver进程会在当前客户端启动,客户端进程一直存在直到应用程序运行结束。
工作流程如下:
- 启动master和worker . worker负责整个集群的资源管理,worker负责监控自己的cpu,内存信息并定时向master汇报
- 在client中启动Driver进程,并向master注册
- master通过rpc与worker进行通信,通知worker启动一个或多个executor进程
- executor进程向Driver注册,告知Driver自身的信息,包括所在节点的host等
- Driver对job进行划分stage,并对stage进行更进一步的划分,将一条pipeline中的所有操作封装成一个task,并发送到向自己注册的executor
- 进程中的task线程中执行
- 6.应用程序执行完成,Driver进程退出
在cluster模式下,Driver进程将会在集群中的一个worker中启动,而且客户端进程在完成自己提交任务的职责后,就可以退出,而不用等到应用程序执行完毕。
- 在集群的节点中,启动master , worker进程,worker进程启动成功后,会向Master进行注册。
- 客户端提交任务后,ActorSelection(master的actor引用),然后通过ActorSelection给Master发送注册Driver请求(RequestSubmitDriver)
- 客户端提交任务后,master通知worker节点启动driver进程。(worker的选择是随意的,只要worker有足够的资源即可)
- driver进程启动成功后,将向Master返回注册成功信息
- master通知worker启动executor进程
- 启动成功后的executor进程向driver进行注册
- Driver对job进行划分stage,并对stage进行更进一步的划分,将一条pipeline中的所有操作封装成一个task,并发送到向自己注册的executor
- 进程中的task线程中执行
- 所有task执行完毕后,程序结束