MapReduce编程的不便性MapReduceishardtoprogram【八股文】格式编程,三大部分NoSchema,lackofquerylanaguages,eg.SQL数据分析,针对DBA、SQL语句,如何对数据分析MapReduce编程成本高FaceBook实现并开源Hive如何简化操作?ApacheHive什么是Hive?由Facebook开源用于解决海量结构化日志的数据统计;Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能;构建在Hadoop之上的数据仓库;使用HQL作为查询接口;使用HDFS存储;使用MapReduce计算;本质是:将HQL转化成MapReduce程序灵活性和扩展性比较好:支持UDF,自定义存储格式等;适合离线数据处理;Hive在生态系统的位置Hive架构Hive架构用户接口:ClientCLI(hiveshell)、JDBC/ODBC(java访问hive),WEBUI(浏览器访问hive)元数据:Metastore元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用采用MySQL存储Metastore;Hadoop使用HDFS进行存储,使用MapReduce进行计算;Hive架构驱动器:Driver包含:解析器、编译器、优化器、执行器;解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误(比如select中被判定为聚合的字段在groupby中是否有出现);编译器:将AST编译生成逻辑执行计划;优化器:对逻辑执行计划进行优化;执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/TEZ/Spark;Hive优点与使用场景操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手);避免了去写MapReduce,减少开发人员的学习成本;统一的元数据管理,可与impala/spark等共享元数据;易扩展(HDFS+MapReduce:可以扩展集群规模;支持自定义函数);数据的离线处理;比如:日志分析,海量结构化数据离线分析…Hive的执行延迟比较高,因此hive常用于数据分析的,对实时性要求不高的场合;Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。Hive相关文档官网文档://cwiki.apache.org/confluence/display/Hive/Home下载(idint,namestring)ROWFORMATDELIMITEDFIELDSTERMINATEDBY'\t';#loaddataloaddatalocalinpath'/opt/datas/user2.tsv'overwriteintotableuser2;#querydataselect*fromuser;##user.tsv1Zhangsan2Lisi3wangwuSupportedBackendDatabasesforMetastoreMySQL安装MySQL安装设置用户连接权限#查询用户信息mysqlselectUser,Host,Passwordfromuser;#更新用户信息mysqlupdateusersetHost='%'whereUser='root'andHost='localhost';#删除用户信息mysqldeletefromuserwhereuser='root'andhost='127.0.0.1';#刷新信息mysqlflushprivileges;ConfigurationParameters+MetastoreAdminHiveBasicOperationsHive数据仓库位置配置Hive运行日志信息位置指定hive运行时显示的log日志的级别在cli命令行上显示当前数据库,以及查询表的行头信息在启动hive时设置配置属性信息查看当前所有的配置信息HiveShell常用操作Hive常用命令行操作:-eSQLfromcommandline-fSQLfromfiles-v,--verboseVerbosemode(echoexecutedSQLtotheconsole)-S,--silentSilentmodeininteractiveshellHiveShell常用操作Hive交互式命令行操作:quit/exitsetkey=valuesetset-v!dfsquerystring查看操作历史命令Create/Drop/AlterDatabaseCreate/Drop/AlterDatabaseShowDatabaseDescribeDatabaseCreate/Drop/TruncateTable+DDL#LanguageManualDDL-Create/Drop/TruncateTableCreate/Drop/TruncateTableCreate/Drop/TruncateTableCreateTablecreatetableemp(empnoint,enamestring,jobstring,mgrint,hiredatestring,saldouble,commdouble,deptnoint)rowformatdelimitedfieldsterminatedby'\t';员工表:createtabledept(deptnoint,dnamestring,locstring)rowformatdelimitedfieldsterminatedby'\t';部门表:LoadDataLOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]LOCAL:从本地文件加载数据到hive表;否则从HDFS加载数据到hive表;OVERWRITE:是否覆盖表中已有数据;loaddatalocalinpath'/home/hadoop/data/emp.txt'overwriteintotableemp;loaddatalocalinpath'/home/hadoop/data/dept.txt'overwriteintotabledept;CreateTableAsSelect(CTAS)CreateTableLikeCreate/Drop/TruncateTableCreate/Drop/TruncateTableExternalTables内部表也称之为MANAGED_TABLE;默认存储在/user/hive/warehouse下,也可以通过location指定;删除表时,会删除表数据以及元数据;外部表称之为EXTERNAL_TABLE;在创建表时可以自己指定目录位置(LOCATION);删除表时,只会删除元数据不会删除表数据;ExternalTablesPartitionedTables分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成更下的数据集。在查询时通过WHERE子句中的表达式来选择查询所需要的指定的分区,这样的查询效率会提高很多。createtabledept_partition(deptnoint,dnamestring,locstring)PARTITIONEDBY(event_monthstring)ROWFORMATDELIMITEDFIELDSTERMINATEDBY'\t';PartitionedTablesPartitionedTablesPartitionedTablesPartitionedTablesHiveDataTypes+TypesHiveDataTypesPrimitiveTypes://cwiki.apache.org/confluence/display/Hive/LanguageManual+DMLLoadingfilesintotablesLOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]LoadingfilesintotablesLoadingfilesintotablesLoadingfilesintotablesHiveDataManipulationHiveDataManipulationQueries+SelectQueriesSELECT[ALL|DISTINCT]select_expr,select_expr,...FROMtable_reference[WHEREwhere_condition][GROUPBYcol_list][CLUSTERBYcol_list|[DISTRIBUTEBYcol_list][SORTBYcol_list]][LIMITnumber]QueriesQueriesSort+SortByOrderBy全局排序,一个ReduceSortBy每个reduce内部进行排序,全局不是排序DistributeBy类似MR中partition,进行分区,结合sortby使用ClusterBy当distribute和sort字段相同时,使用方式HiveOperatorsandUser-DefinedFunctions+UDFUser-DefinedFunctionsUDF:用户自定义函数,允许用户扩展HiveQL功能;UDF(User-Defined-Function)一进一出UDAF(User-DefinedAggregationFunc