首页 文章 精选 留言 我的

精选列表

搜索[和平之翼代码生成器],共10000篇文章
优秀的个人博客,低调大师

Tableau学习系列之Tableau可连接数百个数据源的简介

不多说,直接上干货! Actian Matrix* Actian Vector* Amazon Aurora Amazon Elastic MapReduce Amazon Redshift Anaplan Apache Drill Aster 数据库 Cisco Information Server* Cloudera Hadoop DataStax Enterprise* EXASOL* Firebird Google Analytics Google BigQuery Google Cloud SQL Google 表格 Hortonworks Hadoop Hive HP Vertica IBM BigInsights IBM DB2 IBM PDA* JSON 文件 Kognitio MapR Hadoop Hive* Marketo MarkLogic MemSQL Microsoft Access* Microsoft Analysis Services* Microsoft Excel Microsoft PowerPivot* Microsoft SharePoint 列表 Microsoft SQL Server Microsoft SQL Server PDW Microsoft Windows Azure Marketplace DataMarket MonetDB MySQL OData Oracle Oracle Eloqua Oracle Essbase* Pivotal Greenplum 数据库 PostgreSQL Presto Progress OpenEdge* Quickbooks Online Salesforce.com,包括 Force.com 和 Database.com SAP HANA SAP NetWeaver Business Warehouse* SAP Sybase ASE* SAP Sybase IQ* Snowflake Spark SQL 空间文件 Splunk* 统计文件 Tableau 数据提取 Teradata Teradata OLAP Connector* 文本文件 - 逗号分隔值 (.csv) 文件 兼容 ODBC 3.0 的数据库和应用程序* 通过Web 数据连接器获得大量 Web 数据 * 仅适用于 Windows Read more at https://www.tableau.com/zh-cn/products/desktop#i4IoLD7O3fPOf3q0.99 本文转自大数据躺过的坑博客园博客,原文链接http://www.cnblogs.com/zlslch/p/7989514.html,如需转载请自行联系原作者

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

子域部署Exchange服务器详细攻略及故障剖析:Exchange2003系列之十二

