我正在尝试配置一个 Hadoop
集群,但为此我需要 namenode
的 IP 地址。
集群本身由 Vagrant
创建,但在 vagrant 在 AWS 中创建实例之前我没有 IP 地址。
所以,我有以下 Vagrantfile
:
current_dir = File.dirname(__FILE__)
$master_script = <<SCRIPT
// will write a script to configure
SCRIPT
Vagrant.configure("2") do |config|
config.omnibus.chef_version = :latest
config.vm.provider :aws do |aws, override|
config.vm.box = "dummy"
aws.access_key_id = "MY_KEY"
aws.secret_access_key = "SECRET_KEY"
aws.keypair_name = "my_key"
aws.ami = "ami-7747d01e"
override.ssh.username = "ubuntu"
override.ssh.private_key_path = "#{current_dir}/my_key.pem"
end
config.vm.provider :virtualbox do |v|
config.vm.box = "precise64"
config.vm.box_url = "https://vagrantcloud.com/chef/ubuntu-13.04/version/1/provider/virtualbox.box"
v.customize ["modifyvm", :id, "--memory", "1024"]
end
config.vm.define :namenode do |namenode|
namenode.vm.box = "dummy"
namenode.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.roles_path = "roles"
chef.add_role "cluster"
end
namenode.vm.provision :hostmanager
namenode.vm.provision "shell", :inline => $master_script
end
config.vm.define :slave do |slave|
slave.vm.box = "dummy"
slave.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.roles_path = "roles"
chef.add_role "cluster"
end
slave.vm.provision :hostmanager
slave.vm.provision "shell", :inline => $master_script
end
end
我需要使用名称节点的 ip 地址
更新 mapred-site.xml 和 core-site.xml
文件。我怎样才能获得 namenode
框的 ip 地址,以便我可以更新 hadoop 配置文件? Recipe 中是否有更好的选择可以用来完成它?
假设我有 1 个 namenode
和 5 个 slaves
,mapred-site.xml.erb
模板将如下所示:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://<%= node[:ipaddress] %>:8021</value>
</property>
</configuration>
但是,我需要所有的 namenode
和 slaves
都只有 namenode
的 IP 地址。我怎样才能在 chef
中完成它?
无论哪种方式都适合我,即使我更喜欢 chef
解决方案。
最佳答案
你可以:
1-使用namenode实例上的实例元数据服务找出自己的ip:
curl http://169.254.169.254/latest/meta-data/local-ipv4
参见:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
2- 标记名称节点(例如:HADOOP_ROLE=NAMENODE)并在任何实例上使用 AWS CLI 查找名称节点的本地 ip:
aws ec2 describe-instances \
--region=us-east-1 \
--filter "Name=tag:HADOOP_ROLE,Values=NAMENODE" \
--query='Reservations[*].Instances[*].PrivateIpAddress' \
--output=text
参见:http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html
关于ruby-on-rails - 如何在 Vagrant 中获取 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23372760/