此公示中 m是数据集中点的个数 ½是一个常量,这样是为了在求梯度的时候,二次方乘下来就和这里的½抵消了,自然就没有多余的常数系数,方便后续的计算,同时对结果不会有影响 y 是数据集中每个点的真实y坐标的值 h 是我们的预测函数,根据每一个输入x,根据Θ 计算得到预测的y值,即 image.png 我们可以根据代价函数看到,代价函数中的变量有两个,所以是一个多变量的梯度下降问题,求解出代价函数的梯度,也就是分别对两个变量进行微分
参考官网: https://www.cloudera.com/documentation/enterprise/release-notes/topics/rn_consolidated_pcm.html#pcm_kafka 4.2Kafka的Parcel部署 1.从Cloudera官网下载Kafka的Parcel包,下载地址如下 http://archive.cloudera.com/kafka/parcels/2.1.1.18/KAFKA-2.1.1-1.2.1.1.p0.18-el6.parcel http://archive.cloudera.com/kafka/parcels/2.1.1.18/KAFKA-2.1.1-1.2.1.1.p0.18-el6.parcel.sha1 http://archive.cloudera.com/kafka/parcels/2.1.1.18/manifest.json 2.将上述3个文件下载至/var/www/html/kafka2.1.1.18目录下 [root@ip-172-31-6-148html]# cd /var/www/html/ [root@ip-172-31-6-148 html]# mkdir kafka2.1.1.18 [root@ip-172-31-6-148 html]# cd kafka2.1.1.18/ [root@ip-172-31-6-148 kafka2.1.1.18]# ll total 66536 -rw-r--r-- 1 rootroot 68116503 Mar 27 17:39 KAFKA-2.1.1-1.2.1.1.p0.18-el6.parcel -rw-r--r-- 1 rootroot 41 Mar 27 17:39KAFKA-2.1.1-1.2.1.1.p0.18-el6.parcel.sha1 -rw-r--r-- 1 rootroot 5252 Mar 27 17:40 manifest.json [root@ip-172-31-6-148 kafka2.1.1.18]# 3.验证是否部署成功 4.3安装Kafka服务 1.通过CM配置Kafka的Parcel包地址并保存
2.点击下载、分配并激活 3.回到CM主页,添加Kafka服务 4.选择Kafka服务,点击“继续” 5.为Kafka选择一组依赖关系,点击“继续” 6.选择Kafka Broker和Gateway,点击“继续” 7.根据集群环境修改Kafka配置,点击“继续” 8.Kafka安装完成 9.修改Kafka Broker的heap大小,默认为50M,可能会导致Kafka启动失败 保存配置,重新部署客户端并重启相应服务。 5.服务验证 5.1Kudu验证 建表语句如下: CREATE TABLE my_first_table( id BIGINT, name STRING, PRIMARY KEY(id) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU; 通过Impala-shell创建Kudu表 [impala@ip-172-31-6-148root]$ impala-shell -iip-172-31-10-118.fayson.com ... [ip-172-31-10-118.fayson.com:21000] > show tables; Query: show tables +------------+ | name | +------------+ | test | | test_table | +------------+ Fetched 2 row(s) in 0.06s [ip-172-31-10-118.fayson.com:21000] > CREATE TABLEmy_first_table( > id BIGINT, > name STRING, > PRIMARY KEY(id) > ) >PARTITION BY HASH PARTITIONS 16 > STORED AS KUDU; Query: create TABLE my_first_table( id BIGINT, name STRING, PRIMARY KEY(id) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU Fetched 0 row(s) in 2.43s [ip-172-31-10-118.fayson.com:21000] > 插入数据并查询 [ip-172-31-10-118.fayson.com:21000]> insert into my_first_table values(1,'fayson'); Query: insert into my_first_table values(1,'fayson') ... Modified 1 row(s), 0 row error(s) in 3.92s [ip-172-31-10-118.fayson.com:21000] >select * from my_first_table; ... +----+--------+ | id | name | +----+--------+ | 1 | fayson | +----+--------+ Fetched 1 row(s) in 1.02s [ip-172-31-10-118.fayson.com:21000] > 通过Kudu Master Web UI查看 5.2Spark2验证 [root@ip-172-31-6-148~]# spark2-shell Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). ForSparkR, use setLogLevel(newLevel). 17/09/11 09:46:22 WARN spark.SparkContext: Support for Java 7 is deprecated as of Spark 2.0.0 Spark context Web UI available at http://172.31.6.148:4040 Spark context available as 'sc' (master = yarn, app id =application_1505121236974_0001). Spark session available as 'spark'. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/__/ '_/ /___/ .__/\_,_/_//_/\_\ version 2.1.0.cloudera1 /_/ Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67) Type in expressions tohave them evaluated. Type :help for more information. scala> var textFile=sc.textFile("/fayson/test/a.txt") textFile: org.apache.spark.rdd.RDD[String] =/fayson/test/a.txt MapPartitionsRDD[1] at textFile at :24 scala> textFile.count() res0: Long = 3 scala> 5.3Kafka验证 1.创建一个test的topic [root@ip-172-31-6-148hive]# kafka-topics --create--zookeeper ip-172-31-6-148.fayson.com:2181 --replication-factor 3 --partitions1 --topic test 2.向topic发送消息 [root@ip-172-31-6-148hive]# kafka-console-producer--broker-list ip-172-31-10-118.fayson.com:9092 --topic test 3.消费topic的消息 [root@ip-172-31-6-148hive]# kafka-console-consumer --zookeeperip-172-31-6-148.fayson.com:2181 --topic test --from-beginning 4.查看topic描述信息 [root@ip-172-31-6-148hive]# kafka-topics --describe--zookeeper ip-172-31-6-148.fayson.com:2181 --topic test
「深度学习福利」大神带你进阶工程师,立即查看>>> 不知道大家发现没,我们在实现hive表 交集的时候,使用sql 语句中的 union 和 intersect 会失败。这是因为该版本的hive并不支持 select id from t1 union select id from t2 select id from t1 intersect select id from t2 所以我们想到了另一种思路 select id from t1 inner join t2 on t1.id = t2.id 好了,大家有需要拿去用吧 ,还有, 因为在hive 不支持直接嵌套查询,所以需要在select 嵌套查询的时候 设置一个临时表
原文: https://www.dezyre.com/article/cloudera-vs-hortonworks-vs-mapr-hadoop-distribution-comparison-/190 (译文): 对于企业而言,不管过去是否曾使用过Hadoop,正确选择Hadoop商业发行版都很重要。当企业准备投入巨大的财力在Hadoop平台的硬件和解决方案上时,选择某个商业版的Hadoop系统就变得特别重要了。根据业务需要选择正确的Hadoop商业发行版可以带来更多的数据解决方案并且可以获得业界专业人士的认可。这篇文章将从成本、技术细节、部署和维护等几个方面比较Cloudera、Hortonworks和MapR发布的Hadoop版本。 Hadoop 是一个开源项目,先后有许多公司在其框架基础上进行了增强并且发布了商业版本。Hadoop项目的最大诱惑在于使用者可以根据自身的业务需要定制差异化的功能。在Apache开源社区,Hadoop把所有的相关项目组成一个完整的生态系统,用户几乎不费吹灰之力就可以通过搭配一些组件来实现一个完整功能。 哪些人需要Hadoop分布式系统? l 需要学习和临时使用Hadoop的各行业专业人士 l 需要在大数据的背景下推进业务解决方案演进的各类机构 l 需要在Hadoop生态系统中开发新工具的人员
商业版本的Hadoop有哪些改进? Hadoop商业发行版的提供者们通过优化核心代码、增强易用性、提供技术支持和持续版本升级为Hadoop平台实现了许多新功能。市场上受认可的Hadoop商业发行版的提供者主要有Cloudera,MapR和Hortonworks。 他们发行的Hadoop商业版本都能与Apache社区开源版本兼容,但它们之间有哪些区别呢? l 框架核心 :Cloudera,MapR和Hortonworks这三家公司都把Hadoop核心框架打包到了他们的商业版本中;在这基础上,他们都提供了技术支持服务和定制化开发服务。 l 系统集成 :MapR 的商业版Hadoop可靠地支持一系列功能,包括:实时流数据处理,与已有系统集成的内嵌的连接器,数据安全保护,企业级工程品质。 l 系统管控 :Cloudera和MapR 商业发行版中都包含了为系统管理员提供了配置、监控和优化的管控平台。 Cloudera,Hortonworks和MapR异同之处分析
版本
优点
缺点
CDH
CDH有一个友好的用户界面及一些实用的工具,比如:Impala
CDH相对MapR Hadoop来说,运行效率显著降低 MapR Hadoop
HDP 运行效率高;节点之间可以通过NFS直接访问
唯一一个能运行在Windows上的Haoop系统 MapR Hadoop没有像CDH那样的用户界面
Ambari管控界面功能比较简单,不够丰富
相似性: l Cloudera, Hortonworks 和MapR三家公司都专注于Hadoop平台开发,商业版本的Hadoop系统是他们的全部收入来源。 l 这三家公司都是中等规模的公司,都拥有一些优质客户和来自其他行业的投资伙伴。 l 这三家公司都提供了免费版本的下载,不同的是,MapR和Cloudera 还为付费客户提供功能增强版本。 l 这三家公司都建立了技术支持社区帮助用户解决遇到的问题以及在用户需要时提供系统演示。 l 这三家公司都通过测试保证发行版本满足用户业务对稳定性和安全性需求。
下面我们会在对比每一个商业版本功能的基础上分析其差异性: Cloudera — CDH Cloudera 是Hadoop领域知名的公司和市场领导者,提供了市场上第一个Hadoop商业发行版本。它拥有350多个客户并且活跃于Hadoop生态系统开源社区。在多个创新工具的贡献着排行榜中,它都名列榜首。它的系统管控平台——Cloudera Manager,易于使用、界面清晰,拥有丰富的信息内容。Cloudera 专属的集群管控套件能自动化安装部署集群并且提供了许多有用的功能,比如:实时显示节点个数,缩短部署时间等。同时,Cloudera 也提供咨询服务来解决各类机构关于在数据管理方案中如何使用Hadoop技术以及开源社区有哪些新内容等疑虑。美国电商“高朋”公司是CDH的用户。 CDH的主要特性: l 在线不停机添加新组件 l 多集群统一管理 l 提供差异化配置的节点模板。用户不必使用单一配置的Hadoop集群,可以依此创建差异化配置的集群。 l Hortonworks 和Cloudera都依赖于HDFS的DataNode 和NameNode架构来做数据切分。
MapR — Hadoop MapR的Hadoop商业发行版紧盯市场需求,能更快反应市场需要。一些行业巨头如思科、埃森哲、波音、谷歌、亚马逊都是MapR的Hadoop的用户。与Cloudera和Hortonworks不同的是, MapR Hadoop不依赖于Linux文件系统,也不依赖于HDFS,而是在MapRFS文件系统上把元数据保存在计算节点,快速进行数据的存储和处理。 MapR Hadoop的主要特性: l 由于它基于MapRFS,它是唯一一个能不依赖于Java而提供Pig,Hive和Sqoop的Hadoop。 l MapR Hadoop是最适合应用于生产环境的Hadoop版本,它包含了许多易用性、高效和可信赖的增强功能。 l MapR Hadoop集群节点可以通过NFS直接访问,因此用户可以像使用Linux文件系统一样在NFS上直接挂载MapR文件。 l MapR Hadoop提供了完整的数据保护,方便使用并且没有单点故障。 l MapR Hadoop被认为是运行最快的Hadoop版本。 尽管从集群规模来说,MapR Hadoop还不如Hortonworks 和Cloudera,只能暂列第三,但相对其它版本的Hadoop来说,它易用性最强,运行最快。因此,如果用户想选择带有足够创意和学习资料的Hadoop,那么MapR Hadoop将是不二之选。
Hortonworks — HDP Hortonworks是由一些雅虎的工程师创立的公司,提供针对Hadoop的技术服务。与其它公司不同的是,它提供完全开源的Hadoop数据平台并且用户可以免费使用。用户可以很方便得下载Hortonworks 的Hadoop发行版HDP并把它集成到各种应用中。Ebay、三星、彭博、Spotify 都是HDP的用户。Hortonworks 也是第一个基于Hadoop 2.0提供满足生产环境需要的Hadoop版本。尽管CDH在其早期的版本中包含了Hadoop 2.0的部分功能,但这些功能无法满足生产环境需要。HDP 也是目前唯一能支持Windows的Hadoop版本。用户可以在Azure 上通过HDInsight 服务部署Windows上的 Hadoop。 HDP的主要特性: l HDP 通过Stinger项目提升了Hive的性能 l HDP 通过新的Hadoop分支来避免用户被厂商绑定 l 聚焦于提升Hadoop平台的实用性
3、读时模式 VS 写时模式 传统型数据库采用写时模式,即在数据写入数据库时对模式进行检查。Hive不会在数据加载时进行验证,而是在查询时进行,也就是读时模式。如果模式和文件内容并不匹配,hive会极力读取这些数据。比如每行记录中的字段个数少于对应的模式中定义的字段个数的话,那么用户将会看到查询结果中多出来的字段值为null。
4、HiveQL:数据定义 4.1 新增数据库 create database [数据库名]; 如果没有显示指定数据库,那么将会使用默认的数据库default; 数据库所在的目录位于属性 hive.metastore.warehouse.dir 所指定的顶层目录之后,假设使用的是默认的配置,也就是/user/hive/warehouse,那么当我们创建数据库financials时,Hive将会对应地创建一个目录/user/hive/warehouse/financials.db,financials.db是一个文件夹,在financials数据库下建的表对应的文件都放这个目录下面。 4.2 建表 4.2.1 管理表(内部表) 默认创建的表即为管理表(内部表),区别于外部表,管理表(内部表)的数据文件是加载到内部,由hive来管理。 create table 表名(列名 列类型,列名 列类型......) location '路径'; location指定表对应的目录,默认为对应数据库目录下面,如在financials数据库下面新建的records表对应的目录为/user/hive/warehouse/financials.db/records,后面该表对应的数据文件会存储到该目录下。 4.2.2 外部表 create external table if not exists [表名] (列名 列类型,列名 列类型.....) row format delimited fields terminated by ',' location '路径'; 关键字external 来表名创建的是外部表,location声明该表对应的数据文件的位置,该位置处于外部系统,hive不会把该数据文件加载到系统内。在删除表时,hive不会同时此数据文件。 外部表适用于hive和其他的工具共用一份数据,可以进行一些查询的操作,但hive并不拥有此数据的所有权。 4.2.3 分区表 创建一张表partition_log,以dt和country这两个字段进行分区。 create table partition_log(ts bigint, line string) partitioned by (dt string, country string); 从本地文件给表partition_log加载数据,在加载时要为加载的数据指定分区,这里指定的值dt为2001-01-01,2001-01-01为GB。 load data local inpath '/root/hive/partitions/file1' into table partition_log partition (dt='2001-01-01', country='GB'); hive此时会在partition_log表对应的路径下面创建 /dt=2001-01-01/country=GB/ 这两级目录。 分区表本质上就是将数据进行归类,同一类的数据放到一个文件夹下,提供查询的效率。 4.2.4 外部分区表 要使用外部分区表,首先要创建一张外部表。 create external table external_table (列名 列类型,列名 列类型....) partitioned by (year int, month int ,day int) 用alter table为表增加一个分区,并为该分区指定一个外部文件的路径。 alter table external_table add partition(year=2012,month=1,day=2) location 'hdfs://master_server/data/log_messages/2012/01/02'
5、HiveQL:数据操作 5.1 向管理表中装载数据 load data local inpath '${env.HOME}/california-employees' overwrite into table employees partition (country='US', state='CA'); inpath指定数据文件的路径,此路径可以是一个目录,hive会把该目录下所有的文件都加载进来。partition指定分区,如果不是分区可以省略。overwrite关键字表示覆盖,hive会把原先表目录下的数据文件删除再加载新的数据文件。
5.2 通过查询语句向表中插入数据 insert overwrite table employees partition (country='US',state='OR') select * from staged_employees se where se.cntry='US' and se.st='OR'; 如果向多个分区插入数据,可以采用如下方式: from staged_employees se insert overwrite table employees partition(country='US' , state='OR') select * where se.cnty='US' and se.st='OR' insert overwrite table employees partition(country='US',state='CA') select * where se.cnty='US' and se.st='CA';
动态分区插入 基于查询参数推断出需要创建的分区名称。 insert overwrite table employees partition (country,state) select ... ,se.cnty,se.st from staged_employees se; Hive根据select语句中最后2列来确定分区字段country和state的值。 也可以混合使用动态和静态分区,下面例子指定了country字段的值为静态的US,而分区字段state是动态值: insert overwrite table employees partition (country='US',state) select ...,se.cnty,se.st from staged_employees se where se.cnty='US'; 静态分区键必须出现在动态分区键之前。
5.3 单个查询语句中创建表并加载数据 create table ca_employees as select name,salary,address from employees where se.state='CA';
6、HiveQL:查询 6.1 select ... from...语句 1、查询array数组中的元素,使用索引来查找,比如: select name,subordinates[0] from employees; 2、查询map中的元素用 [键名] select name,deductions["State Taxes"] from employees; 3、查询struct中的元素用“点”符号 select name,address.city from employees; limit语句 限制返回的行数 select * from employees limit 2; case...when...then 句式 case...when...then语句和if条件语句类似,用于处理单个列的查询结果。例如: select name,salary, case when salary<5000.0 then 'low' when salary>=5000.0 and salary<7000.0 then 'middle' when salary>7000.0 then 'high' end as bracket from employees;
6.2 where语句 1、like和rlike like和rlike都可以进行模糊匹配,rlike是like的增强版,可以通过正则表达式来指定匹配条件,例如: select name,address.street from employees where address.street rlike '.*(Chicago|Ontario).*'; 6.3 group by 语句 having语句 having语句用来对group by产生的分组进行条件过滤,例如: select avg(price_close) from stocks where exchange='NASDAQ' and symbol='AAPL' group by year having avg(price_close)>50.0 6.4、join语句 1、 内连接 :只有进行连接的两个表中都存在与连接标准相匹配的数据才会被保留下来。Hive的join语句只支持等值连接,不支持“<” 和“>”。 select a.ymd, a.price_close, b.price_close from stocks a join stocks b on a.ymd=b.ymd where a.symbol='APPL' and b.symbol='IBM'; 2、 join语句优化 :hive在执行join语句时,会把其他表都缓存起来,然后扫描最后那个表进行计算。所以在保证join语句中表从左至右要依次递增。比如: select a.name, b.companyname from company a join employees b on a.companycode=b.companycode,要保证表大小company 3、 left outer join左外连接 :左边表符合where条件的全部保留,对应右边表选择的列如果没有符合连接条件的将会返回null值。 4、 right outer join右外连接 :返回右边表所有符合where语句的记录。左表中匹配不上的字段用null代替。
6.5 order by 、sort by、distribute by、cluster by 1、 order by: 进行全局排序,会有一个所有的数据都通过一个reducer进行处理的过程。 2、 sort by: 进行局部排序,只会在每个reducer中对数据进行排序。 distribute by: distribute by和sort by配合使用。distribute by可以让具有相同字段值的记录被分发到一个reducer,实现了对数据进行分组,并根据sort by指定的字段进行组内排序。例如: select s.ymd, s.symbol, s.price_close from stocks s distribute by s.symbol sort by s.symbol ASC, s.ymd ASC; 3、 cluster by: 相当于distribute by...sort by...语句中distribute by 和sort by的是同一个字段,表示对数据进行分组显示。 select s.ymd, s.symbol, s.price_close from stocks s cluster by s.symbol;
7、HiveQL:视图 视图可以允许保存一个查询并像对待表一样对这个查询进行操作。这是一个逻辑结构,因为它不像一个表会存储数据。换句话说,Hive目前暂不支持物化视图。 使用视图的好处: 1、降低查询复杂度,例如下面以个嵌套子查询: from ( select * from people join cart on (cart.people_id=people.id) where firstname='john' ) a select a.lastname where a.id=3; 将嵌套子查询声明为一个视图: create view shorter_join as select * from people join cart on (cart.people_id=people.id) where firstname='john'; 这样就可以用这个视图来简化第一个查询: select lastname from shorter_join where id=3; 2、视图可以只展示一张表的部分内容,而不会让用户看到全部。
8、HiveQL:索引 Hive只有有限的索引功能,因为Hive没有主键和外键。建立索引可以加速查询速度。一张表的索引数据存储在另一张表中。 8.1 创建索引 例如对表employees的country字段建立索引: create index employees_index on table employees(country) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild idxproperties('creator'='me', 'created_at'='some_time') in table employees_index_table partitioned by (country,name) comment 'Employees indexed by country and name.'; employees_index表示索引名称,as...语句指定了索引处理器,也就是一个实现了索引接口的类,也可以使用其他的类(Hive内置的其他实现类、第三方实现类或者是自定义实现类),with deferred rebuild表示重建索引,这样新建的索引将呈现空白状态。in table...指定了一张新表,用来存储该索引数据。
8.2 Bitmap索引 bitmap索引应用于排重后值较少的列,如性别、年级等。
9、模式设计 9.1 按天划分的表 每天一张表的方式在数据库领域用来应对数据集增长很快的情况,通常会在表名中加入一个时间戳,比如upply_2011_01_01、upply_2011_01_02等等。对于hive,这种情况应该使用分区表,为每一天创建一个对应的分区。 create table supply(id int, part string, quantity int) partitioned by (int day); alter table supply add partition (day=20110102); alter table supply add partition (day=20110103); alter table supply add partition (day=20110104); 9.2 分区创建策略 一个理想的分区方案不应该导致产生太多的分区和文件夹目录,并且每个目录下的文件夹应该足够的大,应该是文件系统HDFS中块大小的若干倍。 9.3 同一份数据多种处理 hive提供了一个独特的语法,它可以从一个数据源产生多个数据聚合,而无需每次聚合都要重新扫描一次。例如,下面2个查询都会从源表history表读取数据,然后导入到2个不同的表中: insert overwrite table sales select * from history where action='purchased'; insert overwrite table credits select * from history where action='returned'; 上面的方式效率低下,下面这个查询可以达到同样的目的,却只需要扫描history表一次就可以: from history insert overwrite sales select * where action='purchased' insert overwrite credits select * where action='returned'; 9.4 分桶表存储数据 分桶是根据某一列的值把数据分成指定个数的文件进行存储,列值相同或者列值的hash值相同的记录会被存储到同一个文件。 分桶可以用于数据取样,同时当查询条件是分桶字段的话,也可以提高查询效率。 9.5 使用列存储表 hive通常使用行式存储,但是也提供了混合列式存储。下面两种表适合采用列式存储: (1)某些列的值会有很多重复的值,比如包含性别、年龄、状态等属性的表。 (2)表含有非常多的字段。 9.6 使用压缩 压缩都可以使磁盘上存储的数据量变小,这样可以通过降低I/O来提高查询执行速度。压缩和解压缩会消耗CPU资源,但是MapReduce任务通常是I/O密集型,所以几乎在所有场景下都要使用压缩。除了CPU密集型的场景,例如一些机器学习算法等。
13、Streaming 自定义函数需要开发人员编写java代码,对于不熟悉java的开发人员,hive提供了streaming的方式来完成同样的事情。streaming就是在hiveQL中允许使用系统的脚本来对数据进行处理。 例如,使用Linux系统中的命令cat来查询表: select transform(e.name, e.salary) using '/bin/cat' as name, salary from employee e; 同时还允许运行用户自定义的脚本。
14、文件格式、记录格式和文件压缩 14.1 文件格式 Hive内置了三种文件格式:文本文件、SequenceFile、RCfile。当从表中读取数据时,Hive会使用到InputFormat,向表中写入数据时,会使用OutputFormat。在create table...建表时,通过stored as...来指定文件格式。 14.1.1 文本文件 文本文件格式是默认存储格式,等价于在创建表时通过 stored as textfile语句指定使用文本存储格式。对应的InputFormat是TextInputFormat,OutputFormat是HiveIgnoreKeyTextOutputFormat。 14.1.2 SequenceFile SequenceFile是hadoop本身就支持的一种标准文件格式,在定义表结构时通过stored as sequencefile语句指定。对应的InputFormat是SequenceFileInputFormat,OutputFormat是HiveSequenceFileOutputFormat。 14.1.3 RCfile 采用列式存储。一张表有成百上千字段,而大多数的查询只需要使用到其中的一小部分字段,这时候该表就适合采用RCfile进行存储。对应的InputFormat是RCFileInputFormat,OutputFormat是RCFileOutputFormat。 14.1.4 自定义文件格式 可以通过实现InputFormat和OutFormat来自定义文件格式。在定义表结构时,可以指定InputFormat和OutFormat,例如: create table colunmTable(key int, value int) row format serde 'org.apache.hive.serde2.columnar.ColumnarSerde' stored as inputformat 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' 14.2 记录格式 14.2.1 SerDe SerDe是序列化/反序列化的接口,在内部,Hive引擎使用定义的InputFormat来读取一行数据记录,这行记录之后会被传递给SerDe.deserialize()方法来处理,SerDe决定了一行记录如何被解析。Hive内置了几个SerDe,比如处理正则表达式RegexSerDe,CSV文件CSVSerDe。 14.2.2 JSON SerDe JsonSerde来自于第三方,可以用于查询json格式的记录。例如: create external table messages ( msg_id bigint, tstamp string, text string, user_id bigint, user_name, string ) row format serde "org.apache.hadoop.hive.contrib.serde2.JsonSerde" with serdeproperties ( "msg_id"="$.id", "tstamp"="$.created_at", "text"="$.text", "user_id"="$.user.id", "user_name"="$.user.name" ) location '/data/messages'; row format serde用于指定使用的SerDe,with serdeproperties用于给SerDe传递属性信息,上面的例子中用这些属性将json文档和表的字段对应起来。定义好之后,就可以像通常一样执行查询:select * from messages; 14.3 文件压缩 压缩可以节省磁盘存储空间,减小磁盘和网络I/O时间。Hive表的文件存储在hadoop上,可以使用hadoop提供的压缩对文件进行压缩。除此以外,hive也提供了两个跟压缩相关的特有设置: (1)开启中间压缩 hive.exec.compress.intermediate 对中间数据进行压缩可以减少job中map和reduce task间的数据传输量 (2)最终输出结果压缩 hive.exec.compress.output和mapred.output.compression.codec
15、存储处理程序和NoSQL 存储处理程序可以将外部实体表作为标准的hive表进行处理,它包含了InputFormat、OutputFormat、SerDe和Hive需要使用的特定的代码。例如可以将Hbase、Cassandra、DynamoDB这样的NoSQL数据库中的表作为hive表来处理,下面是创建一个指向Hbase表的Hive表: create table habase_stocks(key int, name string, price float) stored by 'org.apache.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,stock:val") tblproperties("hbase.table.name"="stocks");
例如为用户edward赋予在数据库edsstuff中create权限: grant create on database edsstuff to user edward; 16.3 分区级别的授权 默认情况下,是在表级别授予权限的,但是可以在分区级别进行授权,将表属性partition_level_privilege设置为true即可。如下面的例子: create table autorized_part (key int, value string) partitioned by (ds string); //创建一张分区表autorized_part alter table autorized_part set tblproperties("partition_level_privilege"="true");//为该表开启分区级别的授权 alter table autorized_part add partition (ds='3'); //为表新增一个分区,值为3 revoke select on table autorized_part partition(ds='3') from user edward; //给edward赋予分区ds='3'的select 权限
17、锁 hive不支持行级别的更新和删除,也不支持事务,因此细粒度锁对hive是没有必要的。hive提供了表级别和分区级别的锁,这需要配合zookeeper来使用。 在hive-site.xml配置文件中,增加hive.zookeeper.quorum属性来指定zookeeper集群的地址,同时设置hive.support.concurrency为true,开启支持并发。 show locks; //查询当前所有锁 show locks 表名; //查询某张表上的锁 show locks 表名 partition (...); //查询某个分区上的锁 17.1 锁的种类 hive中的锁分为两种:共享锁和独占锁。共享锁和共享锁之间不互斥,通常在读取的时候使用共享锁,独占锁通常在写入的时候使用,它会使其他用户无法访问锁定表或分区。
「深度学习福利」大神带你进阶工程师,立即查看>>> HTTPS is easy https://www.troyhunt.com/https-is-easy/ HTTPS is easy! In fact, it's so easy I decided to create 4 short videos around 5 minutes each to show people how to enable HTTPS on their site and get all traffic redirecting securely, optimise their HTTPS configuration to get it rating higher than most banks, fix any insecure references in a few clicks and finally, secure all the traffic all the way back to their website. I built a little demo site and embedded all the videos in it over at HTTPSIsEasy.com . Let me begin by being clear about the demographic this is pitched at: I wanted to create a resource that had the broadest possible appeal regardless of technical competency. If someone has entry-level web dev skills and knows enough to get a site up and running but isn't a tech pro, I want this to be usable by them. I want to help take a big chunk out of the massive list of smaller sites that are still served over non-secure connections because the owners simply don't know where to start. I also wanted to keep each video to about 5 minutes so you'll see that there's plenty of stuff I don't embellish on, I just focus on making things work as expeditiously as possible. Having said that, everything in this video series is equally applicable to sites like this very blog and indeed that's pretty much how I have things configured today. If you are a tech pro and you want to go deeper on HTTPS, have a browse back through the dozens of posts on the SSL tag or go and watch 3 and a half hours of Pluralsight training on the subject . Next, you'll see that this is all very Cloudflare-centric and you may be wondering "why not use Let's Encrypt instead?" I love Let's Encrypt and I love what they've done for the industry in terms of making certs free and automated. But that's only part of the journey to HTTPS and Let's Encrypt doesn't help people redirect to HTTPS, add HSTS, configure the versions of TLS they support or fix HTTP references in otherwise secure pages. All of this is really important for a robust HTTPS implementation and all of it's possible in Cloudflare with mere button clicks. To be honest, the significance of this really only became clear to me when recording these videos just yesterday; Cloudflare makes it so easy not just to get the site served over HTTPS, but to do all the other things you need to do for HTTPS to work properly . In the final video, I secure the network segment between Cloudflare and the web server by loading one of their origin certificates into Azure. Because I know people will ask, go get yourself OpenSSL then the command I ran is as follows: openssl pkcs12 -export -inkey httpsiseasy.key -in httpsiseasy.pem -name httpsiseasy -out httpsiseasy.pfx Frankly, I can't see the demographic I've targeted this series at going down this path that often, in part because of the technical complexity (and yes, grabbing OpenSSL and running commands will be a bar too high for many) and also in part because many hosting providers still don't provide the ability to upload your own cert (such as Ghost Pro that this blog runs on). And before anyone loses their minds over the entire network not being encrypted or Cloudflare being able to MitM the traffic, have a read of CloudFlare, SSL and unhealthy security absolutism . Finally, because some people will inevitably wonder, this isn't a commercial activity on my behalf; Cloudflare didn't engage me to create this and it'll come as a surprise to them the first time they see it. I created this on a whim after some Twitter discussions earlier this week and I simply wanted to create the most easily accessible resource possible for helping people get their websites served over HTTPS. So share this generously, point people who don't know where to start at HTTPSIsEasy.com and help drive a more "secure by default" web.
三、改动/etc/odbc.ini 文件 參照 /opt/cloudera/impalaodbc/Setup/odbc.ini , 在/etc/odbc.ini 加入例如以下的内容: [impalaodbc] # Description: DSN Description. # This key is not necessary and is only to give a description of the data source. Description=Cloudera ODBC Driver for Impala (64-bit) DSN # Driver: The location where the ODBC driver is installed to. Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so # The DriverUnicodeEncoding setting is only used for SimbaDM # When set to 1, SimbaDM runs in UTF-16 mode. # When set to 2, SimbaDM runs in UTF-8 mode. #DriverUnicodeEncoding=2 # Values for HOST, PORT, KrbFQDN, and KrbServiceName should be set here. # They can also be specified on the connection string. HOST=172.16.230.152 PORT=21050 Database=default # The authentication mechanism. # 0 - no authentication. # 1 - Kerberos authentication # 2 - Username authentication. # 3 - Username/password authentication. # 4 - Username/password authentication with SSL. AuthMech=0 # Kerberos related settings. KrbFQDN= KrbRealm= KrbServiceName= # Username/password authentication with SSL settings. UID= PWD= CAIssuedCertNamesMismatch=1 TrustedCerts=/opt/cloudera/impalaodbc/lib/64/cacerts.pem # Specify the proxy user ID to use. #DelegationUID= # General settings TSaslTransportBufSize=1000 RowsFetchedPerBlock=1000 SocketTimeout=0 StringColumnLength=32767 UseNativeQuery=0 四、验证安装是否成功 运行 isql -v impalaodbc [root@h1 ~]# isql -v impalaodbc +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+
2.2 关闭防火墙和selinux 在 每台机器 上进行关闭防火墙和禁用SELINUX服务操作 service iptables start # 启动防火墙 service iptables status # 查看防火墙的状态 service iptables stop # 关闭防火墙 chkconfig iptables off # 防止服务器重启开启防火墙 sestatus – v # 查看 selinux 的状态 ## 关闭 selinux vim /etc/selinux/config SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
然后在 每台机器 上配置好远程yum源的地址,注意httpd服务是安装在uat2中的。Uat2的IP为172.16.100.218 # 配置 mariadb 的 yum 源 vim /etc/yum.repos.d/mariadb.repo # 添加以下内容 [mariadb]" name = http://172.16.100.218/mariadb10.0.14 baseurl = h enabled=1 gpgcheck=0 # 配置 cm 的 yum 源 vim /etc/yum.repos.d/cm.repo # 添加以下内容 [cm] name = Cloudera Manager baseurl = http://172.16.100.218/cm5150 enabled=1 gpgcheck=0 # 配置 cdh 的 yum 源 vim /etc/yum.repos.d/cdh.repo # 添加以下内容 [cdh] name = CDH baseurl = http://172.16.100.218/cdh5150 enabled=1 gpgcheck=0
配置好远程yum源后,在每台机器输入命令yum repolist 查看是否配置成功,在下图中红框的列表上出现了对应的yum源,说明配置成功。 此处yum源的配置主要作用是为了接下来Mysql的安装、cloudera-manager组件的安装,所以必须确保yum源中有相应的安装包。 # 检查是否有相应的包文件 yum info MariaDB-server yum info cloudera-manager-server yum info cloudera-manager-agent yum info cloudera-manager-daemons
2.8 安装mysql并创建相关的库 在上一小节中,配置好了mysql的远程yum源,那么通过yum install命令即可安装mysql服务。 选择 一台机器 作为mysql的服务端,进行服务端的安装,这里选择Uat2作为server # 安装服务端 仅需要在 uat2 上安装 yum install -y MariaDB-server # 其它服务器安装客户端 yum install -y MariaDB-client # 修改服务端配置文件:不区分大小写 以及 utf8 字符集 vim /etc/my.cnf.d/server.cnf [mysqld] lower_case_table_names=1 character_set_server = utf8 # 启动 mysql 服务 service mysql start 启动mysql服务成功后,要设置root账户的密码。 # 第一次可无密登录 mysql -uroot # 执行以下 sql 语句进行初始密码的设置 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges; 创建cdh相关的库 create database hive DEFAULT CHARSET utf8; create database amon DEFAULT CHARSET utf8; create database hue DEFAULT CHARSET utf8; create database oozie default charset utf8; create database activity_monitor default charset utf8; create database reports_manager default charset utf8;
创建相关的用户并赋予库操作权限和外网访问权限 # 创建相关用户 use mysql; insert into user(Host,User,Password) values("%","hive",password("hive")); insert into user(Host,User,Password) values("%","amon",password("amon")); insert into user(Host,User,Password) values("%","hue",password("hue")); insert into user(Host,User,Password) values("%","oozie",password("oozie")); insert into user(Host,User,Password) values("%","activity_monitor",password("activity_monitor")); insert into user(Host,User,Password) values("%","reports_manager",password("reports_manager")); # 赋予权限 GRANT ALL PRIVILEGES ON *.* TO 'cmf'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'cmf'@'localhost'IDENTIFIED BY '123456' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%'IDENTIFIED BY 'hive' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'hive'@'localhost'IDENTIFIED BY 'hive' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'hue'@'%'IDENTIFIED BY 'hue' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'hue'@'localhost'IDENTIFIED BY 'hue' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'amon'@'%'IDENTIFIED BY 'amon' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'amon'@'localhost'IDENTIFIED BY 'amon' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'oozie'@'%'IDENTIFIED BY 'oozie' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'oozie'@'localhost'IDENTIFIED BY 'oozie' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'activity_monitor'@'%'IDENTIFIED BY 'activity_monitor' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'activity_monitor'@'localhost'IDENTIFIED BY 'activity_monitor' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'reports_manager'@'%'IDENTIFIED BY 'reports_manager' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'reports_manager'@'localhost'IDENTIFIED BY 'reports_manager' WITH GRANT OPTION; # 刷新 flush privileges; # 查看用户权限 show grants for hue;
2.11 安装cloudera-manager组件 选择 一台主机 安装server端,此处选择Uat6作为server端 在 全部主机 中安装agent和daemons # 在 uat6 上安装 server 端 yum install -y cloudera-manager-server # 所有主机上安装 agent 和 daemons yum install -y cloudera-manager-agent cloudera-manager-daemons 在安装了server端的机器上(此处是uat6),修改数据库配置文件 # 在安装了 server 的机器上 vim /etc/cloudera-scm-server/db.properties com.cloudera.cmf.db.type=mysql com.cloudera.cmf.db.host=172.16.100.218 com.cloudera.cmf.db.name=cmf com.cloudera.cmf.db.user=cmf com.cloudera.cmf.db.setupType=EXTERNAL com.cloudera.cmf.db.password=123456 # 设置开机自启 chkconfig --level 2345 cloudera-scm-server on 在安装了agent的机器上(每台机器),修改指向的server端host和ip vim /etc/cloudera-scm-agent/config.ini [General] # Hostname of the CM server. server_host=uat6 # Port that the CM server is listening on. server_port=7182 # 设置开机自启 chkconfig --level 2345 cloudera-scm-agent on
在cm server端配置好mysql的连接驱动,并初始化cmf数据库 ln –s /usr/java/mysql-connector-java-5.1.42-bin.jar /usr/share/java/mysql-connector-java.jar # 初始化 CMF 数据库 /usr/share/cmf/schema/scm_prepare_database.sh mysql -h 172.16.100.218 -uroot -p123456 --scm-host 172.16.100.218 cmf cmf 123456 # 启动服务 service cloudera-scm-server start # 在 server 端执行 service cloudera-scm-agent start # 在每台机器上执行 # 查看日志 less /var/log/cloudera-scm-server/cloudera-scm-server.log
3. Mysql 卸载 # 查看当前安装 mysql 情况 rpm -qa|grep -i mysql # 查看 mysql 服务状态 service mysql status # 关闭 mysql 服务 service mysql stop # 查看 mysql 相关进程 ps -ef |grep mysql # 关闭相关进程 kill pid # 删除包命令: yum remove -y mysql # 或者 rpm -e – nodeps 包名 # 查找 mysql 的相关目录 find / -name mysql # 删除对应的 mysql 目录 rm -rf 目录 # 手工删除 /etc/my.cnf rm -rf /etc/my.cnf # 检查机器是否安装 mysql rpm -qa|grep -i mysql
「深度学习福利」大神带你进阶工程师,立即查看>>> Hive应用:设置字段自增 介绍 语法: ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的每条xlh记录返回一个序号。 以上是row_number() over()的基本用法,下面本人就给他赋予一个新的用法。 字段自增 当你要往一个表中导入数据时,需要一个自增的id字段,那么就需要使用以下两个函数搭配产生:row_number() over() 如果什么参数都不加,直接使用这两个字段,那么直接产生的是从1开始增加的数字。 例如: insert into table User_Attribute select row_number() over() as id,customid from tbl_custom; 如果单独使用函数row_number(),则会报错,错误内容如下: FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: Only COMPLETE mode supported for row_number function 指定自增基数 那么上面的自增完成了,肯定会有指定一个基数进行自增的需求,这个时候怎么办呢? 本人曾经试着在两个方法的括号里填写参数,实在是做不到,那么本人就从另一个角度进行思考,想出了如下格式的方式: (row_number() over())+number number即为你指定的基数,上面的语句就可以写成如下: insert into table User_Attribute select (row_number() over())+1000 as id,customid from tbl_custom; 那么此时插入Hive表中的数据就是从1000开始增加的ID。插入的下一条的id就为1001,依次递增。 上一篇: Hive应用:数据外置内部表 下一篇: Hive应用:设置字段默认值
2) -safemode enter | leave | get | wait:安全模式命令。安全模式是NameNode的一种状态,在这种状态下,NameNode不接受对名字空间的更改(只读);不复制或删除块。NameNode在启动时自动进入安全模式,当配置块的最小百分数满足最小副本数的条件时,会自动离开安全模式。enter是进入,leave是离开。 示例:hdfs dfsadmin -safemode get hdfsdfsadmin -safemode enter
如果之前的操作没有问题,这里将会很快完成 在选择安装的服务组合的时候,选择自己需要的,如果不知道,全部安装就行 这里是最激动人心的时候 随便找台机器测试一下spark: spark-shell 激动的敲了一个: CDH启动与关闭 CM Portal 地址: http://master:7180/cmf/home 关闭步骤: 在CM portal上关闭 cluster 在所有节点关闭CM agent: service cloudera-scm-agent stop 在master节点关闭CM server: service cloudera-scm-server stop 启动步骤: 在所有节点启动CM agent: service cloudera-scm-agent start 在master节点启动CM server: service cloudera-scm-server start 在CM portal上启动 cluster 查看启动日志: /var/log/cloudera-scm-server/cloudera-scm-server.log 如果是3台机器一般会出现错误: 在CM console中将副本设为2: dfs.replication=2 在所有的节点命令行执行: hadoop fs -setrep 2 / 安装要点: 仔细,认真,严格按照步骤 常见问题:网络,防火墙等主机设置 碰到问题:查看日志&官网&百度 cloudera JDBC Driver com.mysql.jdbc.Driver not found. 将oracle的mysql的jar包放置到/usr/share/java/mysql-connector-java.jar路径下即可,注意修改jar包名称; 切记除了要下载parcel文件之外,还有manifest.json文件,否则在选择安装版本界面,cloudera无法识别parcel的版本。 还有需要对于sha1文件进行改名:*.parcel.sha1 -> *.parcel.sha 为什么CDH的安装页面显示无法发现CDH ? 之前一直怀疑是流程步骤有问题,其实流程本身没有问题,问题发生在流程的实施节点上:cdh文件损坏了;本来1.5G的大小,当时只有50M,我不记得原因了,但是太坑了。 我想到了权限问题;但是忽略了文件损坏问题:sha就是干这个用的,当时应该考虑到使用sha来校验一下文件。 如果cloudera发现能够正常发现parcel,在server启动后将会打出一条日志: SearchRepositoryManager-0:com.cloudera.server.web.cmf.search.components.SearchRepositoryManager: Finished constructing repo:2017-09-27T16:19:00.763Z 安装CDH在拷贝parcel的时候发生异常: Exhausted available authentication methods ; 后来发现原来是因为ssh的root用户被我设置为禁止远程登录;而CDH页面向导中我还配置的用root用户登录 之后发现拷贝异常,总是联网去下载agent包,但是agent都已经在各个节点了;后来发现agent的启动是失败的(在开始的步骤中能够被自动发现的都不需要装agent,需要通过手动输入IP来进行发现的需要装agent,怎么装?联网),报错显示: ProtocolError: ;在网上搜索了一下,如下处理: sudo ps -ef | grep supervisord kill -9 PID sudo ./cloudera-scm-agent restart 未完,重启后发现: Error, CM server guid updated, expected d6c22714-0175-4a40-ace6-db92b7417a40, received 613b2c09-88f6-41fe-9424-41601be40310 原来还需要将 cm/lib/cloudera-scm-agent/ 下面的 cm_guid 进行清除;这一点让我想到了cloudera数据迁移的时候需要做的事情,需要将同目录下的uuid进行删除; 在安装的过程中还有一个问题一直困扰我,就是僵尸agent,在agent经历如上的问题后,在自动发现的列表中有一些僵尸agent,会看到同hostname的多台机器,有一个是正常通信,有的则是Unkonwn,无法删掉,因为不勾选,那么正常通信的也不会勾选上。反正后来我改了一下hosts文件,莫名其妙的在勾选列表中消失了,但是遗憾的是正常通信的也没了。安装成功后,在Hosts页面才看到这些僵尸agent,此时再delete可以正常删除。 Skipping start command because all roles are started or decommissioned or on decommissioned host. cloudera的server停止后要稍等一会在启动,因为释放内存需要一段时间;如果停止后立即就启动将会发生一种情况,内存没有释放完,JVM的内存大量释放和JVM的大量使用将会导致JVM频繁的进行回收和释放,导致JVM Pause以及World Stop JAVA_HOME is not set and Java could not be found 具体原因不太清楚,最小化安装了一个centos7,发现没有jdk,不解。 在clouderea中添加了一个host,然后添加了一个spark nodemanager的角色,然后就悲剧了,总是抱JAVA_HOME is not set and Java could not be found的异常;即使手动拷贝了一个jdk1.8到上面,profile也配置了,仍然不好用。不解。 再看日志的时候,发现安装程序(cloudera的安装程序)将会到几个固定的地方查找,选一个,然后将jdk拷贝到该目录下,问题解决 欢迎关注公众号《全栈架构》 全栈有风险,菜鸟需谨慎 参考: https://www.linuxidc.com/Linux/2018-03/151491.htm https://blog.csdn.net/czk740960212/article/details/80484671 https://blog.csdn.net/chenhai201/article/details/78856007 https://www.cnblogs.com/xiashiwendao/p/7260302.html
「深度学习福利」大神带你进阶工程师,立即查看>>> 1.文件准备(elasticsearch的jdk需要1.8以上) 去官网下载最新的elasticsearch-6.3.2和kibana-6.3.2 https://www.elastic.co/downloads 2.下载完成后,上传至linux,解压到指定目录。 tar -zxvf /opt/elasticserach-6.3.2 -C /var/opt/ 3.修改elasticsearch的配置文件 cd elasticsearch-6.3.2/config vim elasticsearh.yml cluster.name: elasticsearch-6 node.name: node-1 network.host: 0.0.0.0 http.port: 9200 4.直接root用户启动会报错,6.0后直接修改配置文件,用root用户启动已经不行了,所以需要创建一个其他用户来启动elasticsearch。 #创建elasticsearch用户组 groupadd elasticsearch useradd es -g elasticsearch-p /var/opt/elasticsearch-6.3.2 #更改elasticsearch文件夹及内部文件的所属用户及组为es:elasticsearch cd /var/opt chown -R es:elasticsearch elasticsearch-6.3.2 #切换到elsearch用户再启动 su es cd elasticsearch-6.3.2/bin ./elasticsearh 5.启动发现报错: 1 . max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 2.max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 修改配置文件: #修改第一个错误 vim /etc/security/limits.conf # 在最后面追加下面内容 es hard nofile 65536 es soft nofile 65536 #es即为启动用户的名称 ---修改第二个错误 #切换到root用户修改配置sysctl.conf vi /etc/sysctl.conf #添加下面配置: vm.max_map_count=655360 #并执行命令: sysctl -p 参考文档: https://blog.csdn.net/jiankunking/article/details/65448030 https://www.cnblogs.com/yidiandhappy/p/7714481.html https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html
3.9 set-timeout设置集群节点间心跳连接的超时时间 Usage: redis-trib set-timeout host:port milliseconds set-timeout用来设置集群节点间心跳连接的超时时间,单位是毫秒,不得小于100毫秒,因为100毫秒对于心跳时间来说太短了。 该命令修改是节点配置参数cluster-node-timeout,默认是15000毫秒。通过该命令,可以给每个节点设置超时时间,设置的方式使用config set命令动态设置,然后执行config rewrite命令将配置持久化保存到硬盘。 以下是示例: ruby redis-trib.rb set-timeout 10.180.157.199:6379 30000 >>> Reconfiguring node timeout in every cluster node... *** New timeout set for 10.180.157.199:6379 *** New timeout set for 10.180.157.205:6379 *** New timeout set for 10.180.157.201:6379 *** New timeout set for 10.180.157.200:6379 *** New timeout set for 10.180.157.208:6379 >>> New node timeout set. 5 OK, 0 ERR.
3.10 call在集群全部节点上执行命令 Usage: redis-trib call host:port command arg arg .. arg call命令可以用来在集群的全部节点执行相同的命令。call命令也是需要通过集群的一个节点地址,连上整个集群,然后在集群的每个节点执行该命令 。 $ruby redis-trib.rb call 10.180.157.199:6379 get key >>> Calling GET key 10.180.157.199:6379: MOVED 12539 10.180.157.201:6379 10.180.157.205:6379: MOVED 12539 10.180.157.201:6379 10.180.157.201:6379: 10.180.157.200:6379: MOVED 12539 10.180.157.201:6379 10.180.157.208:6379: MOVED 12539 10.180.157.201:6379
处理顺序大致如下: SQlParser生成LogicPlan Tree; Analyzer和Optimizer将各种Rule作用于LogicalPlan Tree; 最终优化生成的LogicalPlan生成SparkRDD; 最后将生成的RDD交由Spark执行; 关于Hive on Spark 背景 Hive on Spark是由Cloudera发起,由Intel、MapR等公司共同参与的开源项目,其目的是把Spark作为Hive的一个计算引擎,将Hive的查询作为Spark的任务提交到Spark集群上进行计算。通过该项目,可以提高Hive查询的性能,同时为已经部署了Hive或者Spark的用户提供了更加灵活的选择,从而进一步提高Hive和Spark的普及率。
简介 Hive on Spark是从Hive on MapReduce演进而来,Hive的整体解决方案很不错,但是从查询提交到结果返回需要相当长的时间,查询耗时太长,这个主要原因就是由于Hive原生是基于MapReduce的,那么如果我们不生成MapReduce Job,而是生成Spark Job,就可以充分利用Spark的快速执行能力来缩短HiveQL的响应时间。 Hive on Spark现在是Hive组件(从Hive1.1 release之后)的一部分。
与SparkSQL的区别 SparkSQL和Hive On Spark都是在Spark上实现SQL的解决方案。Spark早先有Shark项目用来实现SQL层,不过后来推翻重做了,就变成了SparkSQL。这是Spark官方Databricks的项目,Spark项目本身主推的SQL实现。Hive On Spark比SparkSQL稍晚。Hive原本是没有很好支持MapReduce之外的引擎的,而Hive On Tez项目让Hive得以支持和Spark近似的Planning结构(非MapReduce的DAG)。所以在此基础上,Cloudera主导启动了Hive On Spark。这个项目得到了IBM,Intel和MapR的支持(但是没有Databricks)。
使用示例 大体与SparkSQL结构类似,只是SQL引擎不同。部分核心代码如下: val hiveContext = new HiveContext(sc) import hiveContext._ hql("CREATE TABLE IF NOT EXIST src(key INT, value STRING)") hql("LOAD DATA LOCAL PATH '/Users/urey/data/input2.txt' INTO TABLE src") hql("FROM src SELECT key, value").collect().foreach(println) 小结 结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序。比如一个SQL: SELECT item_type, sum(price) FROM item GROUP item_type; 上面这个SQL脚本交给Hive或者类似的SQL引擎,它会“告诉”计算引擎做如下两个步骤:读取item表,抽出item_type,price这两个字段;对price计算初始的SUM(其实就是每个单独的price作为自己的SUM)因为GROUP BY说需要根据item_type分组,所以设定shuffle的key为item_type从第一组节点分组后分发给聚合节点,让相同的item_type汇总到同一个聚合节点,然后这些节点把每个组的Partial Sum再加在一起,就得到了最后结果。不管是Hive还是SparkSQL大致上都是做了上面这样的工作。 需要理解的是,Hive和SparkSQL都不负责计算,它们只是告诉Spark,你需要这样算那样算,但是本身并不直接参与计算。 Spark Shark | 即 Hive on Spark a.在实现上是把HQL翻译成Spark上的RDD操作,然后通过Hive的metadata获取数据库里的表信息,Shark获取HDFS上的数据和文件夹放到Spark上运算。 b.它的最大特性就是快以及与Hive完全兼容 c.Shark使用了Hive的API来实现query parsing和logic plan generation,最后的Physical Plan execution阶段用Spark代替Hadoop MR。 d.通过配置Shark参数,Shark可以自动在内存中缓存特定的RDD,实现数据重用,进而加快特定数据集的检索。 e.Shark通过UDF实现特定的数据分析学习算法,使得SQL数据查询和运算分析结合在一起,最大化RDD的重复使用。
Spark SQL a.是基于Catalyst(翻译为催化剂)引擎的交互式大数据SQL技术,使用SchemaRDD来操作SQL,比Shark支持更过的查询表达式。 b.支持Hive|HBase|Oracle 交互式SQL处理框架Spark SQL a.SparkSQL的四个特点: 1.能在Scala代码里写SQL,支持简单的SQL语法检查,能把RDD指定为Table存储起来。对SQL的支持主要依赖Catalyst(催化剂)查询优化框架,在把SQL解析成逻辑执行计划之后,利用Catalyst包里的一些类和接口,执行了一些简单的执行计划优化 最后变成RDD的计算。 2.支持Parquet(arquet是面向分析型业务的列式存储格式)文件的读写,且保留Schem.Parquet是一个列式存储格式的文件系统,使用Parquet进行文件读写可以极大地降低对CPU和磁盘I/O的消耗。 3.支持直接多JSON格式数据的操作。 4.能在Scala代码里访问Hive元数据,能执行hive语句,并且把结果取回作为RDD使用。Shark依赖Hive的metastore,解析器能把hql执行变成Spark的计算,SparkSQL的前身是Shark,而Shark的前身是HIVE. 5.Shark对于Hive的依赖太多,为了摆脱依赖性,SparkSQL无论在数据兼容|性能优化|组件扩展都得到了极大的方便。 b.SparkSQL的性能: 1.Shark的出现,使得SQL-on-hadoop的性能比hive有了10~100倍的提高。摆脱Hive的限制,SSQL的性能也很优秀 在2014年7月1日的Spark Summit上,Databricks宣布终止对Shark的开发,将重点放到Spark SQL上。Databricks表示,Spark SQL将涵盖Shark的所有特性,用户可以从Shark 0.9进行无缝的升级。 本次Databricks推广的Shark相关项目一共有两个,分别是Spark SQL和新的Hive on Spark(HIVE-7292),在介绍这两个项目之前,我们首先关注下被终止的项目Shark。 Shark及项目终止原因 About Shark Shark发布于3年前,那个时候,Hive可以说是SQL on Hadoop的唯一选择,负责将SQL编译成可扩展的MapReduce作业。鉴于Hive的性能以及与Spark的兼容,Shark项目由此而生。 Shark即Hive on Spark,本质上是通过Hive的HQL解析,把HQL翻译成Spark上的RDD操作,然后通过Hive的metadata获取数据库里的表信息,实际HDFS上的数据和文件,会由Shark获取并放到Spark上运算。 Shark的最大特性就是快和与Hive的完全兼容,且可以在shell模式下使用rdd2sql()这样的API,把HQL得到的结果集,继续在scala环境下运算,支持自己编写简单的机器学习或简单分析处理函数,对HQL结果进一步分析计算。 除去Spark本身的迭代计算,Shark速度快的原因还在于其本身的改造,比如: partial DAG execution:对join优化,调节并行粒度,因为Spark本身的宽依赖和窄依赖会影响并行计算和速度 基于列的压缩和存储:把HQL表数据按列存,每列是一个array,存在JVM上,避免了JVM GC低效,而压缩和解压相关的技术是Yahoo!提供的。 终止Shark的原因 在会议上,Databricks表示,Shark更多是对Hive的改造,替换了Hive的物理执行引擎,因此会有一个很快的速度。然而,不容忽视的是,Shark继承了大量的Hive代码,因此给优化和维护带来了大量的麻烦。随着性能优化和先进分析整合的进一步加深,基于MapReduce设计的部分无疑成为了整个项目的瓶颈。 因此,为了更好的发展,给用户提供一个更好的体验,Databricks宣布终止Shark项目,从而将更多的精力放到Spark SQL上。 两个相关/替代项目介绍 About Spark SQL 既然不是基于Hive,Spark SQL究竟有什么样的改变,这里我们不妨看向 张包峰的博客。Spark新发布的Spark SQL组件让Spark对SQL有了别样于Shark基于Hive的支持。参考官方手册,具体分三部分: 其一,能在Scala代码里写SQL,支持简单的SQL语法检查,能把RDD指定为Table存储起来。此外支持部分SQL语法的DSL。 其二,支持Parquet文件的读写,且保留Schema。 其三,能在Scala代码里访问Hive元数据,能执行Hive语句,并且把结果取回作为RDD使用。 第一点对SQL的支持主要依赖了Catalyst这个新的查询优化框架(下面会给出一些Catalyst的简介),在把SQL解析成逻辑执行计划之后,利用Catalyst包里的一些类和接口,执行了一些简单的执行计划优化,最后变成RDD的计算。虽然目前的SQL解析器比较简单,执行计划的优化比较通配,还有些参考价值,所以看了下这块代码。目前这个PR在昨天已经merge进了主干,可以在SQL模块里看到这部分实现,还有catalyst模块看到Catalyst的代码。下面会具体介绍Spark SQL模块的实现。 第二点对Parquet的支持不关注,因为我们的应用场景里不会使用Parquet这样的列存储,适用场景不一样。 第三点对Hive的这种结合方式,没有什么核心的进展。与Shark相比,Shark依赖Hive的Metastore,解析器等能把hql执行变成Spark上的计算,而Hive的现在这种结合方式与代码里引入Hive包执行hql没什么本质区别,只是把hive hql的数据与RDD的打通这种交互做得更友好了。 About HIVE-7292 HIVE-7292更像是Spark SQL成为标准SQL on Spark项目的补充,首先它是一个Hive on Spark Project,旨在服务已有Hive投入的机构,这个项目将Spark作为一个替代执行引擎提供给Hive,从而为这些机构提供一个迁往Spark的途径,提供一个更流畅的Hive体验。 随着Spark SQL的引入和新的Hive on Apache Spark方向的努力( HIVE-7292 ),许多人询问我们在这两个项目中的位置,以及它们与Shark的关系。在今天的 Spark峰会 上,我们宣布,我们停止了Shark的开发,并会专注于Spark SQL,它将提供Shark特性的超集,以便于现有的Shark用户继续使用。Spark SQL提供了从Shark 0.9的无缝升级,以及一些诸如通用Spark程序的集成等新特性。 Shark 三年前Shark项目开始的时候,Hive(on MapReduce)是SQL on Hadoop的唯一选择。Hive把SQL编译成可扩展的MapReduce作业,而且可以支持多种格式(通过它的SerDes)。但是其性能并不理想。为了交互式地执行查询,许多公司部署了昂贵的专用企业数据仓库(EDWs),这需要严格的、冗长的ETL流程。 Hive和EDWs之间的性能对比在工业界引起了关于在通用数据处理引擎上进行查询处理的内在缺陷的巨大争论。许多人认为SQL交互需要一个昂贵的专用系统用于查询处理(如EDWs)。Shark成为了 一种较早的交互式SQL on Hadoop系统 ,而且是唯一一种基于通用运行环境(Spark)构建的。它表明了所有导致Hive慢的缺陷都不是根本性的,像Spark这样的通用引擎就能同时达到两方面的要求:和EDW一样快,和Hive/MapReduce一样可扩展。 为什么你应该关注这个看似比较学术的争论呢?各种组织都在寻找能给它们带来商业优势的方法,它们使用了很多超出SQL提供的上卷和下钻能力的技术。基于通用环境构建一个SQL查询引擎统一了许多不同的、强大的模型,例如batch、streaming、机器学习。这使得数据科学家和工程师能够更快的执行更复杂的方法。Shark的观点很快被接受了,甚至催生了Hive的一些重要改进。 从Shark到Spark SQL Shark基于Hive源码构建,并通过替换Hive的物理执行引擎获得了性能上的提升。虽然这种方法让Shark用户能更快的执行Hive查询,但是Shark从Hive继承了大量复杂的源码,因而导致难以优化和维护。随着我们逐步逼近性能优化的极限和集成复杂的SQL分析,我们被那些按照MapReduce设计的遗产所束缚。 正因为如此,我们停止了Spark作为一个单独项目的开发,并把所有的开发资源转向Spark SQL,Spark的一个新组件。我们借鉴了Shark的经验用到Spark SQL中,并重新设计以更好了利用Spark。这种新途径让我们更快的创新,最终为用户交付更好的体验。 对于 SQL用户 ,Spark SQL提供了最先进的SQL性能并兼容Shark/Hive。像Shark一样,Spark SQL支持所有的Hive数据格式,用户定义函数(UDF),和Hive metastore。Spark1.1.0引入新的特性后, TPC-DS performance 中,Spark SQL性能比Shark高一个数量级。 对于 Spark用户 ,Spark SQL成为了处理(半)结构化数据和诸如JSON、Parquet、Hive或EDWs等有模式的数据源的细腰(narrow-waist)。它确实统一了SQL和复杂分析,允许用户混合SQL和更多编程API以实现高级分析。 对于 开源黑客 ,Spark SQL提供了一种新的简洁的方法去构建查询计划。在这个框架下添加新的优化很简单。我们已经完全被开源社区对于Spark SQL的热情所折服,多亏这个新设计。仅仅三个月,就有40多为贡献者提交了代码。谢谢。 Hive on Spark(HIVE-7292) 虽然Spark SQL逐渐成为SQL on Spark的标准,但是我们知道许多组织已经使用了Hive。这里面也有很多公司想迁移到Spark。Hive社区提出了一个 新举措 ,这样能使Spark作为Hive的一个可选执行引擎。对于上述组织,参照上述引文可以把执行引擎迁移到Spark。我们很高兴能与Hive社区一起为用户提供更平顺的体验。 总之,我们坚信Spark SQL会是基于Spark的SQL和结构化数据处理的未来。我们将努力工作,并在随后几个releases带来更多特性。对于有遗留Hive部署的公司,Hive on Spark会为他们提供支持。 英文原文:发表于2014年7月1日 Shark, Spark SQL, Hive on Spark, and the future of SQL on Apache Spark Impala与Shark,Drill等的比较 开源组织Apache也发起了名为Drill的项目来实现Hadoop上的Dremel,目前该项目正在开发当中,相关的文档和代码还不多,可以说暂时还未对Impala构成足够的威胁。从Quora上的问答来看,Cloudera有7-8名工程师全职在Impala项目上,而相比之下Drill目前的动作稍显迟钝。具体来说,截止到2012年10月底,Drill的代码库里实现了query parser, plan parser,及能对JSON格式的数据进行扫描的plan evaluator;而Impala同期已经有了一个比较完毕的分布式query execution引擎,并对HDFS和HBase上的数据读入,错误检测,INSERT的数据修改,LLVM动态翻译等都提供了支持。当然,Drill作为Apache的项目,从一开始就避免了某个vendor的一家独大,而且对所有Hadoop流行的发行版都会做相应的支持,不像Impala只支持Cloudera自己的发行版CDH。从长远来看,谁会占据上风还真不一定。 除此之外,加州伯克利大学AMPLab也开发了名为Shark的大数据分析系统。从长远目标来看,Shark想成为一个既支持大数据SQL查询,又能支持高级数据分析任务的一体化数据处理系统。从技术实现的角度上来看,Shark基于Scala语言的算子推导实现了良好的容错机制,因此对失败了的长任务和短任务都能从上一个“快照点”进行快速恢复。相比之下,Impala由于缺失足够强大的容错机制,其上运行的任务一旦失败就必须“从头来过”,这样的设计必然会在性能上有所缺失。而且Shark是把内存当作第一类的存储介质来做的系统设计,所以在处理速度上也会有一些优势。实际上,AMPLab最近对Hive,Impala,Shark及Amazon采用的商业MPP数据库Redshift进行了一次对比试验,在Scan Query,Aggregation Query和Join Query三种类型的任务中对它们进行了比较。图2就是AMPLab报告中Aggregation Query的性能对比。在图中我们可以看到,商业版本的Redshift的性能是最好的, Impala和Shark则各有胜负,且两者都比Hive的性能高出了一大截。 参考: Shark对Hive的兼容性总结 前世今生:Hive、Shark、spark SQL impala与hive的比较以及impala的有缺点
「深度学习福利」大神带你进阶工程师,立即查看>>> 1、将txt文本文件放置hdfs目录下 2、登录hive并进入到指定数据库 3、创建表 create external table if not exists fun_user_external ( tid INT, userid STRING, pwd STRING, create_time BIGINT, email STRING ... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '`' STORED AS TEXTFILE 建表语句中主要的是最后一部分:ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘`’ STORED AS TEXTFILE load data inpath '/tmp/fun_user.txt' into table fun_user_external; load data local inpath '/tmp/fun_user.txt' into table fun_user_external; 上面两条数据导入语句,如果有 local 这个关键字,则这个路径应该为本地文件系统路径,数据会被拷贝到目标位置;如果省略掉 local 关键字,那么这个路径应该是分布式文件系统中的路径,这种情况下,数据是从这个路径转移到目标位置的。