子域部署 Exchange 服务器完全攻略及故障剖析 最近在论坛发现有些朋友在子域部署 Exchange 服务器时遇到了一些问题,看了一下发现导致问题的原因很多。索性趁着今天有时间,用一个实验演示一下在子域部署 Exchange 服务器的全过程,希望能给这些朋友一些参考。实验拓扑如下图所示, test.com 是父域, Florence 是父域的域控制器。 Shanghai.test.com 是子域, Firenze 是子域的域控制器, Berlin 是子域的成员服务器,我们准备把 Exchange2003 部署在 Berlin 上。域树中的三台计算机都使用 192.168.11.1 作为 DNS 服务器。为了演示得更彻底,我们搭建这个实验环境从部署 AD 开始,因为我发现有不少朋友部署 Exchange 时出现的错误其实源于 AD 。 一 创建 DNS 区域 我部署 AD 的习惯是用单独的 DNS 服务器为 AD 提供解析服务,而不是将 DNS 安装在域控制器上。这些做的好处是 DNS 非常容易维护,只要把引导文件,区域数据文件复制出来就完成了备份,重建 DNS 服务器只需要几分钟时间。而且这种拓扑对初学者来说很容易把握,只要把所有的计算机都指向同一个 DNS 就可以了。免得很多管理员在域树环境下很是困惑父域的计算机应该使用哪个 DNS 服务器,子域的计算机又该使用哪个 DNS 服务器。如果你使用虚拟机搭建实验环境,可以考虑象我这样把 DNS 搭建在物理计算机上。好了,我们不过多讨论 DNS 和 AD 的关系,现在开始具体的部署工作。我们需要在创建 AD 之前先在 DNS 服务器中创建出相关区域,然后允许区域进行动态更新。 在 DNS 服务器上打开 DNS 管理器,如下图所示,右键点击正向查找区域,选择“新建区域”。 出现新建区域向导,点击下一步继续。 区域类型应该选择“主要区域”。 区域名称为 Test.com ,和 AD 使用的域名完全相同 。 Test.com 区域的数据存储在 Windows\System32\DNS\Test.com.dns 文件中,我们只要保存好这个文件就能轻松实现 DNS 服务器的重建。 注意,区域必须允许动态更新,因为在创建 AD 的过程中需要向这个区域写入 A , Cname 和 SRV 记录。 点击完成结束 DNS 区域的创建。 区域创建完毕之后,如下图所示,我们看到区域中已经有了一条NS 记录和SOA 记录,从逻辑上来说,这两条记录对一个区域来说是不可或缺的。NS 记录说明这个区域有哪些DNS 服务器可以解析,SOA 记录则进一步说明这些DNS 服务器中的哪一个是主服务器。 我们不能掉以轻心,要看看系统创建的 NS 和 SOA 记录是否正确。 如下图所示,我们发现 NS 记录不正确,因为 Server6. 并不是一个可以解析的完全合格域名,这样会导致 DNS 的客户机无法得知这个区域的解析服务器到底是谁。因此我们要对 NS 记录进行修改,只要你让修改后的完全合格域名能解析为 192.168.11.1 ,这个修改就是成立的。 如下图所示,我把 NS 记录改为了 server6.home.com. , DNS 服务器可以把这个域名解析为 192.168.11.1 。再次强调, NS 记录对应的域名可以是任意的,只要这个域名能解析为 DNS 服务器的 IP 即可。 如下图所示,SOA 记录也要如法炮制地修改一番,主要是修改主服务器,这是关键参数。 至此,我们完成了 AD 创建前的 DNS 准备工作。 二 创建父域 DNS 区域准备好之后,我们就可以创建域树中的父域了。在 Florence 上运行 Dcpromo ,如下图所示,出现 Active Direcotry 安装向导,点击下一步继续。 兼容性提示告诉我们 Win2003 创建的 Active Directory 无法和早期的一些操作系统兼容,点击下一步继续。 选择创建新域的域控制器。 选择创建一个新的域林。 输入域的 DNS 名称,这个域名应该和 DNS 服务器中预先创建的区域名称相同。 域的 Netbios 名称是 TEST 。 由于是测试环境,因此我们选择把 Active Directory 数据库保存到默认路径下。 Sysvol 文件夹的路径也使用默认设置。 如下图所示,我们先前创建的 DNS 区域发挥了作用, Active Directory 的安装程序测试出当前使用的 DNS 服务器完全能满足 Active Directory 的需求。 选择 Active Directory 的兼容模式,选择仅兼容 Win2000 之后的操作系统。 输入目录恢复还原模式的管理员口令,将来从备份还原 Active Directory 时用得着。 检查配置无误,点击下一步开始 Active Directory 的创建。 如下图所示, Active Directory 开始创建,创建完毕后需要重启计算机。 父域创建完毕后,我们在 DNS 区域中发现 Active Direcotry 所需要的 A , Cname 和 SRV 记录都已经被自动生成了,至此,父域创建完毕。 三 创建子域 创建完父域后,接下来我们来创建子域,在 Firenze 上运行 Dcpromo ,在 Active Directory 创建向导的指引下开始子域创建,如下图所示,我们选择创建新域的域控制器。 选择创建现有域树中的子域。 输入父域的管理员账号进行权限验证。 输入父域和子域的域名,点击下一步继续。 显示子域的 Netbios 名称,点击下一步继续。 Active Directory 数据库存储在默认路径下。 Sysvol 文件夹的路径也使用默认设置。 如下图所示, Active Directory 安装向导检测现有的 DNS 服务器可以满足子域的安装需求。 接下来的安装过程和父域相同,在此不再赘述,子域安装完毕后我们检查 DNS 服务器,如下图所示,我们发现子域的相关记录也已经被自动创建了,这可以作为域创建成功的衡量标准之一。 现在我们已经有了一棵域树,但不要着急进行 Exchange 的安装,先观察一下父域的 DC 和子域的 DC 复制是否正常。在 Florence 上打开 Active Directory 站点和服务,如下图所示,我们尝试让 Florence 从 Firenze 进行 Active Directory 的复制。 如果测试结果如下图所示,而且 Firenze 从 Florence 复制也是正常的,那我们就可以进行后续操作了。记住,如果 DC 间的复制不正常或DNS 的区域数据有问题,你就不应该向下进行Exchange 的安装,而是应该致力于排除现有问题。 四 林准备 我们知道 Exchange2003 的安装分为林准备,域准备和 Exchange 安装三部分,而林准备就是扩展域林的 Active Directory 架构,我们首先在父域的域控制器上进行林准备。林准备需要操作主机中的架构主机在线,而且进行林准备操作的用户必须是 Schema Admins 组的成员。我们在 Florence 上以父域管理员的身份登录,放入 Exchange 的安装光盘,如下图所示,运行 Setup /Forestprep 。 出现 Exchange 安装向导,点击下一步继续。 同意许可协议,点击下一步继续。 如下图所示,确定要进行的操作是 Forestprep ,点击下一步继续。 由于 Exchange 安装在子域的成员服务器上,因此我们赋予子域管理员 Exchange 的完全控制权限。 如下图所示, Active Directory 的架构扩展开始了。 架构扩展结束之后,我们应该花上几分钟时间,等父域和子域的域控制器复制结束后再进行后续的 Exchange 安装操作。 五 域准备 林准备结束后,我们就可以进行域准备了。虽然 Exchange 服务器部署在子域的成员服务器上,但 Exchange 可以为 Active Directory 中的所有用户提供邮件服务。因此我们希望父域和子域的用户都可以利用 Exchange 创建邮箱,我们就应该在父域和子域都进行域准备。 由于域准备的过程是一样的,我们以在子域进行域准备为例,在 Firenze 上放入 Exchange2003 的安装光盘,如下图所示,运行 setup /domainprep 。 出现 Exchange 安装向导,点击下一步继续。 同意软件许可协议,点击下一步继续。 确定准备进行的操作是 Domainprep ,点击下一步开始安装。 如下图所示,子域的域准备顺利完成,接下来我们如法炮制在父域也进行域准备即可。 六 部署 Exchange2003 接下来就是最后的 Exchange 部署工作了,我们在 Berlin 上先装上 SMTP , NNTP , Web , ASP.NET 等 Exchange 安装的必需组件。然后放入 Exchange2003 的安装光盘,如下图所示,运行 D:\setup\i386\setup.exe 。 出现 Exchange 安装向导,点击下一步继续。 同意软件许可协议,点击下一步继续。 选择 Exchange 的典型安装即可。 由于没有现成的组织,我们选择新建 Exchange 组织。 为新创建的组织取名为 First 。 同意最终用户许可协议,点击下一步继续。 为 Exchange 的管理组取名 为 MAIL 。 确认 Exchange 的安装组件,点击下一步开始 Exchange 的安装。 如下图所示,顺利完成 Exchange2003 在子域的部署。 部署完毕后重启 Berlin 发现大事不妙, Exchange 的存储服务和 MTA 服务居然不能启动,再次重启仍然是涛声依旧。从事件查看器的提示看似乎是无法从 Active Directory 检索到 Exchange 信息!怎么办?别担心,微软解释过这个问题,如果 Exchange 服务器安装在子域,那么默认情况下 Exchange 服务器只向本域内的域控制器和全局编录服务器进行 AD 对象查询,但由于域树的全局编录服务器默认由父域的域控制器承担,因此 Exchange 服务器在子域内检索不到 Active Direcotry 中关于 Exchange 的登记信息。解决方法也很简单,如下图所示,在 Exchange 服务器的高级 TCP/IP 属性中定义附加的 DNS 后缀,把 Test.com 和 Shanghai.test.com 都定义上,这样 Berlin 就会从父域的全局编录服务器或域控制器检索 Exchange 数据了。重启 Berlin 后一切正常!或者可以考虑把子域的域控制器也作为全局编录服务器。 在子域中为用户创建一个邮箱,如下图所示,邮箱创建成功!至此, Exchange 在子域部署成功完成! 至此, Exchange 在子域部署完毕,对常见问题总结如下: 1 注意DNS 问题,对一个不熟悉DNS 原理的管理员来说,最简单的办法就是所有的计算机都使用同一个DNS 服务器。DNS 最好是独立的计算机,如果不行,把DNS 放在父域的控制器上也可以接受。有些管理员选择了父域和子域的计算机分别使用本域的域控制器作为DNS 服务器,如果这样的话,需要在父域进行子域委派。除非你的网络环境确实有这个需求,否则我认为是多此一举。 2 注意Active Directory 的健康状态。Exchange 和AD 结合得非常紧密,确保AD 状态正常是安装Exchange 之前的必修课。我们可以考虑域控制器复制是否正常,操作主机角色是否正常,GC 的角色由谁承担,DNS 的相关记录是否有误等等。用Dcdiag 测试一下也是不错的选择。 3 如果扩展架构时出现问题,应考虑架构主机是否在线,执行用户是否属于Schema Admins 组。最保险的办法是在父域的域控制器上以父域管理员的身份执行扩展架构的操作,因为默认情况下父域的域控制器承担架构主机的角色,而父域管理员也隶属Schema Admins 组。还有一点要注意,如果希望在子域进行Exchange 部署,那么扩展架构时一定要把Exchange 的完全控制权限分配给子域的管理员。 4 如果希望部署在子域的Exchange 服务器可以为Active Directory 的所有用户提供邮件支持,那在父域和子域都应该进行域准备。如果只需要让Exchange 在子域发挥作用,那仅仅在子域进行域准备就可以了。 5 如果希望Exchange 服务器为父域和子域用户创建的邮箱拥有不同的地址后缀,但除了在父域和子域都要进行域准备外,还需要为父域和子域分别创建地址策略,具体参见[url]http://yuelei.blog.51cto.com/202879/77270[/url] 。而且要注意的是,子域的管理员并没有为父域用户创建邮箱的权限,可以考虑把子域的管理员加入父域域控制器的本地管理员组来解决这个问题。 本文转自yuelei51CTO博客,原文链接:http://blog.51cto.com/yuelei/95414,如需转载请自行联系原作者

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

