首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Hadoop手把手逐级搭建(2) Hadoop完全分布式(full)

前置步骤: 1). 第一阶段:Hadoop单机伪分布(single) 第二阶段: Hadoop完全分布式(full) 0. 步骤概述 1). 克隆4台虚拟机 2). 为完全分布式配置ssh免密 3). 将hadoop配置修改为完全分布式 4). 启动完全分布式集群 5). 在完全分布式集群上测试wordcount程序 1. 克隆4台虚拟机 1.1 使用hadoop0克隆4台虚拟机hadoop1,hadoop2,hadoop3,hadoop4 1.1.0 克隆虚拟机hadoop1 1.1.1 右键点击当前虚拟机hadoop0 1.1.2 在右键菜单选中“管理” 1.1.3 在“管理”的子菜单选中“克隆” 1.1.4 弹出“克隆虚拟机向导”窗口 1.1.5 点击“下一步”进入“克隆源”选择窗口 1.1.6 在“克隆源”中选择“虚拟机当前状态”或者“现有快照(仅限关闭的虚拟机)(S):” 1.1.7 点击下一步进入“克隆类型”窗口 1.1.8 选择“创建完整克隆”,点击下一步 1.1.9 在“新虚拟机名称”窗口,“虚拟机名称(V)”中填入新虚拟机“hadoop1”,“位置(L)”中选择目录 1.1.10 点击“完成”开始克隆 1.2生成新的mac地址 1.2.1 右键点击新建的虚拟机hadoop1 1.1.2在右键菜单选中点击“设置” 1.1.3 在“虚拟机设置”窗口,“硬件”标签下,选中“网络适配器” 1.1.4 在窗口右侧点击“高级” 1.1.5 在“网络适配器高级设置”窗口最下方“MAC 地址(M)”一栏点击“生成” 1.1.6 点击“确定”使设置生效 1.3 修改主机名 1.3.1 启动新虚拟机hadoop1 1.3.2 修改network中的HOSTNAME 1.3.2.1 修改生效前命令提示符中现有的主机名还是hadoop0 [root@hadoop0 ~]# vim /etc/sysconfig/network HOSTNAME=hadoop1 1.3.2.2 修改完成后/etc/sysconfig/network完整内容如下 NETWORKING=yes HOSTNAME=hadoop1 GATEWAY=192.168.111.2 1.4 修改hadoop1的IP地址 14.1.1 修改hadoop1的IP地址为192.168.111.211 [root@hadoop0 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=192.168.111.211 1.4.2 修改完成后/etc/sysconfig/network-scripts/ifcfg-eth0完整内容如下 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.111.211 NETMASK=255.255.255.0 GATEWAY=192.168.111.2 1.5 删除70-persistent-net.rules文件 [root@hadoop0 ~]# rm -rf /etc/udev/rules.d/70-persistent-net.rules 1.6 重启虚拟机使配置生效 [root@hadoop0 ~]# init 6 1.7 查看主机名:命令提示符中主机名已变成hadoop1 [root@hadoop1 ~]# hostname hadoop1 1.8 测试外网是否畅通 [root@hadoop1 ~]# ping baidu.com 64 bytes from 111.13.101.208: icmp_seq=1 ttl=128 time=5.50 ms 64 bytes from 111.13.101.208: icmp_seq=1 ttl=128 time=5.50 ms #如果返回如上信息表示网络畅通 1.9 克隆另外3台虚拟机 使用同样的方式克隆并配置另外3台虚拟机,分别命名为hadoop2,hadoop3,hadoop4 2. 为完全分布式配置ssh免密 2.1 在hadoop1上修改hosts文件 2.1.1 将/etc/hosts文件内容替换如下 [root@hadoop1 ~]# vim /etc/hosts 192.168.111.211 hadoop1 192.168.111.212 hadoop2 192.168.111.213 hadoop3 192.168.111.214 hadoop4 2.1.2 将hadoop1上的/etc/hosts分发到hadoop2,hadoop3,hadoop4三个节点 [root@hadoop1 ~]# scp /etc/hosts hadoop2:/etc/hosts [root@hadoop1 ~]# scp /etc/hosts hadoop3:/etc/hosts [root@hadoop1 ~]# scp /etc/hosts hadoop4:/etc/hosts 2.2 在hadoop1上生成密匙 [root@hadoop1 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 2.3 设置本机ssh免密 [root@hadoop1 ~]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 2.4 将hadoop1生成的公匙拷贝到hadoop2 2.4.1 拷贝过程中需要输入hadoop2的密码 [root@hadoop1 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub hadoop2 root@hadoop2's password: Now try logging into the machine, with "ssh 'hadoop2'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. 2.4.2 同理,将公匙拷贝hadoop3和hadoop4 2.5 测试从hadoop1通过ssh连接到hadoop2 2.5.1 ssh到hadoop2 [root@hadoop1 ~]# ssh hadoop2 Last login: Mon Nov 27 04:10:16 2017 from 192.168.111.211 2.5.2无需输入密码直接进入hadoop2,说明免密成功 [root@hadoop2 ~] 2.6 退出hadoop2连接,回到hadoop1 2.6.1 使用exit命令退出 [root@hadoop2 ~]# exit logout Connection to hadoop2 closed. 2.6.2 命令提示符显示已经回到hadoop1 [root@hadoop1 ~]# 3. 将hadoop配置修改为完全分布式 3.0 进入$HADOOP_HOME/etc/hadoop目录 [root@hadoop1 ~]# cd /opt/test/hadoop-2.6.5/etc/hadoop 3.1 修改core-site.xml配置 # 将$HADOOP_HOME/etc/hadoop/core-site.xml内容替换如下 [root@hadoop1 hadoop]# vim core-site.xml <configuration> <!-- 修改defaultFS为hadoop1--> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop1:9000</value> </property> <!-- 修改了临时文件存放位置--> <property> <name>hadoop.tmp.dir</name> <value>/var/test/hadoop/full</value> </property> </configuration> 3.2 修改hdfs-site.xml配置 # 将$HADOOP_HOME/etc/hadoop/hdfs-site.xml内容替换如下 [root@hadoop1 hadoop]# vim hdfs-site.xml <configuration> <!-- 将备份数修改为3,小于等于当前datanode数目即可--> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- 将secondary namenode改为hadoop2--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop2:50090</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> </property> <property> <name>dfs.namenode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration> 3.3 修改yarn-site.xml # 将$HADOOP_HOME/etc/hadoop/yarn-site.xml内容替换如下 [root@hadoop1 hadoop]# vim yarn-site.xml <configuration> <!-- 添加了yarn.resourcemanager.hostname 属性--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 添加了yarn.nodemanager.auxservices.mapreduce.shuffle.class属性--> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration> 3.4 配置salves文件 # 将$HADOOP_HOME/etc/hadoop/slaves内容替换如下 [root@hadoop1 hadoop]# vim slaves hadoop2 hadoop3 hadoop4 3.5 分发hadoop配置到所有节点 [root@hadoop1 hadoop]# scp core-site.xml hdfs-site.xml yarn-site.xml slaves hadoop2:`pwd` [root@hadoop1 hadoop]# scp core-site.xml hdfs-site.xml yarn-site.xml slaves hadoop3:`pwd` [root@hadoop1 hadoop]# scp core-site.xml hdfs-site.xml yarn-site.xml slaves hadoop4:`pwd` 3.6 分发hosts文件到所有节点 [root@hadoop1 hadoop]# scp /etc/hosts hadoop2:/etc/ [root@hadoop1 hadoop]# scp /etc/hosts hadoop3:/etc/ [root@hadoop1 hadoop]# scp /etc/hosts hadoop4:/etc/ 4. 启动完全分布式集群 4.1 在hadoop1上重新格式化namenode [root@hadoop1 ~]# hdfs namenode -format 4.2 在hadoop1上启动集群 [root@hadoop1 ~]# start-dfs.sh 4.3 在hadoop1上启动yarn [root@hadoop1 ~]# start-yarn.sh 4.4 在各节点上查看进程 4.4.1 节点hadoop1 [root@hadoop1 ~]# jps 1466 NameNode 1756 ResourceManager 2014 Jps 4.4.2 节点hadoop2 [root@hadoop2 ~]# jps 1663 Jps 1546 NodeManager 1397 DataNode 1454 SecondaryNameNode 4.4.3 节点hadoop3 [root@hadoop3 ~]# jps 1599 Jps 1457 NodeManager 1399 DataNode 4.4.4 节点hadoop4 [root@hadoop4 ~]# jps 1411 DataNode 1475 NodeManager 1613 Jps 5. 在完全分布式集群上测试wordcount程序 5.1 从hadoop1进入$HADOOP_HOME/share/hadoop/mapreduce/目录 [root@hadoop1 ~]# cd /opt/test/hadoop-2.6.5/share/hadoop/mapreduce/ 5.2上传test.txt文件到根目录 5.2.1 默认上传 [root@hadoop1 mapreduce]# hadoop fs -put test.txt / 5.2.2 也可以指定blocksize上传 [root@hadoop1 mapreduce]# hdfs dfs -D dfs.blocksize=1048576 -put test.txt / 5.3 运行wordcount测试程序,输出到/output [root@hadoop1 mapreduce]# hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /test.txt /output #运行时会首先看到如下信息 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 5.4 查看mapreduce运行结果 [root@hadoop1 mapreduce]# hadoop dfs -text /output/part-* hello 100003 world 200002 “hello 100000 后续步骤: 3). 第三阶段:Hadoop高可用(HA) 4). 第四阶段:Hadoop高可用+联邦+视图文件系统(HA+Federation+ViewFs)

