spark1.6.0+Hadoop2.6.0+Scala-2.11.7 搭建分布式集群

这篇博客主要记录了如何使用虚拟机搭建Hadoop分布式集群,包括主从机互ping、无密码登录配置以及Hadoop集群的测试。接着介绍了Spark集群的搭建过程,涉及Scala安装、环境配置以及启动集群。最后提到了在IntelliJ中使用Scala进行Spark开发的基础配置和源码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天又捣鼓了一下,网上有些写得很不错的教程,自己经过尝试后觉得需要整理一下。
spark的运行模式有多种(见官网和Spark的Standalone模式安装部署):

  • local(本地模式):常用于本地开发测试,本地还分为local单线程和local-cluster多线程;
  • standalone(集群模式):典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark支持ZooKeeper来实现 HA
  • on yarn(集群模式): 运行在 yarn 资源管理器框架之上,由 yarn 负责资源管理,Spark 负责任务调度和计算
  • on mesos(集群模式): 运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算
  • on cloud(集群模式):比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3;Spark 支持多种分布式存储系统:HDFS 和 S3

本文主要记录的是基于standalone的方式和基于集群的方式。

1 用虚拟机搭建Hadoop分布式集群

虚拟机安装
由于主要的实验室环境是Ubuntu系统的服务器,内存大约为64G,使用的虚拟机为virtualbox,在官网下载,安装步骤略。注意,请用相同的用户名创建,这会为后面省去很多麻烦。
这里写图片描述
主从机互ping
随后将两个guest机配置成slave1和slave2,host机作为master,这里主要需要注意的是通信问题。
要让彼此都ping通,有一点小技巧,我是参照这个教程来做的。
https://2buntu.com/articles/1513/accessing-your-virtualbox-guest-from-your-host-os/
简言之,在默认NAT的模式下,guest是可以直接访问host的,也可以互相访问,但是host不能访问guest,不过通过添加host-only networks,再在guest端添加对应的适配器,host和guest就在同一个网段了。
将它们对应的ip都添加到各自的/etc/hosts文件中。
无密码登陆
在ping通后,我们希望可以无密码登陆,具体要做的事情是从机分别将公钥发给主机,然后主机综合所有的公钥(包括它自己的),将authorized_keys复制到slave1和slave2的~/.ssh目录下。如果要从图形界面观看这个文件夹,由于它是隐藏的,可以按ctrl+H键显示出来。
操作流程:
1) 安装ssh : sudo apt-get install openssh-server
安装完成后使用ssh命令登陆本机 ssh localhost
2)
exit # 退出刚才的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,都按回车就可以
3) 在从机slave1和slave2上重复这个步骤,随后利用scp传输:
在slave1上:scp id_rsa.pub singleton@master:~/.ssh/id_rsa.pub.slave1
在slave2上:scp id_rsa.pub singleton@master:~/.ssh/id_rsa.pub.slave2
在master上:

cat id_rsa.pub >> authorized_keys
cat id_rsa.pub.slave1 >> authorized_keys
cat id_rsa.pub.slave2 >> authorized_keys

随后将master的公钥信息authorized_keys复制到slave1和slave2对应目录下,就可以实现无密码登陆了。
修改master、slave1、slave2的配置文件
详细的修改策略可以参考:
http://www.powerxing.com/install-hadoop/
注意不能完全照搬,这里我打算将master既作为主节点,又作为计算节点,所以修改slaves为:
master
slave1
slave2
同时三台机器上的’dfs.replication’值设置为3,就是说数据会有3份备份。

测试Hadoop分布式集群环境
首先确保每台机器的JAVA_HOME都已经准确设置了,就可以按照教程测试了。
测试步骤请同样参考 http://www.powerxing.com/install-hadoop/

2 Spark集群的搭建

安装scala,并设置SCALA_HOME,在3台机器上都做同样配置。
由于我一开始下载的版本是2.11.7所以我自己重新编译了一下。
在官网下载:http://spark.apache.org/downloads.html
Scala 2.11 users should download the Spark source package and build with Scala 2.11 support.

./dev/change-scala-version.sh 2.11
./build/mvn -Pyarn -Phadoop-2.6 -Dscala-2.11 -DskipTests clean package

配置Spark的运行环境,将spark-env.sh.template模板文件复制成spark-env.sh,然后填写相应需要的配置内容
具体的说明可见相应template中注释掉的内容
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORDER_INSTANCES=1
export SPARK_WORKER_MEMORY=5g
或者参考:
https://taoistwar.gitbooks.io/spark-operationand-maintenance-management/content/spark_install/spark_standalone_configuration.html