SQL Server数据库基础的级联删除、级联更新与三层架构之窥

一、定义 级联删除是指删除包含主键值的行的操作,该值由其它表的现有行中的外键引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。 级联更新是指更新主键值的操作,该值由其它表的现有行中的外键引用。在级联更新中,更新所有外键值与新的主键值相匹配。 三层架构是指一种架构思想。通常他将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的是为了“高内聚、低耦合”的思想。 二、特点 大家都知道,级联删除与级联更新操作,都是指主表的信息删除或更新后,外键表中的相应信息随主表保持一致,也同样做出删除或更新操作,不然就会发生错误,保持数据的事务性。 而关于三层架构的分层问题,我们之前就讨论过。看似简单,但是越是往细处想,越是发现疑点重重,很多知识都掌握的似是而非。 之前,我们谈论过,我们的架构设计,一般DAL层是与表一一对应的。这是一种规则,可以使DAL层与BLL层之间的关系更加清晰、简洁。但是,我们知道,在实际应用中,真正实现一个逻辑对应一个表是比较困难的,我们的业务不可能彼此孤立,而只能相对孤立。 因此,我认为:我们在设计之初,大方向依然按照DAL与表一一对应的原则进行设计。这里有一点需要注意:所写的SQL语句,一定是要放在存储过程里面的,因为存储过程是预编译类型。业务修改时,我们只需要修改对应存储过程,实现对修改封闭的原则。 三、比较 通过上面的分析,我们可以得出:级联操作与三层机构设计思想是彼此矛盾的。前者只适用于多表间的操作关系,而后者的宏观路线是单对单。 然而,我认为,通过编写存储过程或者触发器来实现级联操作,这样可以使得三层架构的设计更加灵活多变、更加具有弹性。 我们来看机房收费系统中的一个功能:充值功能。我们在充值的时候,不仅要更新卡表内余额,同时也要增加充值记录。 我们之前的做法是,在DAL层对应卡表编写进行更新余额,在充值记录表中添加相应记录。然后在BLL层实现他们的协调工作。 这样做有一个很大的弊端,充值的过程是一个顺序过程,现更新,在添加记录。如果中途断电,那么数据就会不完整了。 看下面的例子,首先是数据库关系图 编写下面触发器,实现起来就非常方便了。 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author:刘正权 -- Create date: 2012年5月7日 -- Description:充值时,更新最新的余额的同时,增加充值记录 -- ============================================= CREATE TRIGGER trigCharge ON card Update AS BEGIN Update chargerecord set c.ChargeCash=i.ChargeCash from chargerocord c,Deleted d, Inserted i where c.CId=d.id END GO 四、结论 我认为,级联操作与三层架构或者多层架构的思想是不矛盾的。想反,它使得分层更加灵活多变。 ====================================分割线================================ 最新内容请见作者的GitHub页:http://qaseven.github.io/

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

23【在线日志分析】之改造CDH的HDFS的NN,DN进程,日志输出为json格式