优秀的个人博客,低调大师

Centos7服务器下apache网站环境搭建与wordpress

需要安装apache,php,mariadb 安装Apache yum install -y httpd apache启动并设置开机自启 systemctl start httpd.service systemctl enable httpd.service 安装PHP及其各项服务 yum -y install php php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel php-mysql 安装MariaDB数据库 yum -y install mariadb-server mariadb-client mariadb启动并设置开机自启 systemctl start mariadb.service systemctl enable mariadb.service 给数据库root用户设置密码 mysqladmin -u root password //以root身份登录,回车后输入密码 登录数据库 mysql -u root -p //回车后输入设置的密码 登录数据库后,可以新建其他用户并授全权 grant all privileges on mysql.* to 用户名@localhost identified by '用户名.me'; //修改用户为自己想建的用户名 update mysql.user set password=password('密码') where User="用户名" and Host="localhost"; //给新建用户设置密码 flush privileges; //更新数据库 exit; //退出数据库 防火墙开启80端口 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd –reload //更新防火墙规则 解压wordpress tar -zxvf wordpress-4.7.4-zh_CN.tar.gz //默认应该是解压到/root/wordpress目录下 cp -fr /root/wordpress/* /var/www/html //复制wordpress所有文件到apache根目录 chown -R apache:root /var/www/html/ //不更改权限会导致主题和插件安装不了 浏览器输入服务器公网ip/域名,开始安装wordpress 注意:数据库名为mysql,用户名和密码为刚才在mariadb新建的用户名和密码,wp_表前缀最好修改,_不要删除 提交以后会提示无法写入wp-config.php,需要新建,然后把内容复制到里面 touch /var/www/html/wp-config.php vim /var/html/wp-config.php 全部内容都复制进去,保存退出,点击提交 开始设置网站标题和后台用户名和密码,不再赘述 修改wordpress文件上传上限以及执行脚本时间限制: vim /etc/php.ini 找到upload_max_filesize=2M,修改为upload_max_filesize=20M 找到post_max_size = 8M,修改为post_max_size = 20M 找到max_execution_time=30,修改为max_execution_time=0,这里的0表示没有时间限制

