2013年4月,OpenStack社区知名厂商Mirantis正式宣布了基于OpenStack的开源BDaaS(BigData-as-a-Service)项目——Sahara(原名Savanna),正式开始了在OpenStack上构建大数据服务能力的努力。
Apache Hadoop是目前被广泛使用的主流大数据处理计算框架,Sahara项目旨在使用用户能够在Openstack平台上便于创建和管理Hadoop以及其他计算框架集群,实现类似AWS的EMR(Amazon Elastic MapReduce service)服务。
用户只需要提供简单的参数,如版本信息、集群拓扑、节点硬件信息等,利用Sahara服务能够在数分钟时间内快速地部署Hadoop、Spark、Storm集群。Sahara 还支持节点的弹性扩展,能够方便地按需增加或者减少计算节点,实现弹性数据计算服务。它特别适合开发人员或者QA在Openstack平台上快速部署大数据处理计算集群。
Sahara 与 OpenStack的Horizon(提供GUI)、Keystone(提供鉴权功能)、Nova(为了创建Hadoop集群虚拟机)、Heat(Sahara可以配置成使用Heat来协调Hadoop集群所需要的服务)、Glance(存放Hadoop虚拟机镜像)、Swift(可以用于存放Hadoop任务处理的数据)、Cinder(用于提供块存储)、Neutron(提供网络服务)、Ceilometer(用于收集集群的信息来达到计量和监控的目的)有交互。
它和其他Openstack组件交互,如图:
主要包括以下几个组件:
sahara提供两个层次的API,分别为集群管理(cluster provisioning)和任务管理(analytics as a service)。
通过sahara管理集群,用户主要需要操作以下三个实体对象:Node Group Templates, Cluster Templates and Clusters:
sahara允许用户自由组合节点角色,比如Job Tracker和NameNode可以运作在同一个虚拟机中,也可以分离在不同的虚拟机中。但是sahara会检查集群是否有效,比如不允许创建只有一系列DataNode节点但不存在NameNode节点的集群。
sahara遵从Openstack的通用访问策略,即支持租户、用户等权限管理。
yum install openstack-sahara gcc python-setuptools python-devel
配置文件位于/etc/sahara/sahara.conf 中。有关详细信息,请参阅官方 Sahara 配置指南。
创建数据库架构
sahara-db-manage --config-file /etc/sahara/sahara.conf upgrade head
创建keystone账号,并添加角色
keystone user-password-update --pass openstack sahara
keystone user-role-list --user sahara --tenant service
keystone user-role-add --user sahara --tenant service --role admin
添加keystone的endpoint
keystone service-create --name sahara --type data_processing \
--description "Sahara Data Processing"
keystone endpoint-create --service sahara --region RegionOne \
--publicurl "http://192.168.206.190:8386/v1.1/%(tenant_id)s" \
--adminurl "http://192.168.206.190:8386/v1.1/%(tenant_id)s" \
--internalurl "http://192.168.206.190:8386/v1.1/%(tenant_id)s"
修改mysql的配置
vim /etc/mysql/my.cnf
max_allowed_packet = 256M
修改完重启数据库服务
service mysql restart
登录数据库,创建sahara用户和sahara数据库,并添加权限
create user sahara IDENTIFIED by 'openstack';
grant alert,select,insert,update,delete,create,drop on sahara.* to sahara identified by 'openstack';
创建sahara的数据库表
sahara-db-manage --config-file /etc/sahara.conf upgrade head
进行Shara的配置,配置模板在/usr/local/share/sahara/sahara.conf.sample-basic目录下
cp /usr/local/share/sahara/sahara.conf.sample-basic /etc/sahara.conf
修改sahara.conf的配置文件(配置的含义,在/usr/local/share/sahara/sahara.conf.sample-basic中有比较详细的描述,需要配置rabbit database keystone等配置。
[DEFAULT]
use_neutron=true
use_floating_ips=false
debug=true
verbose=true
log_file=sahara.log
log_dir=/var/log
#plugins=vanilla,hdp,spark
rpc_backend = rabbit
rabbit_host=192.168.206.190
rabbit_port=5672
rabbit_hosts=$rabbit_host:$rabbit_port
rabbit_userid=guest
rabbit_password=openstack
rabbit_virtual_host=/
[database]
connection = mysql://sahara:openstack@192.168.206.190/sahara
[keystone_authtoken]
auth_uri = http://192.168.206.190:5000
identity_uri=http://192.168.206.190:35357/
admin_tenant_name = service
admin_user = sahara
admin_password = openstack
设置policy文件
在sahara配置文件的同一个目录(/etc/sahara)下,创建一个policy.json的文件,当然也可以在配置文件中指定policy_file 和 policy_dirs。
默认是运行所有用户访问所有的方法:
{
"default": ""
}
下面这个配置不允许非admin用户访问镜像的主要方法:
{
"default": "",
"images:register": "role:admin",
"images:unregister": "role:admin",
"images:add_tags": "role:admin",
"images:remove_tags": "role:admin"
}
启动 sahara-api 和 sahara-engine 服务
# systemctl start openstack-sahara-api
# systemctl start openstack-sahara-engine
配置开机启动
# systemctl enable openstack-sahara-api
# systemctl enable openstack-sahara-engine
指定环境变量
export OS_AUTH_URL=http://127.0.0.1:5000/v2.0/
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=nova
需要将虚拟机映像上传到 OpenStack 映像服务。您可以自己构建映像。本指南使用最新生成的 Ubuntu 原版镜像(称为 sahara-vanilla-latest-ubuntu.qcow2)和最新版本的 vanilla 插件作为示例。
将生成的镜像上传到 OpenStack Image 服务:
$ openstack image create sahara-vanilla-latest-ubuntu --disk-format qcow2 \
--container-format bare --file sahara-vanilla-latest-ubuntu.qcow2
+------------------+--------------------------------------+
| Field | Value |
+------------------+--------------------------------------+
| checksum | 3da49911332fc46db0c5fb7c197e3a77 |
| container_format | bare |
| created_at | 2016-02-29T10:15:04.000000 |
| deleted | False |
| deleted_at | None |
| disk_format | qcow2 |
| id | 71b9eeac-c904-4170-866a-1f833ea614f3 |
| is_public | False |
| min_disk | 0 |
| min_ram | 0 |
| name | sahara-vanilla-latest-ubuntu |
| owner | 057d23cddb864759bfa61d730d444b1f |
| properties | |
| protected | False |
| size | 1181876224 |
| status | active |
| updated_at | 2016-02-29T10:15:41.000000 |
| virtual_size | None |
+------------------+--------------------------------------+
记住镜像名称或保存映像 ID。这将在Sahara 镜像注册期间使用。您可以使用 openstack
命令行工具获取映像 ID,如下所示:
$ openstack image list --property name=sahara-vanilla-latest-ubuntu
+--------------------------------------+------------------------------+
| ID | Name |
+--------------------------------------+------------------------------+
| 71b9eeac-c904-4170-866a-1f833ea614f3 | sahara-vanilla-latest-ubuntu |
+--------------------------------------+------------------------------+
openstack dataprocessing image register sahara-vanilla-latest-ubuntu \
--username ubuntu
添加标签
$ openstack dataprocessing image tags add sahara-vanilla-latest-ubuntu \
--tags vanilla 1.2.1
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| Description | None |
| Id | 71b9eeac-c904-4170-866a-1f833ea614f3 |
| Name | sahara-vanilla-latest-ubuntu |
| Status | ACTIVE |
| Tags | 1.2.1, vanilla |
| Username | ubuntu |
+-------------+--------------------------------------+
可以使用以下命令获取有关可用插件的信息:
openstack dataprocessing plugin list
您还可以使用 plugin show 命令获取有关特定插件的可用服务的信息。例如:
$ openstack dataprocessing plugin show vanilla --plugin-version <plugin_version>
+---------------------+-----------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+---------------------+-----------------------------------------------------------------------------------------------------------------------+
| Description | The Apache Vanilla plugin provides the ability to launch upstream Vanilla Apache Hadoop cluster without any |
| | management consoles. It can also deploy the Oozie component. |
| Name | vanilla |
| Required image tags | <plugin_version>, vanilla |
| Title | Vanilla Apache Hadoop |
| | |
| Service: | Available processes: |
| | |
| HDFS | datanode, namenode, secondarynamenode |
| Hadoop | |
| Hive | hiveserver |
| JobFlow | oozie |
| Spark | spark history server |
| MapReduce | historyserver |
| YARN | nodemanager, resourcemanager |
+---------------------+-----------------------------------------------------------------------------------------------------------------------+
使用以下命令创建主节点组模板:
$ openstack dataprocessing node group template create \
--name vanilla-default-master --plugin vanilla \
--plugin-version <plugin_version> --processes namenode resourcemanager \
--flavor 2 --auto-security-group --floating-ip-pool <pool-id>
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| Auto security group | True |
| Availability zone | None |
| Flavor id | 2 |
| Floating ip pool | dbd8d1aa-6e8e-4a35-a77b-966c901464d5 |
| Id | 0f066e14-9a73-4379-bbb4-9d9347633e31 |
| Is boot from volume | False |
| Is default | False |
| Is protected | False |
| Is proxy gateway | False |
| Is public | False |
| Name | vanilla-default-master |
| Node processes | namenode, resourcemanager |
| Plugin name | vanilla |
| Security groups | None |
| Use autoconfig | False |
| Version | <plugin_version> |
| Volumes per node | 0 |
+---------------------+--------------------------------------+
使用以下命令创建工作线程节点组模板:
$ openstack dataprocessing node group template create \
--name vanilla-default-worker --plugin vanilla \
--plugin-version <plugin_version> --processes datanode nodemanager \
--flavor 2 --auto-security-group --floating-ip-pool <pool-id>
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| Auto security group | True |
| Availability zone | None |
| Flavor id | 2 |
| Floating ip pool | dbd8d1aa-6e8e-4a35-a77b-966c901464d5 |
| Id | 6546bf44-0590-4539-bfcb-99f8e2c11efc |
| Is boot from volume | False |
| Is default | False |
| Is protected | False |
| Is proxy gateway | False |
| Is public | False |
| Name | vanilla-default-worker |
| Node processes | datanode, nodemanager |
| Plugin name | vanilla |
| Security groups | None |
| Use autoconfig | False |
| Version | <plugin_version> |
| Volumes per node | 0 |
+---------------------+--------------------------------------+
您还可以创建节点组模板,设置标志-从卷引导。这将告知节点组从卷而不是映像启动其实例。此功能允许更轻松地进行实时迁移并提高性能。
$ openstack dataprocessing node group template create \
--name vanilla-default-worker --plugin vanilla \
--plugin-version <plugin_version> --processes datanode nodemanager \
--flavor 2 --auto-security-group --floating-ip-pool <pool-id> \
--boot-from-volume
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| Auto security group | True |
| Availability zone | None |
| Flavor id | 2 |
| Floating ip pool | dbd8d1aa-6e8e-4a35-a77b-966c901464d5 |
| Id | 6546bf44-0590-4539-bfcb-99f8e2c11efc |
| Is boot from volume | True |
| Is default | False |
| Is protected | False |
| Is proxy gateway | False |
| Is public | False |
| Name | vanilla-default-worker |
| Node processes | datanode, nodemanager |
| Plugin name | vanilla |
| Security groups | None |
| Use autoconfig | False |
| Version | <plugin_version> |
| Volumes per node | 0 |
+---------------------+--------------------------------------+
或者,您可以从 JSON 文件创建节点组模板。
创建一个名为 my_master_template_create.json 的文件,其中包含以下内容:
{
"plugin_name": "vanilla",
"hadoop_version": "<plugin_version>",
"node_processes": [
"namenode",
"resourcemanager"
],
"name": "vanilla-default-master",
"floating_ip_pool": "<floating_ip_pool_id>",
"flavor_id": "2",
"auto_security_group": true
}
创建一个名为 my_worker_template_create.json 的文件,其中包含以下内容:
{
"plugin_name": "vanilla",
"hadoop_version": "<plugin_version>",
"node_processes": [
"nodemanager",
"datanode"
],
"name": "vanilla-default-worker",
"floating_ip_pool": "<floating_ip_pool_id>",
"flavor_id": "2",
"auto_security_group": true
}
使用 openstack 客户端上传节点组模板:
openstack dataprocessing node group template create \
--json my_master_template_create.json
openstack dataprocessing node group template create \
--json my_worker_template_create.json
列出可用的节点组模板,以确保已正确添加它们:
$ openstack dataprocessing node group template list --name vanilla-default
+------------------------+--------------------------------------+-------------+--------------------+
| Name | Id | Plugin name | Version |
+------------------------+--------------------------------------+-------------+--------------------+
| vanilla-default-master | 0f066e14-9a73-4379-bbb4-9d9347633e31 | vanilla | <plugin_version> |
| vanilla-default-worker | 6546bf44-0590-4539-bfcb-99f8e2c11efc | vanilla | <plugin_version> |
+------------------------+--------------------------------------+-------------+--------------------+
记住主节点和工作节点组模板的名称或保存 ID,因为它们将在创建群集模板时使用。
使用以下命令创建群集模板:
$ openstack dataprocessing cluster template create \
--name vanilla-default-cluster \
--node-groups vanilla-default-master:1 vanilla-default-worker:3
+----------------+----------------------------------------------------+
| Field | Value |
+----------------+----------------------------------------------------+
| Anti affinity | |
| Description | None |
| Id | 9d871ebd-88a9-40af-ae3e-d8c8f292401c |
| Is default | False |
| Is protected | False |
| Is public | False |
| Name | vanilla-default-cluster |
| Node groups | vanilla-default-master:1, vanilla-default-worker:3 |
| Plugin name | vanilla |
| Use autoconfig | False |
| Version | <plugin_version> |
+----------------+----------------------------------------------------+
或者,可以从 JSON 文件创建群集模板:
创建一个名为 my_cluster_template_create.json 的文件,其中包含以下内容:
{
"plugin_name": "vanilla",
"hadoop_version": "<plugin_version>",
"node_groups": [
{
"name": "worker",
"count": 3,
"node_group_template_id": "6546bf44-0590-4539-bfcb-99f8e2c11efc"
},
{
"name": "master",
"count": 1,
"node_group_template_id": "0f066e14-9a73-4379-bbb4-9d9347633e31"
}
],
"name": "vanilla-default-cluster",
"cluster_configs": {}
}
使用 openstack 命令行工具上传集群模板:
openstack dataprocessing cluster template create --json my_cluster_template_create.json
记住群集模板名称或保存群集模板 ID,以便在集群配置中使用。可以在创建命令的输出中找到集群 ID,也可以通过列出集群模板找到,如下所示:
$ openstack dataprocessing cluster template list --name vanilla-default
+-------------------------+--------------------------------------+-------------+--------------------+
| Name | Id | Plugin name | Version |
+-------------------------+--------------------------------------+-------------+--------------------+
| vanilla-default-cluster | 9d871ebd-88a9-40af-ae3e-d8c8f292401c | vanilla | <plugin_version> |
+-------------------------+--------------------------------------+-------------+--------------------+
使用以下命令创建集群:
$ openstack dataprocessing cluster create --name my-cluster-1 \
--cluster-template vanilla-default-cluster --user-keypair my_stack \
--neutron-network private --image sahara-vanilla-latest-ubuntu
+----------------------------+----------------------------------------------------+
| Field | Value |
+----------------------------+----------------------------------------------------+
| Anti affinity | |
| Cluster template id | 9d871ebd-88a9-40af-ae3e-d8c8f292401c |
| Description | |
| Id | 1f0dc6f7-6600-495f-8f3a-8ac08cdb3afc |
| Image | 71b9eeac-c904-4170-866a-1f833ea614f3 |
| Is protected | False |
| Is public | False |
| Is transient | False |
| Name | my-cluster-1 |
| Neutron management network | fabe9dae-6fbd-47ca-9eb1-1543de325efc |
| Node groups | vanilla-default-master:1, vanilla-default-worker:3 |
| Plugin name | vanilla |
| Status | Validating |
| Use autoconfig | False |
| User keypair id | my_stack |
| Version | <plugin_version> |
+----------------------------+----------------------------------------------------+
或者,您可以从 JSON 文件创建群集模板:
创建一个名为 my_cluster_create.json 的文件,其中包含以下内容:
{
"name": "my-cluster-1",
"plugin_name": "vanilla",
"hadoop_version": "<plugin_version>",
"cluster_template_id" : "9d871ebd-88a9-40af-ae3e-d8c8f292401c",
"user_keypair_id": "my_stack",
"default_image_id": "71b9eeac-c904-4170-866a-1f833ea614f3",
"neutron_management_network": "fabe9dae-6fbd-47ca-9eb1-1543de325efc"
}
具有值my_stack的参数user_keypair_id是通过创建密钥对生成的。您可以在 OpenStack 仪表板中或通过 openstack 命令行客户端创建自己的密钥对,如下所示:
openstack keypair create my_stack --public-key $PATH_TO_PUBLIC_KEY
如果 sahara 配置为使用中子进行网络,则还需要在cluster create命令中包含 ----neutron-network 参数,或在 my_cluster_create.json 中包含 neutron_management_network 参数。如果您的环境不使用中子,则应省略这些参数。您可以使用以下命令确定中子网络 ID:
openstack network list
创建并启动群集:
openstack dataprocessing cluster create --json my_cluster_create.json
使用 openstack 命令行工具验证集群状态,如下所示:
$ openstack dataprocessing cluster show my-cluster-1 -c Status
+--------+--------+
| Field | Value |
+--------+--------+
| Status | Active |
+--------+--------+
群集创建操作可能需要几分钟才能完成。在此期间,从上一个命令返回的“状态”可能会显示Active以外的状态。还可以使用wait标志创建集群。在这种情况下,在将群集移动到Active”状态之前,群集创建命令将不会完成。
检查 Hadoop 安装是否正常工作。使用上面使用的 ssh 密钥通过 ssh 登录到 NameNode(通常是主节点):
ssh -i my_stack.pem ubuntu@<namenode_ip>
#切换到 hadoop 用户
sudo su hadoop
#转到共享的Hadoop目录并运行最简单的MapReduce示例
cd /opt/hadoop-<plugin_version>/share/hadoop/mapreduce
/opt/hadoop-<plugin_version>/bin/hadoop jar hadoop-mapreduce-examples-<plugin_version>.jar pi 10 100
祝贺!您的Hadoop集群已准备就绪,可以在OpenStack云上运行。
作业二进制文件是你为作业定义/上传源代码(主电源和库)的实体。首先,您需要将二进制文件或脚本下载到 swift 容器,并使用以下命令在Sahara中注册您的文件:
(openstack) dataprocessing job binary create --url "swift://integration.sahara/hive.sql" \
--username username --password password --description "My first job binary" hive-binary
数据源是存放作业的输入和输出的实体。您可以创建与 Swift、manila或 HDFS 相关的数据源。您需要设置数据源的类型(swift,hdfs,manila,maprfs),名称和url。接下来的两个命令将在 swift 中创建输入和输出数据源。
$ openstack dataprocessing data source create --type swift --username admin --password admin \
--url "swift://integration.sahara/input.txt" input
$ openstack dataprocessing data source create --type swift --username admin --password admin \
--url "swift://integration.sahara/output.txt" output
如果要在 hdfs 中创建数据源,请使用有效的 hdfs url:
$ openstack dataprocessing data source create --type hdfs --url "hdfs://tmp/input.txt" input
$ openstack dataprocessing data source create --type hdfs --url "hdfs://tmp/output.txt" output
在此步骤中,您需要创建作业模板。您必须使用 type 参数设置作业模板的类型。使用在上一步中创建的作业二进制文件选择主库,并为作业模板设置名称。
命令示例:
$ openstack dataprocessing job template create --type Hive \
--name hive-job-template --main hive-binary
要启动作业,需要传递以下参数:
例如:
$ openstack dataprocessing job execute --input input --output output \
--job-template hive-job-template --cluster my-first-cluster
可以使用以下命令检查作业的状态:
$ openstack dataprocessing job show <id_of_your_job>
如果有工作输出数据。祝贺你!
参考来源:https://docs.openstack.org/sahara/ latest/user/quickstart.html