1.登录nn机器,进入最新序号的namenode配置文件夹,查看当前的nn的log4j配置 [root@sht-sgmhadoopnn-01 ~]# cd /var/run/cloudera-scm-agent/process/ [root@sht-sgmhadoopnn-01 process]# ls -lrt ....... ....... ....... drwxr-x--x 3 hdfs hdfs 380 Mar 30 20:40 372-hdfs-FAILOVERCONTROLLER drwxr-x--x 3 hdfs hdfs 500 Mar 30 20:40 370-hdfs-NAMENODE drwxr-x--x 3 hdfs hdfs 360 Mar 30 20:40 422-hdfs-FAILOVERCONTROLLER drwxr-x--x 3 hdfs hdfs 480 Mar 30 20:40 420-hdfs-NAMENODE drwxr-x--x 3 yarn hadoop 520 Mar 30 20:40 383-yarn-RESOURCEMANAGER drwxr-x--x 3 mapred hadoop 400 Mar 30 20:40 379-yarn-JOBHISTORY drwxr-x--x 3 mapred hadoop 380 Mar 30 20:40 425-yarn-JOBHISTORY drwxr-x--x 3 yarn hadoop 500 Mar 30 20:40 428-yarn-RESOURCEMANAGER drwxr-x--x 3 root root 180 Mar 31 15:53 359-cluster-host-inspector [root@sht-sgmhadoopnn-01 process]# cd 420-hdfs-NAMENODE[root@sht-sgmhadoopnn-01 420-hdfs-NAMENODE]# cat log4j.properties log.threshold=INFO main.logger=RFA hadoop.root.logger=${log.threshold},${main.logger} log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter log4j.rootLogger=${hadoop.root.logger},EventCounter,EventCatcher log.dir=/var/log/hadoop-hdfs log.file=hadoop-cmf-hdfs-NAMENODE-sht-sgmhadoopnn-01.log.out max.log.file.size=200MB max.log.file.backup.index=10 log4j.appender.RFA=org.apache.log4j.RollingFileAppender log4j.appender.RFA.File=${log.dir}/${log.file} log4j.appender.RFA.layout=org.apache.log4j.PatternLayout log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n log4j.appender.RFA.MaxFileSize=${max.log.file.size} log4j.appender.RFA.MaxBackupIndex=${max.log.file.backup.index} log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n ........ ........ 2.仔细分析,log4j.appender.RFA.layout.ConversionPattern 这个参数应该是控制nn进程的日志 3.打开CDH,进HDFS的Configuration界面,搜索"log"关键词, 3.1 找到"NameNode Logging Advanced Configuration Snippet (Safety Valve)",配置 log4j.appender.RFA.layout.ConversionPattern = {"time":"%d{yyyy-MM-dd HH:mm:ss,SSS}","logtype":"%p","loginfo":"%c:%m"}%n 3.2 找到"DataNode Logging Advanced Configuration Snippet (Safety Valve)",也配置 log4j.appender.RFA.layout.ConversionPattern = {"time":"%d{yyyy-MM-dd HH:mm:ss,SSS}","logtype":"%p","loginfo":"%c:%m"}%n 3.3 单击保存3.4 单击Stale Configuration:Restart needed 3.5 Restart Stale Services 3.6 Review Changes,勾选Re-deploy client configuration ,Restart Now 4.检查nn,dn进程的日志输出是否为json格式 4.1 检查新增的参数是否生效 [root@sht-sgmhadoopnn-01 420-hdfs-NAMENODE]# cd ../ [root@sht-sgmhadoopnn-01 process]# ls -lrt ....... ....... ....... drwxr-x--x 3 hdfs hdfs 380 Mar 31 20:32 422-hdfs-FAILOVERCONTROLLER drwxr-x--x 3 hdfs hdfs 360 Mar 31 20:32 439-hdfs-FAILOVERCONTROLLER drwxr-x--x 3 hdfs hdfs 480 Mar 31 20:32 437-hdfs-NAMENODE drwxr-x--x 3 mapred hadoop 400 Mar 31 20:32 425-yarn-JOBHISTORY drwxr-x--x 3 yarn hadoop 520 Mar 31 20:32 428-yarn-RESOURCEMANAGER drwxr-x--x 3 mapred hadoop 380 Mar 31 20:32 442-yarn-JOBHISTORY drwxr-x--x 3 yarn hadoop 500 Mar 31 20:32 445-yarn-RESOURCEMANAGER [root@sht-sgmhadoopnn-01 process]# cd 437-hdfs-NAMENODE [root@sht-sgmhadoopnn-01 437-hdfs-NAMENODE]# cat log4j.properties |grep log4j.appender.RFA.layout.ConversionPattern log4j.appender.RFA.layout.ConversionPattern={"time":"%d{yyyy-MM-dd HH:mm:ss,SSS}","logtype":"%p","loginfo":"%c:%m"}%n [root@sht-sgmhadoopnn-01 437-hdfs-NAMENODE]# 4.2 检查log即可 [root@sht-sgmhadoopnn-01 437-hdfs-NAMENODE]# tail -f /var/log/hadoop-hdfs/hadoop-cmf-hdfs-NAMENODE-sht-sgmhadoopnn-01.log.out {"time":"2017-03-31 20:40:38,588","logtype":"INFO","loginfo":"org.apache.hadoop.hdfs.server.namenode.FSImage:Reading org.apache.hadoop.hdfs.server.namenode.RedundantEditLogInputStream@5c588660 expecting start txid #142520"} {"time":"2017-03-31 20:40:38,588","logtype":"INFO","loginfo":"org.apache.hadoop.hdfs.server.namenode.FSImage:Start loading edits file http://sht-sgmhadoopdn-02:8480/getJournal?jid=nameservice1&segmentTxId=142520&storageInfo=-60%3A1863012361%3A0%3Acluster8, http://sht-sgmhadoopdn-01:8480/getJournal?jid=nameservice1&segmentTxId=142520&storageInfo=-60%3A1863012361%3A0%3Acluster8"} {"time":"2017-03-31 20:40:38,588","logtype":"INFO","loginfo":"org.apache.hadoop.hdfs.server.namenode.EditLogInputStream:Fast-forwarding stream 'http://sht-sgmhadoopdn-02:8480/getJournal?jid=nameservice1&segmentTxId=142520&storageInfo=-60%3A1863012361%3A0%3Acluster8, http://sht-sgmhadoopdn-01:8480/getJournal?jid=nameservice1&segmentTxId=142520&storageInfo=-60%3A1863012361%3A0%3Acluster8' to transaction ID 142520"} {"time":"2017-03-31 20:40:38,588","logtype":"INFO","loginfo":"org.apache.hadoop.hdfs.server.namenode.EditLogInputStream:Fast-forwarding stream 'http://sht-sgmhadoopdn-02:8480/getJournal?jid=nameservice1&segmentTxId=142520&storageInfo=-60%3A1863012361%3A0%3Acluster8' to transaction ID 142520"} 5. 不足,当出现exception换行时,就会整个信息只有第一行为json格式,剩余行为普通输出,那么整个一条信息就不是完整的json的解决方法: 5.1 改造 log4j-xxxx.jar --成本太大 5.2 在flume-ng端的exec source改造,我们采取第二种 5.3 google搜索 log4j json,发现和我一样需求的人很多,有现成的GitHub项目等等

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