优秀的个人博客,低调大师

ELK实时日志分析平台(elk+kafka+metricbeat)-搭建说明(一)

数据流向: metricbeat->kafka->logstash->elasticsearch->kibana. 应用分布: 主机 应用 备注 192.168.30.121 java version "1.8.0_144" zookeeper-3.4.10.tar.gz kafka_2.12-0.11.0.0.tgz elasticsearch-5.5.1.tar.gz logstash-5.5.1.tar.gz kibana-5.5.1-linux-x86_64.tar.gz 192.168.30.122 java version "1.8.0_144" zookeeper-3.4.10.tar.gz kafka_2.12-0.11.0.0.tgz elasticsearch-5.5.1.tar.gz 192.168.30.123 java version "1.8.0_144" zookeeper-3.4.10.tar.gz kafka_2.12-0.11.0.0.tgz elasticsearch-5.5.1.tar.gz 192.168.30.125 客户端 metricbeat-5.5.1-linux-x86_64 本文转自 zhuxtqw 51CTO博客,原文链接:http://blog.51cto.com/1054054/1963636,如需转载请自行联系原作者

优秀的个人博客,低调大师

[Unity for android]Unity在安卓机上调试的测试环境搭建

一、工具准备 1.JDK——由于android是基于Java平台开发的,jdk是必须要安装的。下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe 2.Android SDK——这个就不多说了,要开发android程序必备的。可以去官网下载。下载地址:http://developer.android.com/sdk/index.html#download 3.UnityRemote.apk——这个是安装在android设备上的。大家可以到我的资源中下载。下载地址:http://download.csdn.net/detail/zuoyamin/6289709 二、工具安装 1、JDK安装 jdk的安装没什么好说的,和一般安装软件没什么区别。在这里主要说一下环境变量的配置,其实网上都有的!!! 右击 【计算机】→【属性】→【高级系统设置】,在系统属性窗口中,选择【环境变量】。点击【新建】, 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.6.0(以JDK实际路径为准!) 确认后,再【新建】 变量名:classpath 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意开头有“.;”) 如果没有Path变量,就新建一个,如果有就打开! 变量名:Path 变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(注意变量值之间用“;”隔开) 现在就可以检验jdk是否安装成功了。开始→运行→输入cmd,在命令行窗口中输入javac,出现命令列表说明安装成功。 2、Android SDK安装 解压下载的sdk文件,双击【SDK Manager】,选择需要安装的包进行下载。在下载的过程中可能存在失败的信息。解决方法:打开C:\Windows\System32\drivers\etc下的hosts文件。由于他是只读的,我们可以先将他复制出去,用记事本打开,然后在粘贴回来覆盖掉就行了。在hosts文件的最后一行添加:74.125.237.1 dl-ssl.google.com就可以很好的下载了! Android SDK环境变量的配置: 变量名:ANDROID_SDK_HOME 变量值:X:\Program Files\adt-bundle\sdk(以实际sdk路径为准) 如果有Path变量就打开Path变量,没有就新建一个。 有的话在变量值后面追加:%ANDROID_SDK_HOME%\platform-tools;%ANDROID_SDK_HOME%\tools; 现在检验android sdk是否安装成功了。启动命令行,输入android -h,出现命令列表说明安装成功! 3、UnityRemote.apk安装。 在一个安装有android 4.0或4.0+的手机或者平板电脑上安装unityRemote.apk即可。这里为什么要选择是4.0或4.0+呢?具体详细原因不清楚,我只知道只有这个版本才能进行调试。所以大家要注意了。 三、测试 1、打开unity3D软件,进行一些配置,选择【edit】→【Perferences】,在External Tools中,有个Android SDK Location,我们将前面安装的Android SDK的路径设置进去。 2、将安装有unityRemote的手机或者平板电脑,连接到PC上,通过各种手机助手就可以了!保证手机与电脑是连接的就好了。 3、启动手机中unityRemote软件,然后在PC上运行某个Untiy程序,这里我们就可以在手机上看到Untiy的Game视图的场景了。只是分辨率有些不够理想,但是用于测试还是足够的! 4、如果不行,重启Unity3d和手机,在重复上述操作!祝大家顺利! 软件下载:http://download.csdn.net/detail/s10141303/6536557 本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366368 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

