Hadoop应用引用第三方jar的几种方式

  简单来说,Hadoop引入第三方jar包有以下几种方式: 一、把引用到的所有的第三方jar包打到一个jar包内,形成一个超大包,像上一篇文章中提到的第二种引入jar之后打包的方式; 二、把引用到的所有的第三方jar包放到Hadoop的lib目录下,需要Hadoop集群中的每个节点都要放; 三、把jar包放在集群中固定的一台机器上,使用libjars命令加载第三方jar; 四、把jar包放在HDFS上,动态加载第三方jar包。   接下来对这几种方式的优缺点,说一下我个人的见解:   一、把引用到的所有的第三方jar包打到一个jar包内 优点:在hadoop集群上可以直接运行,运行命令也是比较简单; 缺点:把所以的jar包放在一起,文件过大,考虑到加入升级版本的话,引用的第三方jar文件一般不会发生变化,这种打包方式每次都要把第三方jar文件打包在一起上传。 这种打包方式在上一篇文章中《Hadoop应用引用第三方jar的几种方式(一)》已经进行了演示和说明,个人不太建议这种方式。   二、把引用到的所有的第三方jar包放到Hadoop的lib目录下 优点:在hadoop集群上可以直接运行,运行命令也是比较简单; 缺点:集群中的每个节点下都需要放置第三方jar,缺一不可,不够灵活,当版本升级的时候,需要对每一台机器上的jar包进行维护,不太容易进行维护。 对于这种方式,我没有进行实验,理论上来说是可行的,个人不太建议这种方式。   三、把jar包放在集群中固定的一台机器上,使用libjars命令加载第三方jar 优点:只需要维护hadoop集群中的一台机器上的lib库,易于系统的维护; 缺点:只能在存放jar的机器上去执行hadoop... Read More | Share it now!

HDFS权限管理用户指南

http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9FAPI%E5%8F%98%E6%9B%B4 概述 Hadoop分布式文件系统实现了一个和POSIX系统类似的文件和目录的权限模型。每个文件和目录有一个所有者(owner)和一个组(group)。文件或目录对其所有者、同组的其他用户以及所有其他用户分别有着不同的权限。对文件而言,当读取这个文件时需要有r权限,当写入或者追加到文件时需要有w权限。对目录而言,当列出目录内容时需要具有r权限,当新建或删除子文件或子目录时需要有w权限,当访问目录的子节点时需要有x权限。不同于POSIX模型,HDFS权限模型中的文件没有sticky,setuid或setgid位,因为这里没有可执行文件的概念。为了简单起见,这里也没有目录的sticky,setuid或setgid位。总的来说,文件或目录的权限就是它的模式(mode)。HDFS采用了Unix表示和显示模式的习惯,包括使用八进制数来表示权限。当新建一个文件或目录,它的所有者即客户进程的用户,它的所属组是父目录的组(BSD的规定)。 每个访问HDFS的用户进程的标识分为两个部分,分别是用户名和组名列表。每次用户进程访问一个文件或目录foo,HDFS都要对其进行权限检查, 如果用户即foo的所有者,则检查所有者的访问权限; 如果foo关联的组在组名列表中出现,则检查组用户的访问权限; 否则检查foo其他用户的访问权限。 如果权限检查失败,则客户的操作会失败。 用户身份 在这个版本的Hadoop中,客户端用户身份是通过宿主操作系统给出。对类Unix系统来说, 用户名等于`whoami`; 组列表等于`bash... Read More | Share it now!

Hive中配置Parquet(CDH4.3)

    CDH4.3版本中并没有提供现成的Parquet安装包,所以如果在Hive或Impala中需要使用Parquet格式,需要手动进行安装,当创建Parquet格式的表时,需要定义Parquet相关的InputFormat,OutputFormat,Serde,建表语句如下 hive> create table parquet_test(x int, y string)      > row format serde 'parquet.hive.serde.ParquetHiveSerDe'         > stored as inputformat 'parquet.hive.DeprecatedParquetInputFormat'                         > outputformat 'parquet.hive.DeprecatedParquetOutputFormat';     FAILED: SemanticException : Output Format must implement      HiveOutputFormat, otherwise it should be either IgnoreKeyTextOutputFormat or      SequenceFileOutputFormat       提交语句会报错,原因是parquet.hive.DeprecatedParquetOutputFormat类并没有在Hive的CLASSPATH中配置,此类属于$IMPALA_HOME/lib目录下的parquet-hive-1.2.5.jar,所以在$HIVE_HOME/lib目录下建立个软链就可以了   cd $HIVE_HOME/lib ln -s $IMPALA_HOME/lib/parquet-hive-1.2.5.jar       继续提交建表语句,报错如下 hive> create table parquet_test(x int, y string)     > row format serde 'parquet.hive.serde.ParquetHiveSerDe'     > stored as inputformat 'parquet.hive.DeprecatedParquetInputFormat'                            > outputformat 'parquet.hive.DeprecatedParquetOutputFormat'; Exception in thread "main" java.lang.NoClassDefFoundError: parquet/hadoop/api/WriteSupport   at java.lang.Class.forName0(Native Method)   at java.lang.Class.forName(Class.java:247)   at org.apache.hadoop.hive.ql.plan.CreateTableDesc.validate(CreateTableDesc.java:403)   at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeCreateTable(SemanticAnalyzer.java:8858)   at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:8190)   at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:258)   at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:459)   at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:349)   at org.apache.hadoop.hive.ql.Driver.run(Driver.java:938)   at org.apache.hadoop.hive.ql.Driver.run(Driver.java:902)   at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)   at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)   at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:412)   at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759)   at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:613)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)   at java.lang.reflect.Method.invoke(Method.java:597)   at org.apache.hadoop.util.RunJar.main(RunJar.java:208) Caused by: java.lang.ClassNotFoundException: parquet.hadoop.api.WriteSupport   at java.net.URLClassLoader$1.run(URLClassLoader.java:202)   at java.security.AccessController.doPrivileged(Native Method)   at java.net.URLClassLoader.findClass(URLClassLoader.java:190)   at java.lang.ClassLoader.loadClass(ClassLoader.java:306)   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)   at java.lang.ClassLoader.loadClass(ClassLoader.java:247)   ... 20 more       报错的原因是因为缺少一些Parquet相关的jar文件,直接下载到$HIVE_HOME/lib目录下即可 cd /usr/lib/hive/lib for f in parquet-avro parquet-cascading parquet-column parquet-common parquet-encoding parquet-generator parquet-hadoop parquet-hive parquet-pig parquet-scrooge parquet-test-hadoop2 parquet-thrift > do > curl -O https://oss.sonatype.org/service/local/repositories/releases/content/com/twitter/${f}/1.2.5/${f}-1.2.5.jar > done > curl -O https://oss.sonatype.org/service/local/repositories/releases/content/com/twitter/parquet-format/1.0.0/parquet-format-1.0.0.jar       继续提交建表语句,正常通过。成功建表后,需要将其他表中的数据Load到Parquet格式的表中,在执行HQL过程中,需要使用Parquet相关的jar文件,有两种方法,一种是在运行语句前对每一个jar都执行add... Read More | Share it now!