04【在线日志分析】之Flume Agent的3台收集+1台聚合到hdfs的搭建

【log收集】:机器名称 服务名称 用户flume-agent-01: namenode hdfsflume-agent-02: datanode hdfsflume-agent-03: datanode hdfs 【log聚合】:机器名称 用户sht-sgmhadoopcm-01(172.16.101.54) root 【sink到hdfs】:hdfs://172.16.101.56:8020/testwjp/ 1.下载apache-flume-1.7.0-bin.tar.gz[hdfs@flume-agent-01 tmp]$ wget http://www-eu.apache.org/dist/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz--2017-01-04 20:40:10-- http://www-eu.apache.org/dist/flume/1.7.0/apache-flume-1.7.0-bin.tar.gzResolving www-eu.apache.org... 88.198.26.2, 2a01:4f8:130:2192::2Connecting to www-eu.apache.org|88.198.26.2|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 55711670 (53M) [application/x-gzip]Saving to: “apache-flume-1.7.0-bin.tar.gz” 100%[===============================================================================================================================================================================================>] 55,711,670 473K/s in 74s 2017-01-04 20:41:25 (733 KB/s) - “apache-flume-1.7.0-bin.tar.gz” saved [55711670/55711670] 2.解压重命名[hdfs@flume-agent-01 tmp]$ [hdfs@flume-agent-01 tmp]$ tar -xzvf apache-flume-1.7.0-bin.tar.gz [hdfs@flume-agent-01 tmp]$ mv apache-flume-1.7.0-bin flume-ng[hdfs@flume-agent-01 tmp]$ cd flume-ng/conf 3.拷贝flume环境配置和agent配置文件[hdfs@flume-agent-01 tmp]$ cp flume-env.sh.template flume-env.sh[hdfs@flume-agent-01 tmp]$ cp flume-conf.properties.template exec_memory_avro.properties 4.添加hdfs用户的环境变量文件[hdfs@flume-agent-01 tmp]$ cd[hdfs@flume-agent-01 ~]$ ls -latotal 24drwxr-xr-x 3 hdfs hadoop 4096 Jul 8 14:05 .drwxr-xr-x. 35 root root 4096 Dec 10 2015 ..-rw------- 1 hdfs hdfs 4471 Jul 8 17:22 .bash_historydrwxrwxrwt 2 hdfs hadoop 4096 Nov 19 2014 cache-rw------- 1 hdfs hdfs 3131 Jul 8 14:05 .viminfo[hdfs@flume-agent-01 ~]$ cp /etc/skel/.* ./cp: omitting directory `/etc/skel/.'cp: omitting directory `/etc/skel/..'[hdfs@flume-agent-01 ~]$ ls -latotal 36drwxr-xr-x 3 hdfs hadoop 4096 Jan 4 20:49 .drwxr-xr-x. 35 root root 4096 Dec 10 2015 ..-rw------- 1 hdfs hdfs 4471 Jul 8 17:22 .bash_history-rw-r--r-- 1 hdfs hdfs 18 Jan 4 20:49 .bash_logout-rw-r--r-- 1 hdfs hdfs 176 Jan 4 20:49 .bash_profile-rw-r--r-- 1 hdfs hdfs 124 Jan 4 20:49 .bashrcdrwxrwxrwt 2 hdfs hadoop 4096 Nov 19 2014 cache-rw------- 1 hdfs hdfs 3131 Jul 8 14:05 .viminfo 5.添加flume的环境变量[hdfs@flume-agent-01 ~]$ vi .bash_profile export FLUME_HOME=/tmp/flume-ngexport FLUME_CONF_DIR=$FLUME_HOME/confexport PATH=$PATH:$FLUME_HOME/bin[hdfs@flume-agent-01 ~]$ . .bash_profile 6.修改flume环境配置文件[hdfs@flume-agent-01 conf]$ vi flume-env.shexport JAVA_HOME=/usr/java/jdk1.7.0_25 7.将基于Flume-ng Exec Source开发自定义插件AdvancedExecSource的AdvancedExecSource.jar包上传到$FLUME_HOME/lib/http://blog.itpub.net/30089851/viewspace-2131995/ [hdfs@LogshedNameNodeLogcollector lib]$ pwd/tmp/flume-ng/lib[hdfs@LogshedNameNodeLogcollector lib]$ ll AdvancedExecSource.jar -rw-r--r-- 1 hdfs hdfs 10618 Jan 5 23:50 AdvancedExecSource.jar[hdfs@LogshedNameNodeLogcollector lib]$ 8.修改flume的agent配置文件[hdfs@flume-agent-01 conf]$ vi exec_memory_avro.properties# Name the components on this agenta1.sources = r1a1.sinks = k1a1.channels = c1 # Describe/configure the custom exec sourcea1.sources.r1.type = com.onlinelog.analysis.AdvancedExecSourcea1.sources.r1.command = tail -f /var/log/hadoop-hdfs/hadoop-cmf-hdfs1-NAMENODE-flume-agent-01.log.outa1.sources.r1.hostname = flume-agent-01a1.sources.r1.servicename = namenode # Describe the sinka1.sinks.k1.type = avroa1.sinks.k1.hostname = 172.16.101.54a1.sinks.k1.port = 4545 # Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.keep-alive = 60 a1.channels.c1.capacity = 1000000a1.channels.c1.transactionCapacity = 2000 # Bind the source and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1 9.将flume-agent-01的flume-ng打包,scp到flume-agent-02/03 和 sht-sgmhadoopcm-01(172.16.101.54)[hdfs@flume-agent-01 tmp]$ zip -r flume-ng.zip flume-ng/* [jpwu@flume-agent-01 ~]$ scp /tmp/flume-ng.zip flume-agent-02:/tmp/[jpwu@flume-agent-01 ~]$ scp /tmp/flume-ng.zip flume-agent-03:/tmp/[jpwu@flume-agent-01 ~]$ scp /tmp/flume-ng.zip sht-sgmhadoopcm-01:/tmp/ 10.在flume-agent-02配置hdfs用户环境变量和解压,修改agent配置文件[hdfs@flume-agent-02 ~]$ cp /etc/skel/.* ./cp: omitting directory `/etc/skel/.'cp: omitting directory `/etc/skel/..'[hdfs@flume-agent-02 ~]$ vi .bash_profileexport FLUME_HOME=/tmp/flume-ngexport FLUME_CONF_DIR=$FLUME_HOME/confexport PATH=$PATH:$FLUME_HOME/bin[hdfs@flume-agent-02 ~]$ . .bash_profile [hdfs@flume-agent-02 tmp]$ unzip flume-ng.zip[hdfs@flume-agent-02 tmp]$ cd flume-ng/conf ##修改以下参数即可[hdfs@flume-agent-02 conf]$ vi exec_memory_avro.propertiesa1.sources.r1.command = tail -f /var/log/hadoop-hdfs/hadoop-cmf-hdfs1-DATANODE-flume-agent-02.log.outa1.sources.r1.hostname = flume-agent-02a1.sources.r1.servicename = datanode ###要检查flume-env.sh的JAVA_HOME目录是否存在 11.在flume-agent-03配置hdfs用户环境变量和解压,修改agent配置文件[hdfs@flume-agent-03 ~]$ cp /etc/skel/.* ./cp: omitting directory `/etc/skel/.'cp: omitting directory `/etc/skel/..'[hdfs@flume-agent-03 ~]$ vi .bash_profileexport FLUME_HOME=/tmp/flume-ngexport FLUME_CONF_DIR=$FLUME_HOME/confexport PATH=$PATH:$FLUME_HOME/bin[hdfs@flume-agent-03 ~]$ . .bash_profile [hdfs@flume-agent-03 tmp]$ unzip flume-ng.zip[hdfs@flume-agent-03 tmp]$ cd flume-ng/conf ##修改以下参数即可[hdfs@flume-agent-03 conf]$ vi exec_memory_avro.propertiesa1.sources.r1.command = tail -f /var/log/hadoop-hdfs/hadoop-cmf-hdfs1-DATANODE-flume-agent-03.log.outa1.sources.r1.hostname = flume-agent-03a1.sources.r1.servicename = datanode ###要检查flume-env.sh的JAVA_HOME目录是否存在 12.聚合端 sht-sgmhadoopcm-01,配置root用户环境变量和解压,修改agent配置文件[root@sht-sgmhadoopcm-01 tmp]# vi /etc/profileexport JAVA_HOME=/usr/java/jdk1.7.0_67-clouderaexport FLUME_HOME=/tmp/flume-ngexport FLUME_CONF_DIR=$FLUME_HOME/conf export PATH=$FLUME_HOME/bin:$JAVA_HOME/bin:$PATH[root@sht-sgmhadoopcm-01 tmp]# source /etc/profile[root@sht-sgmhadoopcm-01 tmp]# [root@sht-sgmhadoopcm-01 tmp]# unzip flume-ng.zip[root@sht-sgmhadoopcm-01 tmp]# cd flume-ng/conf [root@sht-sgmhadoopcm-01 conf]# vi flume-env.shexport JAVA_HOME=/usr/java/jdk1.7.0_67-cloudera ###测试: 先聚合, sink到hdfs端[root@sht-sgmhadoopcm-01 conf]# vi avro_memory_hdfs.properties# Name the components on this agenta1.sources = r1a1.sinks = k1a1.channels = c1 # Describe/configure the sourcea1.sources.r1.type = avroa1.sources.r1.bind = 172.16.101.54a1.sources.r1.port = 4545 # Describe the sinka1.sinks.k1.type = hdfsa1.sinks.k1.hdfs.path = hdfs://172.16.101.56:8020/testwjp/a1.sinks.k1.hdfs.filePrefix = logsa1.sinks.k1.hdfs.inUsePrefix = . a1.sinks.k1.hdfs.rollInterval = 0### roll 16 m = 16777216 bytesa1.sinks.k1.hdfs.rollSize = 1048576a1.sinks.k1.hdfs.rollCount = 0a1.sinks.k1.hdfs.batchSize = 6000 a1.sinks.k1.hdfs.writeFormat = texta1.sinks.k1.hdfs.fileType = DataStream # Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.keep-alive = 90 a1.channels.c1.capacity = 1000000a1.channels.c1.transactionCapacity = 6000 # Bind the source and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1 13.后台启动[root@sht-sgmhadoopcm-01 flume-ng]# source /etc/profile[hdfs@flume-agent-01 flume-ng]$ . ~/.bash_profile [hdfs@flume-agent-02 flume-ng]$ . ~/.bash_profile [hdfs@flume-agent-03 flume-ng]$ . ~/.bash_profile [root@sht-sgmhadoopnn-01 flume-ng]# nohup flume-ng agent -c conf -f /tmp/flume-ng/conf/avro_memory_hdfs.properties -n a1 -Dflume.root.logger=INFO,console & [hdfs@flume-agent-01 flume-ng]$ nohup flume-ng agent -c /tmp/flume-ng/conf -f /tmp/flume-ng/conf/exec_memory_avro.properties -n a1 -Dflume.root.logger=INFO,console &[hdfs@flume-agent-01 flume-ng]$ nohup flume-ng agent -c /tmp/flume-ng/conf -f /tmp/flume-ng/conf/exec_memory_avro.properties -n a1 -Dflume.root.logger=INFO,console &[hdfs@flume-agent-01 flume-ng]$ nohup flume-ng agent -c /tmp/flume-ng/conf -f /tmp/flume-ng/conf/exec_memory_avro.properties -n a1 -Dflume.root.logger=INFO,console &14.校验:将集群的日志下载到本地,打开查看即可(略) ------------------------------------------------------------------------------------------------------------------------------------------------ 【备注】: 1.错误1 flume-ng安装的机器上没有hadoop环境,所以假如sink到hdfs话,需要用到hdfs的jar包[ERROR - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:146)] Failed to start agent because dependencies were not found in classpath. Error follows.java.lang.NoClassDefFoundError: org/apache/hadoop/io/SequenceFile$CompressionType 只需在其他安装hadoop机器上搜索以下5个jar包,拷贝到$FLUME_HOME/lib目录即可。搜索方法: find $HADOOP_HOME/ -name commons-configuration*.jar commons-configuration-1.6.jarhadoop-auth-2.7.3.jarhadoop-common-2.7.3.jarhadoop-hdfs-2.7.3.jarhadoop-mapreduce-client-core-2.7.3.jarprotobuf-java-2.5.0.jarhtrace-core-3.1.0-incubating.jarcommons-io-2.4.jar 2.错误2 无法加载自定义插件的类 Unable to load source type: com.onlinelog.analysis.AdvancedExecSource2017-01-06 21:10:48,278 (conf-file-poller-0) [ERROR - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:142)] Failed to load configuration data. Exception follows.org.apache.flume.FlumeException: Unable to load source type: com.onlinelog.analysis.AdvancedExecSource, class: com.onlinelog.analysis.AdvancedExecSource 执行hdfs或者root用户的环境变量即可[root@sht-sgmhadoopcm-01 flume-ng]# source /etc/profile[hdfs@flume-agent-01 flume-ng]$ . ~/.bash_profile [hdfs@flume-agent-02 flume-ng]$ . ~/.bash_profile [hdfs@flume-agent-03 flume-ng]$ . ~/.bash_profile

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