PhoneGap+jQm webapp本地化(1)--环境搭建以及资源介绍

前言 上个月我设计一个基于JQM的webapp作为我的毕业设计 jQuery moible 开发笔记之项目设计 http://www.cnblogs.com/youxilua/archive/2012/01/03/2310963.html 结果…当然是做完了…效果嘛,作为毕业设计还可以,但是实际使用起来实在不给力,例如,窗口的浮动,流量的消耗,还有对于设备配置的依赖(例如,在局域网中HTC 野火跑起来那叫一个慢死…),不过,在一些高端设备运行还可以,例如,小米(我们班还是挺多人买了),iphone,三星的银河系列… 工欲善其事,必先利其器 我们没必要学习苦行僧那样,用记事本来打代码.目前而言呢,phonegap的IDE工具最好的当然是DW CS 5.5. 不过,我这里使用eclipse作为我的开发IDE,因为之前使用过DW CS 5.5 ,这次就换个IDE工具. Eclipse 的配置 1,一站式新建项目 phonegap + jqm http://svn.codespot.com/a/eclipselabs.org/mobile-web-development-with-phonegap/tags/r1.2/download/ 这个插件还是很给力的,已经支持默认支持最新版本的phonegap,jqm,sencha 安装完以后选择这个图标 2,选择要建何种类型的phoneGap (1),默认已经支持直接创建最新版本的phoneGap (2),这个插件支持两大移动js框架jqm & Sencha Touch,当然..这两个框架只能二选一了,你不选也行… (3),我这里选择我最为熟悉的jQm框架,默认已经支持最新版本了 3,接着,创建android项目即可 接下来就不啰嗦了… 完成以后:项目结构,activity都已经写好的了.. 代码也已经写好了. 注意:新建完以后,可能androidmainifest会报错,你把报错的那行代码删掉即可,你也可以根据那个代码要求找一个支持xlarge包的android版本(4.0吧)(貌似2.2没有这玩意),我这里省事直接删掉算了… 自带例子简单介绍 在新建一个page,想使用插件帮你打包好的API你需要以下步骤 1,准备JS文件,滑轮到index.html文件最后几行; //这个JS是必须的,调用的是设备的初始化 <script type="text/javascript" charset="utf-8" src="apis/device.js"></script> //以下API自己按照自己的喜好调用和修改吧 <script type="text/javascript" charset="utf-8" src="apis/accelerometer.js"></script> <script type="text/javascript" charset="utf-8" src="apis/camera.js"></script> <script type="text/javascript" charset="utf-8" src="apis/capture.js"></script> <script type="text/javascript" charset="utf-8" src="apis/compass.js"></script> <script type="text/javascript" charset="utf-8" src="apis/connection.js"></script> <script type="text/javascript" charset="utf-8" src="apis/contacts.js"></script> <script type="text/javascript" charset="utf-8" src="apis/events.js"></script> <script type="text/javascript" charset="utf-8" src="apis/file.js"></script> <script type="text/javascript" charset="utf-8" src="apis/geolocation.js"></script> <script type="text/javascript" charset="utf-8" src="apis/media.js"></script> <script type="text/javascript" charset="utf-8" src="apis/notification.js"></script> <script type="text/javascript" charset="utf-8" src="apis/storage.js"></script> 2,在body上调用init()方法,具体使用参见device.js. <body onload="init();"> 3,顺便你写了… 例子演示 感觉,这个跟这个jqm一起的例子,个人感觉比官方那个好很多…截个图,结束吧… 顺便介绍两本有关于phonegap的书 http://book.douban.com/subject/6954116/ http://book.douban.com/subject/6915788/ 下载?反白可见…不希望外传… http://www.kuaipan.cn/file/id_2622545685705289.html http://www.kuaipan.cn/file/id_2622545685705398.html 下次讲讲数据库的调用和摄像头的本地保存吧… 本文转自 liam2199 博客,原文链接: http://blog.51cto.com/youxilua/776689 如需转载请自行联系原作者

优秀的个人博客,低调大师

如何使用Docker、Docker-Compose和Rancher搭建部署Pipeline(四)