修改该conf/slaves文件,写入各节点的主机名,master本身也作为工作节点:
master
slave1
slave2

启动集群,首先启动hadoop集群,简单的方式就是在

~/hadoop/sbin/start-all.sh

在master上jps可以看到:
namenode
nodemanager
resourcemanager
secondarynamenode
datanode
随后启动spark集群

~/spark/sbin/start-all.sh

此时会多出
worker
master

3. Intellij

在intellij中以scala进行开发,一个图文教程可见:
http://smartdata.vn/index.php/component/k2/item/66-apache-spark-programming-for-beginner-with-intellij-idea

附上一段work的源码

/**
  * Created by singleton on 4/8/16.
  */
import scala.math.random
import org.apache.spark._
object RemoteDebug {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Spark Pi").setMaster("spark://master:7077")
      .setJars(List("/home/singleton/GraduateWorkshop/SparkRemote/out/artifacts/SparkRemote_jar/SparkRemote.jar"))
    val spark = new SparkContext(conf)
    val slices = if (args.length > 0) args(0).toInt else 2
    val n = 100000 * slices
    val count = spark.parallelize(1 to n, slices).map { i =>
      val x = random * 2 - 1
      val y = random * 2 - 1
      if (x * x + y * y < 1) 1 else 0
    }.reduce(_ + _)
    println("Pi is roughly " + 4.0 * count / n)
    spark.stop()
  }
}

相关的配置步骤可以按照参考教程:
Windows下IntelliJ IDEA中调试Spark Standalone
http://www.cnblogs.com/yuananyun/p/4265706.html


推荐阅读:
除博文中给出的链接外:
spark on YARN集群部署:
http://wuchong.me/blog/2015/04/04/spark-on-yarn-cluster-deploy/

### OmegaConf 配置管理简介 OmegaConf 是一个强大的 Python 库,用于处理复杂的配置文件。它支持多种数据结构(如字典、列表)以及 YAML 文件的解析和操作。以下是有关如何使用 OmegaConf 的详细介绍。 #### 创建配置对象 可以通过 `OmegaConf.create` 方法创建一个新的配置对象。该方法可以接受字典、YAML 字符串或其他兼容的数据结构作为输入[^1]。 ```python import omegaconf from omegaconf import OmegaConf config_dict = {"database": {"host": "localhost", "port": 6379}} config = OmegaConf.create(config_dict) print(OmegaConf.to_yaml(config)) # 将配置转换为 YAML 格式的字符串 ``` #### 加载外部 YAML 文件 如果需要加载外部 YAML 文件,可使用 `OmegaConf.load` 方法。这使得程序能够轻松读取并应用存储在磁盘上的配置文件。 ```python yaml_file_path = "./example_config.yaml" file_conf = OmegaConf.load(yaml_file_path) # 打印加载后的配置内容 print(file_conf.database.host) # 输出 'localhost' ``` #### 合并多个配置源 当存在多个配置来源时(如默认设置与命令行参数),可以使用 `OmegaConf.merge` 来无缝合并它们。此功能允许开发者优先级较高的配置覆盖较低级别的配置项。 ```python default_configs = OmegaConf.create({"model": {"type": "resnet50"}}) cli_args = OmegaConf.from_dotlist(["model.type=vgg16"]) merged_config = OmegaConf.merge(default_configs, cli_args) assert merged_config.model.type == "vgg16" # 命令行参数成功覆盖默认值 ``` #### 动态更新配置 除了静态定义外,还可以通过访问器动态修改现有配置中的字段。这种灵活性非常适合运行时调整某些超参数或环境变量。 ```python dynamic_update = file_conf.copy() dynamic_update.database.port = 8080 print(dynamic_update.database.port) # 输出新的端口号 8080 ``` #### 错误处理机制 为了防止非法赋值破坏整个系统的稳定性,OmegaConf 提供了严格的模式控制选项。启用严格模式后,任何未声明过的键都将引发异常提示用户修正错误。 ```python strict_mode_enabled = file_conf.copy() strict_mode_enabled.set_struct(True) # 开启只读保护状态 try: strict_mode_enabled.new_field = True # 此处会抛出 AttributeError 异常 except AttributeError as e: print(f"Catch expected error: {e}") ``` --- ### 总结 以上展示了 OmegaConf 在不同场景下的典型用法,包括但不限于初始化配置实、加载外部资源、融合多层设定逻辑以及实施安全防护措施等方面的功能特性。希望这些子能帮助快速掌握其核心概念和技术要点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值