应用迁云之镜像迁移-(5)阿里云上跨VPC和区域、账号镜像迁移实践

目前在阿里云云上的镜像迁移主要需求场景 n 跨VPC迁移ECS实例比如从VPC A迁移到VPC B环境中 n 跨区域迁移ECS实例比如从上海区域迁移到杭州区域 n 跨账号迁移ECS实例比如从账号A迁移到账户B 阿里云提供ECS实例快照和自定义镜像支持系统盘和数据盘的功能并且自定义镜像可以跨区域复制和共享给其他账号使用基于这些功能特性我们就可以来实现跨VPC、跨区域、跨账号的镜像迁移。 跨VPC镜像迁移流程如下: 跨区域镜像迁移流程如下: 跨账号镜像迁移流程如下: 1. ECS快照生成 所谓快照就是某一个时间点上某一个磁盘的数据备份需要注意的是如果需要保持数据的一致性需要停机或停服务的方式进行快照 ECS快照操作流程 1登录云服务器管理控制台 2单击实例所在的地域然后单击左侧导航的实例。单击实例的名称或在实例右侧单击管理 3单击左侧的本实例磁

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

Android官方开发文档Training系列课程中文版:布局性能优化之布局层级优化

原文地址:http://android.xsoftlab.net/training/improving-layouts/index.html 引言 布局是直接影响用户体验的关键部分。如果实现的不好,那么布局很有可能会导致内存的紧张。Android的SDK包含的一些工具可以用来检查布局性能上的问题。结合本章的课程学习,你将有能力以低成本的内存开销实现更为顺畅的UI体验。 优化布局层级 有一个常见的误解就是使用基本的布局结构会使布局更高效。然而却不是这样的,每一个控件、布局容器都需要执行初始化、排布、绘制等过程。举个例子,使用内嵌的LinearLayout会使布局层级过度加深。进一步讲,内嵌多个使用了layout_weight参数的控件所花费的代价尤其高昂,因为每个子View都需要被测量两次。这在布局被重复加载时尤为重要,比如使用在ListView或GridView中的时候。 在这节课我们将会学习如何使用Hierarchy Viewer工具及Layoutopt工具来检查、优化布局。 布局检查 Android的SDK包含了一个名为Hierarchy Viewer的工具。使用该工具可以帮助发现影响布局性能的瓶颈。 Hierarchy Viewer工作于所选择的进程上,它会显示一个布局树。每个View节点上的信号灯代表了该View在测量、排布、绘制上的性能优劣,这可以帮助你发现潜在的问题。 举个例子说明:下图是ListView的一个Item。该Item左边用于显示图片,而右边则显示两行文本。因为该Item会被进行多次加载,所以对其优化的话,那么UI性能会有显著的提升。 Hierarchy Viewer工具位于< sdk>/tools/目录下。打开后,Hierarchy Viewer会列出当前的可用设备以及设备上运行的组件。点击Load View Hierarchy来浏览所选组件的布局层级。下图是上图位于ListView中的运行效果演示: 在上图中,我们可以看到View的层级为3,并且在文本的排布上发现了一些问题。点击每个节点我们可以看到每个阶段所花费的时间(如下图所示)。那么我们就可以很清晰的知道哪个Item在测量、排布、渲染上花费的时间最长,所以我们就需要花点时间专门对其优化。 这里我们可以看到每个阶段所花费的时间: Measure: 0.977ms Layout: 0.167ms Draw: 2.717ms 调整布局 因为上面的示例说布局的性能慢是由于内嵌了一个LinearLayout,所以改进这部分性能只能通过扁平化来处理。要尽量使布局变浅变宽,杜绝变窄变深。RelativeLayout可以实现这样的布局。所以当使用RelativeLayout实现这样的布局时,那么可以看到布局的层级变为了2。我们所看到的布局图就是这个样子: 下面是优化后的时间开销: Measure: 0.598ms Layout: 0.110ms Draw: 2.146ms 我们可能会看到很微小的改进。 在改进时间上的大部分差别是由于LinearLayout的权重造成的,它会降低测量的速度。这里的示例仅仅是个优化手段的演示,在开发过程中应当认真考虑是否有必要使用权重。 使用Lint 开发者应该使用lint工具来检查布局层级是否有可优化的地方。Lint 与Layoutopt 相比有更加强大的功能。一些Lint的检查规则如下: 使用组合图形 - 一个包含了ImageView和TextView的LinearLayout作为组合图形处理起来更加高效。 合并根帧布局 - 如果一个FrameLayout是根布局,并且它没有提供背景色或内边距什么的,那么可以使用合并标签将其替换,这可以稍微的改进性能。 无用的叶子节点 - 如果一个布局没有子View,没有背景色,那么通常可以将其移除。 无用的中间节点 - 如果一个布局内部只含有一个子View,并且不是ScrollView或者根布局,也没有背景色,那么可以将它移除,并将其子View移动到它的父容器内。 非常深的布局嵌套 - 一个被嵌套很深的布局通常不利于性能。考虑使用RelativeLayout或者GridLayout这种扁平化布局来改进性能。默认的最大深度为10。 Lint的另一个好处就是它被集成进了Android Studio。Lint会在程序编译时自动运行。 你也可以管理检查Lint的配置,在Android Studio内通过File>Settings>Project Settings路径可以找到。 Lint可以自动的修复一些问题,并且会对余下的问题提供一些优化建议,以便使开发者手动修复。

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