在这篇文章中,我们将讨论如何用Rancher实现consul的服务发现。 如果你还没有准备好,推荐你阅读本系列中先前的文章: 第一篇:CI /CD和Docker入门 第二篇:使部署逻辑向使用Docker Compose更进一步 第三篇:借力Rancher完成容器编排 在这构建部署流水线系列的最后一篇文章中,我们将探讨在转换到Rancher进行集群调度时面临的一些挑战。在之前的文章中,我们通过使用Rancher执行调度,让运维人员无须再负责选择每一次容器运行的位置。要使用这个新方案,我们必须让环境的其他部分知道调度程序放置这些服务的位置,以及如何访问它们。我们还将讨论如何使用标签来操作调度程序,以调整容器放置位置,并避免端口绑定冲突。最后,我们将通过利用Rancher的回滚功能优化我们的升级过程。 在引入Rancher之前,我们的环境是一个相当静态的环境。我们总是将容器部署到相同的主机上,而部署到不同的主机则意味着我们需要更新一些配置文件以反映新位置。例如,如果我们要添加'java-service-1'应用程序的一个附加实例,我们还需要更新load balancer以指向附加实例的IP。使用调度器让我们无法预测容器部署的位置,并且我们需要动态配置环境,使其能自动适应变化。为此,我们需要使用服务注册和服务发现。 服务注册表为我们提供了应用程序在环境中的位置的单一来源。和硬编码服务位置不同,我们的应用程序可以通过API查询服务注册表,并在我们的环境发生变化时自动重新配置。Rancher使用Rancher的DNS和元数据服务提供了开箱即用的服务发现。然而,混合使用Docker和非Docker应用程序时,我们不能完全依赖Rancher来处理服务发现。我们需要一个独立的工具来跟踪我们所有服务的位置,consul就符合这个要求。 我们不会详细说明如何在您的环境中设置Consul,但是,我们将简要描述我们在ABC公司使用Consul的方式。在每个环境中,我们都有一个部署为容器的Consul集群。我们在环境中的每个主机上都部署一个Consul代理,如果主机正在运行Docker,我们还会部署一个注册器容器。注册器监视每个守护进程的Docker事件API,并在生命周期事件期间自动更新Consul。例如,在新容器被部署后,注册器会自动在Consul中注册该服务。当容器被删除时,注册器撤销它的注册。 Consul服务列表 在Consul中注册所有服务后,我们可以在负载均衡器中运行consul-template,根据Consul中存储的服务数据动态填充上游列表。对于我们的NGINX负载均衡器,我们可以创建一个模板来填充’java-service-1’应用程序的后端: 1 2 3 4 5 6 #upstreams.conf upstreamjava-service- 1 { {{range_,$element:=service "java-service-1" }} server``.`Address`:``.`Port`; ` else ` server 127.0 . 0.1 : 65535 ;#forcea 502 `end`} 此模板在Consul中查找注册为“java-service-1”的服务的列表。然后它将循环该列表,添加具有该特定应用程序实例的IP地址和端口的服务线。如果在Consul中没有注册任何“java-service-1”应用程序,我们默认抛出502以避免NGINX中的错误。 我们可以在守护进程模式下运行consul-template,使其监控Consul的更改,在发生更改时重新渲染模板,然后重新加载NGINX以应用新配置。 1 2 3 4 TEMPLATE_FILE=/etc/nginx/upstreams.conf.tmpl RELOAD_CMD=/usr/sbin/nginx-sreload consul-template-consulconsul.stage.abc.net: 8500 \ -template "${TEMPLATE_FILE}:${TEMPLATE_FILE//.tmpl/}:${RELOAD_CMD}" 通过使用我们的负载均衡器设置来动态地改变其余的环境变化,我们可以完全依赖Rancher调度器来做出我们的服务应该在哪里运行的复杂的决定。但是,我们的“java-service-1”应用程序在Docker主机上绑定TCP端口8080,如果在同一主机上调度了多个应用程序容器,则会导致端口绑定冲突并最终失败。为了避免这种情况,我们可以通过调度规则来操作调度器。 通过在docker-compose.yml文件中使用容器标签来提出条件,是Rancher给我们的一种操作调度器的方法。条件可以包括亲和规则、否定、至“软”强制(意味着尽可能地避免)。在我们使用'java-service-1'应用程序的情况下,我们知道在给定时间只有一个容器可以在主机上运行,因此我们可以基于容器名称设置反关联性规则。这将使调度程序查找一个未运行名称为“java-service-1”的容器的Docker主机。我们的docker-compose.yml文件看起来像下面这样: 1 2 3 4 5 6 7 java-service- 1 : image:registry.abc.net/java-service- 1 :${VERSION} container_name:java-service- 1 ports: - 8080 : 8080 labels: io.rancher.scheduler.affinity:container_label_ne:io.rancher.stack_service.name=java-service- 1 注意“标签”键的引入。所有调度规则都作为标签被添加。标签可以被添加到Docker主机和容器。当我们在Rancher注册我们的主机时,我们可以将它们与标签关联,以后就可以切断调度部署。例如,如果我们有一组使用SSD驱动器进行存储优化的Docker主机,我们可以添加主机标签storage=ssd。 Rancher主机标签 需要利用优化存储主机的容器可以添加标签来强制调度程序仅在匹配的主机上部署它们。我们将更新我们的“java-service-1”应用程序,以便只部署在存储优化的主机上: 1 2 3 4 5 6 7 8 java-service- 1 : image:registry.abc.net/java-service- 1 :${VERSION} container_name:java-service- 1 ports: - 8080 : 8080 labels: io.rancher.scheduler.affinity:container_label_ne:io.rancher.stack_service.name=java-service- 1 io.rancher.scheduler.affinity:host_label:storage=ssd 通过使用标签,我们可以根据所需的容量,而不是个别主机运行特定的容器集,来精细地调整我们的应用程序部署。切换到Rancher进行集群调度,即使您仍然有必须在特定主机上运行的应用程序。 最后,我们可以利用Rancher的回滚功能优化我们的服务升级。在我们的部署工作流中,通过调用rancher-compose来指示Rancher在该服务堆栈上执行升级以部署服务。升级过程大致如下: 通过拉取一个新的镜像来启动升级 逐一地,现有容器被停止并且新容器被启动 部署程序登录到UI并选择“完成升级”时,升级完成, 已停止的旧服务容器被删除 Rancher升级 当给定服务的部署非常少时,此工作流就好了。但是,当某个服务处于“升级”状态(在部署者选择“完成升级”之前)时,在执行“完成升级”或是“回滚”操作之前,你都不能对它进行任何新的升级”。rancher-compose实用程序让我们可以选择以编程方式选择要执行的操作,以部署程序者的身份执行操作。例如,如果您对服务进行自动测试,则可以在rancher-compose升级返回后调用此类测试。根据这些测试的状态,rancher-compose可以被再次调用,这次我们告诉堆栈“完成升级”或“回滚”。我们部署Jenkins作业的一个原始示例可能如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # for thefulljob,seepart 3 of this series /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up-d--upgrade JAVA_SERVICE_1_URL=http: //java-service-1.stage.abc.net:8080/api/v1/status if curl-s${JAVA_SERVICE_1_URL}|grep-q "OK" ;then #looksgood,confirmor "finish" theupgrade /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up--confirm-upgrade else #lookslikethere'sanerror,rollbackthecontainers #tothepreviouslydeployedversion /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up--rollback fi 这个逻辑将调用我们的应用程序端点来执行简单的状态检查。如果输出显示的是‘OK’,那么我们完成升级,否则我们需要回滚到以前部署的版本。如果您没有自动测试,另一个选择是简单地总是完成或“确认”升级。 1 2 3 4 5 # for thefulljob,seepart 3 of this series /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up-d--upgrade--confirm-upgrade 如果不久以后,您确定需要回滚,就使用相同的部署作业简单地重新部署以前的版本。这确实不像Rancher的升级和回滚功能那么友好,但它通过使堆栈不处于“升级”的状态来解锁将来的升级。 当服务在Rancher中回滚时,容器将被重新部署到以前的版本。当使用通用标记如“latest”或“master”部署服务时,可能会出现意外的后果。例如,让我们假设'java-service-1'应用程序以前被部署了标签'latest'。对图像进行更改,推送到注册表,Docker标签“latest”被更新为指向此新映像我们使用标签“latest”继续升级,在测试后决定应用程序需要回滚。使用Rancher滚动堆栈仍然会重新部署最新的映像,因为标签“latest”尚未被更新为指向上一个映像。回滚可以在纯技术术语中实现,但是部署最近的工作副本的预期效果完全无法实现。在ABC公司,我们通过始终使用与应用程序版本相关的特定标记来避免这种情况。因此,不要使用标记latest”部署我们的“java-service-1”应用程序,我们可以使用版本标签“1.0.1-22-7e56158”。这保证回滚将始终指向我们的应用程序在环境中的最新工作部署。 我们希望我们分享的经验对你们有所帮助。这有助于我们有条不紊地采用Docker,稳步改进我们的流程,并让我们的团队能熟悉这些概念。对更自动化的部署工作流进行增量更改,使组织能够更快地实现自动化的优势,部署团队可以更加务实地决定他们在流水线中需要什么。我们的经历证明Rancher在可行性、自动化、甚至团队协作方面都是成功的。我们希望分享这些我们在Docker应用过程中获得的经验教训将有助于您自己的应用过程。 欢迎关注Rancher官方微信公众号(RancherLabs),获取第一手技术干货推送;欢迎添加客服微信(RancherLabsChina)为好友,加入Rancher官方技术交流群,获取免费技术支持,与数千Docker/Rancher使用者互动。 原文来源:Rancher Labs 9月27日,北京海航万豪酒店,容器技术大会Container Day 2017即将举行。 CloudStack之父、海航科技技术总监、华为PaaS部门部长、恒丰银行科技部总经理、阿里云PaaS工程总监、民生保险CIO······均已加入豪华讲师套餐! 11家已容器落地企业,15位真·云计算大咖,13场纯·技术演讲,结合实战场景,聚焦落地经验。免费参会+超高规格,详细议程及注册链接请戳 本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1961896

