您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Programming-Hive-v1.0
CH2GettingStartedConfiguringYourHadoopEnvironment让我们深入一下Hadoop的不同模式,讨论更多与Hive相关的配置问题。LocalModeConfiguration所谓本地模式,就是所有引用的文件都来自于你的本地文件系统,而不是分布式文件系统。没有服务运行,在一个单一的JVM实例中运行作业的所有任务。如下图:如果你计划定期运行本地模式,为Derby数据库文件metastore_db设置一个确定的位置就很有必要了,Hive在metastore_db中存储你的表的元数据。如果你不想使用默认位置,你也可以为Hive配置不同的目录来存储表格数据,对于本地模式,默认位置是file:///user/hive/warehouse;后面我们讨论对于其他模式,默认是hdfs://namenode_server/user/hive/warehouse首先,进入$HIVE_HOME/conf目录,或许会好奇的想看看hive-default.xml.template这个大文件,显示了Hive支持的不同的配置属性,以及属性默认值。大多数的属性都可以忽略掉。通过修改hive-site.xml来改变配置默认值,如果它不存在就创建一个吧。这里是一个我们配置了几个属性的范例配置,应用于本地模式:你可以删除你不想改变的所有property.../property标记。就像description标记指示的,hive.metastore.warehouse.dir告诉Hive在你本地文件系统的什么位置保存Hive表的内容(该属性加入Hadoop中配置的fs.default.name的值,默认是file:///)。你可以为该属性设置任意的目录路径,该目录不会用来存储表格的元数据,表格的元数据在单独的metastore.。hive.metastore.local的默认值就是true,所以我们不用像上例中那样指定。该属性控制是否连接远程的元数据服务器,还是作为hive客户端jvm的一部分,打开一个新的元数据服务器。该设置一般都是true,用jdbc直接与关系型数据库交互。当设为false,hive会通过一个元数据库交互,该元数据库我们会在216页讨论。javax.jdo.option.ConnectionURL属性很容易切换,它告诉hive如何连接元数据库。默认它会采用当前工作目录作为数据库名的一部分。而在上例中我们使用databaseName=/home/me/hive/metastore_db绝对路径,该路径指定了metastore_db目录存放的位置。该设置消除了每当我们启动一个新的Hive会话,都会在当前工作目录删除原来metastore_db目录的问题。现在我们可以一直访问我们的元数据,不论我们工作在哪个目录。DistributedandPseudodistributedModeConfiguration分布式模式下,集群中运行着几个服务。JobTracker管理jobs,NameNode是HDFS的管理者。每个工作节点依赖自己的TaskTracker服务,运行自己的任务,然后在分布式文件系统中保存文件块,这有DataNode服务管理。下图是分布式模式的Hadoop集群:在内网中,我们用*.domain.pvt作为我们的DNS命名规则。我们在这里不管Hadoop的设置,只关注于Hive的配置。首先第一个属性是表存储的顶级目录,即hive.metastore.warehouse.dir。该属性的默认值是/user/hive/warehouse。对它指定不同的目录,允许每个用户定义自己的warehouse目录,所以他们不会影响其他系统用户。因此,每个用户应当如下声明自己的warehouse目录:sethive.metastore.warehouse.dir=/user/myname/hive/warehouse;每次在Hive客户端中敲这个或是在每个hive脚本中加这个都很乏味,有时还会忘记。一个最好的方式是将该命令置于$HOME/.hiverc中,该文件在hive启动时被处理。MetastoreUsingJDBCHive仅需要一个Hadoop不具有的扩展组件:metastore。Metastore用于存储诸如表空间,分区等信息。因为大量用户和系统都会并发访问metastore,所以内嵌的数据库并不适用于生产环境。任何遵循jdbc规范的数据库都可以使用。实际中大多采用MySQL。虽然并不需要为metastore准备强大的数据库服务器,但是因为metastore存在单点故障(SinglePointofFailure-SPOF),所以还是强烈建议你冗余和备份数据库。以下是我们的MySQL配置:我们需要把mysql的jdbc驱动放在$HIVE_HOME/lib目录中。有些团队会在该目录中放入所有这样的支撑库。TheHiveCommand$HIVE_HOME/bin/hive是hive服务的入口,包含命令行接口。CommandOptions下列命令会列出简明的hive参数项。注意ServiceList,这里有几个服务可用,包括我们大部分时间用到的CLI。你可以使用--servicename参数项来请求一个服务,下图是一张速记表:--auxpath选项允许你指定一系列以冒号分隔的jar包,包含你的自定义扩展功能。--config目录配置也很有用,它用来覆盖默认的$HIVE_HOME/conf目录。TheCommand-LineInterface命令行是与hive交互的最通用的方式,使用它你可以创建表,检查表空间和查询等等。CLIOptions下面的命令列出了一个速记清单,也可以用更短的hive-h:VariablesandProperties--definekey=value和--hivevarkey=value选项是一样的,都是允许你在命令行中自定义变量。当你使用该特性,hive将该键值对放于hivevar名字空间,区分于三个内建的名字空间:hiveconf,system和env。名字空间描述如下:Hive的变量内部用Java的String存储。你可以在查询中引用这些变量,hive会在向查询处理器发送查询之前将变量引用替换为变量值。在CLI中,set命令可以列出变量,或者修改变量。如下图(有省略):在没有-v标记时,set打印所有在hivevar,hiveconf,system和env中的变量,加入-v参数,它还会打印Hadoop的属性,比如HDFS和MapReduce的控制属性。Set命令也用来为变量设置新值。如:如你所见,hivevar:前缀是可选的,--hivevar和--define相同。--hiveconf选项用于设置hive行为的所有属性。我们用它来设置hive.cli.print.current.db,该属性用来在CLI提示中打印当前工作数据库的名字,默认的数据库名是default。了解system名字空间也很有必要,它提供了对Java系统属性的读写访问,env名字空间,提供对环境变量的只读访问。与hivevar不同,对于系统属性和环境变量你需要使用system:或env:前缀。Hive“OneShot”Commands用户可能希望运行一个或多个(用分号分隔)查询,在完成后hiveCLI直接退出。CLI的-e参数支持该特性。一个用这个特性的例子是将查询结果输出到一个文件中,增加-S去掉查询OK和Timetaken…行,以及其他不必要的输出:注意hive是写到标准输出中,shell会重定向输出到本地文件系统,而不是HDFS中。另外,有一个查看属性名的小技巧,假设你不知道哪个属性指定了warehouse的位置:ExecutingHiveQueriesfromFilesHive可以利用-ffile参数来执行一个文件中的查询。按照惯例,保存hive查询的文件用.q或者.hql作为后缀。如果你在hiveshell中,你可以用source命令:我们偶尔会用src作为表名,用来做一些不相干的工作。这一习惯主要用于对hive代码的测试,比如当我们测试一个内建函数:创建一个src表:Src表应至少有一行,The.hivercFile我们最后讨论的选项是-ifile,用于指定你启动CLI时加载的文件。Hive默认找.hiverc文件,并运行它里面的命令。这便于执行那些频繁执行的命令,比如设置系统属性,或添加一些扩展jar包。比如在.hiverc中:第一行将jar文件添加到Hadoop的分布式缓存中,第二行让hive的提示行显示当前工作的数据库,第三行鼓励hive更倾向于使用本地模式执行,即使Hadoop运行于分布式模式,这会提升查询速度。CommandHistory可以用上下光标键滚动之前的命令,hive在$HOME/.hivehistory文件中保存了最近的10000行。ShellExecution你不需要离开hive也可以运行简单的bash脚本。不要运行交互式命令,管道在这里也不起作用。HadoopdfsCommandsfromInsideHive可以在hive的CLI中运行hadoopdfs:该方式比原生的Hadoop方式更有效,与bash中相同,该方式也是每次启动一个新的JVM,Hive只是在自己的进程中执行相同的代码。你可以查阅所有支持的dfs命令:CommentsinHiveScripts用--作为注释QueryColumnHeaders让我们告诉CLI打印列头,默认是不打印的,可以将该配置放在$HOME/.hivercCH3DataTypesandFileFormatsHive包含了关系型数据库包含的大部分基本类型,还有在关系型数据库中很少见到的三种集合类型,PrimitiveDataTypes这些数据类型都由Java实现,所以它们的行为与对应的Java类型特别相近。注意hive不支持指定最大长度的字符数组,而这在其他SQL方言中则很普遍。关系型数据库提供这一特性来做性能优化:定长的记录更容易建立索引和扫描。在Hive的世界里,它或许不包含数据文件,而且需要灵活的文件格式。另外,hive和hadoop更强调磁盘读写性能的最优化,定长的列值相对而言并不重要。TIMESTAMP可以是integers,表示从Unix起始时间(Midnight,January1,1970)到现在秒数;可以是float,表示从Unix起始时间到现在的纳秒数;还可以是String,用来和JDBC的datestring格式转换,YYYY-MM-DDhh:mm:ss.fffffffffTIMESTAMPS被解释为UTC时间。Hive提供时区转换的内建函数,to_utc_timestamp和from_utc_timestamp。BINARY和关系型数据库中的VARBINARY很相似。并不像BLOB类型,BINARY的列存在记录中,并不是像BLOBs一样单独的。BINARY用来在记录中存放任意字节。如果一个表空间有三列,而数据文件中的每条记录包含5个值,那后面的两个会被hive忽略。对于可转换的类型,hive会含蓄的进行:将integer转为双integer类型,将float转为double,将integer转为double。将string列转为数字可以用cast函数,加入一个string列持有的值是integer:CollectionDataTypesHive支持structs,maps和arrays列。大多数的关系型数据库不支持这种集合类型。比如在传统数据库中,structs或许会放在单独的表中,表之间用外键关联。但这带来的实际问题是数据的重复,浪费磁盘空间和潜在的数据不一致,在修改时,多个副本需要同步。在大数据系统中,牺牲上一点换取更高的吞吐量。当处理tb或pb的数据时,只需在磁盘上进行少量基本的headseeks数据扫描。内嵌集合到记录中,使得少量的seeks检索更快。外键之间的导航需要跨磁盘的seeks,有很大的
本文标题:Programming-Hive-v1.0
链接地址:https://www.777doc.com/doc-5984917 .html