Android官方开发文档Training系列课程中文版:后台服务之IntentService的创建

原文地址:http://android.xsoftlab.net/training/run-background-service/index.html 引言 除非特别指定,否则所有的操作都是在UI线程中执行的。不过这会引起问题,因为长时间的耗时操作会妨碍UI线程的运行。这会惹恼用户,并可能会引起系统错误。为了避免这样的情况出现,Android为此提供了一些类,可以使这些耗时操作放在单独的线程中执行。这里用到最多的就是IntentService了。 这节课主要学习如何实现IntentService,以及如何向它发送工作请求,以及如何响应它的执行结果。 创建后台服务 IntentService提供了一个非常简单的构造方法。IntentService允许执行耗时操作,而又不会引起UI线程的阻塞。同样的,IntentService还不受UI生命周期的影响。所以它可以在一个单独的环境中持续运行。 不过IntentService也是有限制的,列举如下: 它不可以与UI线程直接交互。为了将结果递送到UI,不得不采用广播的形式将结果发送出去。 工作请求是按顺序执行的。如果目前已经有一个操作在IntentService中执行,那么再往其中发送操作请求的话,这些操作请求都将会等待,直至第一个操作完成。 IntentService中的操作不可以被中断。 不管怎样,大多数情况下,IntentService是执行后台操作的首选方式。 这节课主要学习如何实现IntentService,以及如何创建请求回调方法onHandleIntent(),最后我们还会学习如何在清单文件中声明该IntentService。 创建IntentService 首先需要创建一个类并继承IntentService,然后重写它的onHandleIntent()方法: public class RSSPullService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { // Gets data from the incoming Intent String dataString = workIntent.getDataString(); ... // Do work here, based on the contents of dataString ... } } 这里要注意普通Service的那些回调方法,比如onStartCommand()方法,它会被IntentService自动调用,所以在IntentService内部最好不要重写这些方法。 在清单文件中声明IntentService IntentService同样需要在清单文件中定义。它的定义方式与普通Service是一样的。 <application android:icon="@drawable/icon" android:label="@string/app_name"> ... <!-- Because android:exported is set to "false", the service is only available to this app. --> <service android:name=".RSSPullService" android:exported="false"/> ... <application/> 其中android:name属性说明了IntentService的类名。 这里要注意:Service标签内并没有包含Intent Filter。因为其它组件是通过显示Intent发送工作请求的。所以这里不需要定义Intent Filter。这也意味着只有相关组件内的APP或者拥有相同用户ID的程序才可以访问该服务。 现在我们已经定义好了一个IntentService类,接下来就可以通过Intent对象向其发送工作请求了。关于如何构建相关对象以及如何发送请求到IntentService的相关内容将会在下节课学习。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册