优秀的个人博客,低调大师

一脸懵逼学习HBase的搭建(注意HBase的版本)

1:Hdfs分布式文件系统存的文件,文件存储。 2:Hbase是存储的数据,海量数据存储,作用是缓存的数据,将缓存的数据满后写入到Hdfs中。 3:hbase集群中的角色: (1)、一个或者多个主节点,Hmaster; (2)、多个从节点,HregionServer; 1:由于HBase依赖hdfs,所以下载的时候注意HBase的版本: 注:我使用的是hadoop2.4版本的,所以HBase选择支持2版本的:hbase-0.96.2-hadoop2-bin.tar.gz 2:上传hbase安装包,上传到一台机器即可: 建议:自己规划一下自己的机器,最好是独立的,再搞两台机器最好, 如果不想搞更多的机器,这里放到启动yarn进程的机器上: 如我的slaver5,slaver6(master节点,slaver1节点,slaver2节点安装Region Server,slaver5,slaver6安装Master ), 这样负载比较好点,自己电脑吃得消; 过程省略,上传结果如下所示; 2:解压缩刚才上传的hbase-0.96.2-hadoop2-bin.tar.gz: [root@slaver5 hadoop]# tar -zxvf hbase-0.96.2-hadoop2-bin.tar.gz 3:配置HBase集群,要修改3个文件(首先Zookeeper集群已经安装好了哟): 注意:要把hadoop的hdfs-site.xml和core-site.xml 放到HBase/conf下; [root@slaver5 conf]# cp /home/hadoop/hadoop-2.4.1/etc/hadoop/{core-site.xml,hdfs-site.xml} ./ 开始修改配置文件: 3.1:修改hbase-env.sh: 修改如下所示: //自己的jdk路径 export JAVA_HOME=/usr/java/jdk1.7.0_55//hadoop配置文件的位置export HBASE_CLASSPATH=/home/hadoop/hadoop-2.4.1/conf //告诉hbase使用外部的zk,export HBASE_MANAGES_ZK=true #如果使用独立安装的zookeeper这个地方就是false export HBASE_MANAGES_ZK=false 演示操作如下所示: 可以使用命令查看jdk的路径: [root@slaver6 hadoop]# echo $JAVA_HOME/home/hadoop/jdk1.7.0_65[root@slaver6 hadoop]# 按ESC进入命令行模式: 搜索内容如下所示: 改成如下内容,使用外部的Zookeeper管理HBase: 3.2:修改hbase-site.xml,vim hbase-site.xml: 修改内容如下所示: <configuration> <!-- 指定hbase在HDFS上存储的路径 --> <property> <name>hbase.rootdir</name> <value>hdfs://ns1/hbase</value> </property> <!-- 指定hbase是分布式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多个用“,”分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>master:2181,slaver1:2181,slaver2:2181</value> </property> </configuration> 配置或如下所示,下面的配置仅仅做一下参考,不是此篇博客配置的: 1 <configuration> 2 <property> 3 <!--hbasemaster的主机和端口--> 4 <name>hbase.master</name> 5 <value>master1:60000</value> 6 </property> 7 <property> 8 <!--时间同步允许的时间差--> 9 <name>hbase.master.maxclockskew</name> 10 <value>180000</value> 11 </property> 12 <property> 13 <name>hbase.rootdir</name> 14 <!--hbase共享目录,持久化hbase数据--> 15 <value>hdfs://hadoop-cluster1/hbase</value> 16 </property> 17 <property> 18 <!--是否分布式运行,false即为单机--> 19 <name>hbase.cluster.distributed</name> 20 <value>true</value> 21 </property> 22 <property> 23 <!--zookeeper地址--> 24 <name>hbase.zookeeper.quorum</name> 25 <value>slave1, slave2,slave3</value> 26 </property> 27 <property> 28 <!--zookeeper配置信息快照的位置--> 29 <name>hbase.zookeeper.property.dataDir</name> 30 <value>/home/hadoop/hbase/tmp/zookeeper</value> 31 </property> 32 </configuration> 修改操作如下所示: [root@slaver5 conf]# vim hbase-site.xml 演示操作如下所示: 3.3:修改regionservers,vim regionservers: 因为master节点,slaver1节点,slaver2节点安装Region Server,所以这里配置一下,slaver5,slaver6安装Master就可以找到Region Server了; 4:然后将部署好的HBase传到其他几个节点上面(拷贝里面有html文档,拷贝起来有点慢,可以删除doc文档): 注:将配置好的HBase拷贝到每一个节点并同步时间。 [root@slaver5 hadoop]# scp -r hbase-0.96.2-hadoop2/ master:/home/hadoop/[root@slaver5 hadoop]# scp -r hbase-0.96.2-hadoop2/ slaver1:/home/hadoop/[root@slaver5 hadoop]# scp -r hbase-0.96.2-hadoop2/ slaver2:/home/hadoop/[root@slaver5 hadoop]# scp -r hbase-0.96.2-hadoop2/ slaver6:/home/hadoop/ 5:现在可以启动HBase了,不过启动HBase之前需要将HDFS启动起来(hdfs启动过程省略,之前启动好多次了),因为HBase在hdfs下面创建一个目录叫做hbase,自己配置的: 注:如果浏览器访问不了,记得关防火墙:service iptables stop,service iptables status; 启动所有的hbase 1:分别启动zk ./zkServer.sh start 2:启动hbase集群 start-dfs.sh 3:启动hbase,在主节点上运行: start-hbase.sh 启动完hdfs之后启动HBase: 可以查看这几个节点的进程的启动情况: 现在呢,一个HBase已经启动起来了,如果想启动两个HBase,第一个HBase启动不会自动启动第二个HBase,所以现在手动启动第二个HBase,操作如下所示: 注:为保证集群的可靠性,要启动多个HMaster 6:通过浏览器访问hbase管理页面 192.168.3.134:60010 可以看到三台master节点,slaver1节点,slaver2节点安装Region Server;slaver6是安装的备份的Master; 7:自己可以测试一下,杀死一个HMaster(slaver5节点的),另一个HMaster立马顶上去了,很强悍,依赖着Zookeeper,爽到爆啊。(kill -9 进程号,-9是强制杀死): 1 添加Hbase节点,删除的话直接kill: 2 [root@slaver6 hadoop]# hbase-daemon.sh start regionserver 8:使用HBase的命令行客户端操作一下HBase(测试使用,真实环境使用Java操作): 1 进入hbase的shell:hbase shell 2 退出hbase的shell:quit 3 页面:http://ip地址:60010/ 由于HBase是非关系型数据库,可以查看一下help看看都有啥命令,然后再操作: 可以查看一些基本的命令: HBase的一些基本命令(如果在hbase shell客户端,打错了,可按ctrl+BackSpace进行删除): #创建HBase数据表create 'myTables',{NAME => 'base_info',VERSIONS => 3},{NAME => 'extra_info'} hbase(main):016:0> create 'user','info01','info02' #查看有什么表list#查看表结构describe 'myTables'#禁用表disable 'myTables'#删除表,删除之前要先禁用表drop 'myTables'#插入数据,插入一个表的一行的一列的一个值,最后一个字段不带#不带分号#put '表名称','行','base_info/extra_info:列名称','列值'put 'myTables','0001','base_info:name','张三'put 'myTables','0001','base_info:age','22'put 'myTables','0001','base_info:sex','男'put 'myTables','0001','extra_info:addr','河南省'#查询数据,查询某一行。get 'myTables','0001'get 'myTables','0001',{COLUMN => 'base_info:name',VERSION => 10}scan 'myTables'#修改值操作,默认不显示历史值put 'myTables','0001','base_info:name','李四' 可以去Zookeeper查看hbase的一些信息: 1 [root@master sbin]# cd /home/hadoop/zookeeper-3.4.5/ 2 [root@master zookeeper-3.4.5]# ls 3 bin conf dist-maven ivy.xml NOTICE.txt recipes zookeeper-3.4.5.jar.asc 4 build.xml contrib docs lib README_packaging.txt src zookeeper-3.4.5.jar.md5 5 CHANGES.txt data ivysettings.xml LICENSE.txt README.txt zookeeper-3.4.5.jar zookeeper-3.4.5.jar.sha1 6 [root@master zookeeper-3.4.5]# cd bin/ 7 [root@master bin]# ls 8 README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh zookeeper.out 9 [root@master bin]# ./zkCli.sh 10 Connecting to localhost:2181 11 2017-12-18 17:08:22,357 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT 12 2017-12-18 17:08:22,383 [myid:] - INFO [main:Environment@100] - Client environment:host.name=master 13 2017-12-18 17:08:22,383 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_65 14 2017-12-18 17:08:22,383 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation 15 2017-12-18 17:08:22,385 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/home/hadoop/jdk1.7.0_65/jre 16 2017-12-18 17:08:22,385 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/home/hadoop/zookeeper-3.4.5/bin/../build/classes:/home/hadoop/zookeeper-3.4.5/bin/../build/lib/*.jar:/home/hadoop/zookeeper-3.4.5/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/hadoop/zookeeper-3.4.5/bin/../lib/slf4j-api-1.6.1.jar:/home/hadoop/zookeeper-3.4.5/bin/../lib/netty-3.2.2.Final.jar:/home/hadoop/zookeeper-3.4.5/bin/../lib/log4j-1.2.15.jar:/home/hadoop/zookeeper-3.4.5/bin/../lib/jline-0.9.94.jar:/home/hadoop/zookeeper-3.4.5/bin/../zookeeper-3.4.5.jar:/home/hadoop/zookeeper-3.4.5/bin/../src/java/lib/*.jar:/home/hadoop/zookeeper-3.4.5/bin/../conf: 17 2017-12-18 17:08:22,385 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/i386:/lib:/usr/lib 18 2017-12-18 17:08:22,386 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp 19 2017-12-18 17:08:22,387 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA> 20 2017-12-18 17:08:22,396 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux 21 2017-12-18 17:08:22,397 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=i386 22 2017-12-18 17:08:22,397 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-358.el6.i686 23 2017-12-18 17:08:22,398 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root 24 2017-12-18 17:08:22,428 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root 25 2017-12-18 17:08:22,470 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/home/hadoop/zookeeper-3.4.5/bin 26 2017-12-18 17:08:22,472 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@1238fa5 27 Welcome to ZooKeeper! 28 2017-12-18 17:08:22,994 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@966] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error) 29 JLine support is enabled 30 2017-12-18 17:08:23,281 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@849] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session 31 2017-12-18 17:08:24,145 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1207] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x16068706a9b0008, negotiated timeout = 30000 32 33 WATCHER:: 34 35 WatchedEvent state:SyncConnected type:None path:null 36 [zk: localhost:2181(CONNECTED) 0] ls / 37 [hadoop-ha, hbase, admin, zookeeper, consumers, config, 20171011, storm, yarn-leader-election, brokers, controller_epoch] 38 [zk: localhost:2181(CONNECTED) 3] get /hbase 39 40 cZxid = 0xc00000007 41 ctime = Wed Oct 25 17:29:19 CST 2017 42 mZxid = 0xc00000007 43 mtime = Wed Oct 25 17:29:19 CST 2017 44 pZxid = 0xf0000004a 45 cversion = 23 46 dataVersion = 0 47 aclVersion = 0 48 ephemeralOwner = 0x0 49 dataLength = 0 50 numChildren = 15 51 [zk: localhost:2181(CONNECTED) 4] ls / 52 [hadoop-ha, hbase, admin, zookeeper, consumers, config, 20171011, storm, yarn-leader-election, brokers, controller_epoch] 53 [zk: localhost:2181(CONNECTED) 5] ls /hbase 54 [meta-region-server, backup-masters, region-in-transition, draining, table, table-lock, running, master, namespace, hbaseid, online-snapshot, replication, recovering-regions, splitWAL, rs] 55 [zk: localhost:2181(CONNECTED) 6] ls /hbase/table 56 [hbase:meta, hbase:namespace, user] 57 [zk: localhost:2181(CONNECTED) 7] 待续......

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册