如何判断hdfs(apache hadoopp)上的路径是文件还是目录。

1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读482,381 十一月 独立访问用户
您目前处于:
Hadoop中的集群配置和使用技巧
Hadoop中的集群配置和使用技巧
相关厂商内容
相关赞助商
Windows Azure专区上线,全面了解云服务!
正如上面我描述的,对于Hadoop的集群来说,可以分成两大类角色:Master和Slave,前者主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行,后者配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。本来我打算看看一台机器是否可以配置成Master,同时也作为Slave使用,不过发现在NameNode初始化的过程中以及TaskTracker执行过程中机器名配置好像有冲突(NameNode和TaskTracker对于Hosts的配置有些冲突,究竟是把机器名对应IP放在配置前面还是把Localhost对应IP放在前面有点问题,不过可能也是我自己的问题吧,这个大家可以根据实施情况给我反馈)。最后反正决定一台Master,六台Slave,后续复杂的应用开发和测试结果的比对会增加机器配置。
在所有的机器上都建立相同的目录,也可以就建立相同的用户,以该用户的home路径来做hadoop的安装路径。例如我在所有的机器上都建立了/home/wenchu。
下载Hadoop,先解压到Master上。这里我是下载的0.17.1的版本。此时Hadoop的安装路径就是/home/wenchu/hadoop-0.17.1。
解压后进入conf目录,主要需要修改以下文件:hadoop-env.sh,hadoop-site.xml、masters、slaves。
Hadoop的基础配置文件是hadoop-default.xml,看Hadoop的代码可以知道,默认建立一个Job的时候会建立Job的Config,Config首先读入hadoop-default.xml的配置,然后再读入hadoop-site.xml的配置(这个文件初始的时候配置为空),hadoop-site.xml中主要配置你需要覆盖的hadoop-default.xml的系统级配置,以及你需要在你的MapReduce过程中使用的自定义配置(具体的一些使用例如final等参考文档)。
以下是一个简单的hadoop-site.xml的配置:
&?xml version=&1.0&?&&?xml-stylesheet type=&text/xsl& href=&configuration.xsl&?&&!-- Put site-specific property overrides in this file. --&&configuration&&property&&& &name&fs.default.name&/name&//你的namenode的配置,机器名加端口&& &value&hdfs://10.2.224.46:54310/&/value&&/property&&property&&& &name&mapred.job.tracker&/name&//你的JobTracker的配置,机器名加端口&& &value&hdfs://10.2.224.46:54311/&/value&&/property&&property&&& &name&dfs.replication&/name&//数据需要备份的数量,默认是三&& &value&1&/value&&/property&&property&&&& &name&hadoop.tmp.dir&/name&//Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。&&& &value&/home/wenchu/hadoop/tmp/&/value&&/property&&property&&& &name&mapred.child.java.opts&/name&//java虚拟机的一些参数可以参照配置&& &value&-Xmx512m&/value&&/property&&property&& &name&dfs.block.size&/name&//block的大小,单位字节,后面会提到用处,必须是512的倍数,因为采用crc作文件完整性校验,默认配置512是checksum的最小单元。& &value&5120000&/value&& &description&The default block size for new files.&/description&&/property&&/configuration&
hadoop-env.sh文件只需要修改一个参数:
# The java implementation to use.
Required. export JAVA_HOME=/usr/ali/jdk1.5.0_10
配置你的Java路径,记住一定要1.5版本以上,免得莫名其妙出现问题。
Masters中配置Masters的IP或者机器名,如果是机器名那么需要在/etc/hosts中有所设置。Slaves中配置的是Slaves的IP或者机器名,同样如果是机器名需要在/etc/hosts中有所设置。范例如下,我这里配置的都是IP:
Masters: 10.2.224.46
Slaves: 10.2.226.40 10.2.226.39 10.2.226.38 10.2.226.37 10.2.226.41 10.2.224.36
建立Master到每一台Slave的SSH受信证书。由于Master将会通过SSH启动所有Slave的Hadoop,所以需要建立单向或者双向证书保证命令执行时不需要再输入密码。在Master和所有的Slave机器上执行:ssh-keygen -t rsa。执行此命令的时候,看到提示只需要回车。然后就会在/root/.ssh/下面产生id_rsa.pub的证书文件,通过scp将Master机器上的这个文件拷贝到Slave上(记得修改名称),例如:scp root@masterIP:/root/.ssh/id_rsa.pub /root/.ssh/46_rsa.pub,然后执行cat /root/.ssh/46_rsa.pub &&/root/.ssh/authorized_keys,建立authorized_keys文件即可,可以打开这个文件看看,也就是rsa的公钥作为key,user@IP作为value。此时可以试验一下,从master ssh到slave已经不需要密码了。由slave反向建立也是同样。为什么要反向呢?其实如果一直都是Master启动和关闭的话那么没有必要建立反向,只是如果想在Slave也可以关闭Hadoop就需要建立反向。
将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,根据每一个Slave的Java_HOME的不同修改其hadoop-env.sh。
修改Master上/etc/profile: 新增以下内容:(具体的内容根据你的安装路径修改,这步只是为了方便使用)
export HADOOP_HOME=/home/wenchu/hadoop-0.17.1 export PATH=$PATH:$HADOOP_HOME/bin
修改完毕后,执行source /etc/profile来使其生效。
在Master上执行Hadoop namenode &format,这是第一需要做的初始化,可以看作格式化吧,以后除了在上面我提到过删除了Master上的hadoop.tmp.dir目录,否则是不需要再次执行的。
然后执行Master上的start-all.sh,这个命令可以直接执行,因为在6中已经添加到了path路径,这个命令是启动hdfs和mapreduce两部分,当然你也可以分开单独启动hdfs和mapreduce,分别是bin目录下的start-dfs.sh和start-mapred.sh。
检查Master的logs目录,看看Namenode日志以及JobTracker日志是否正常启动。
检查Slave的logs目录看看Datanode日志以及TaskTracker日志是否正常。
如果需要关闭,那么就直接执行stop-all.sh即可。
以上步骤就可以启动Hadoop的分布式环境,然后在Master的机器进入Master的安装目录,执行hadoop jar hadoop-0.17.1-examples.jar wordcount输入路径和输出路径,就可以看到字数统计的效果了。此处的输入路径和输出路径都指的是HDFS中的路径,因此你可以首先通过拷贝本地文件系统中的目录到HDFS中的方式来建立HDFS中的输入路径:
hadoop dfs -copyFromLocal /home/wenchu/test-in test-in。其中/home/wenchu/test-in是本地路径,test-in是将会建立在HDFS中的路径,执行完毕以后可以通过hadoop dfs &ls看到test-in目录已经存在,同时可以通过hadoop dfs &ls test-in查看里面的内容。输出路径要求是在HDFS中不存在的,当执行完那个demo以后,就可以通过hadoop dfs &ls 输出路径看到其中的内容,具体文件的内容可以通过hadoop dfs &cat文件名称来查看。
经验总结和注意事项(这部分是我在使用过程中花了一些时间走的弯路):
Master和Slave上的几个conf配置文件不需要全部同步,如果确定都是通过Master去启动和关闭,那么Slave机器上的配置不需要去维护。但如果希望在任意一台机器都可以启动和关闭Hadoop,那么就需要全部保持一致了。
Master和Slave机器上的/etc/hosts中必须把集群中机器都配置上去,就算在各个配置文件中使用的是IP。这个吃过不少苦头,原来以为如果配成IP就不需要去配置Host,结果发现在执行Reduce的时候总是卡住,在拷贝的时候就无法继续下去,不断重试。另外如果集群中如果有两台机器的机器名如果重复也会出现问题。
如果在新增了节点或者删除节点的时候出现了问题,首先就去删除Slave的hadoop.tmp.dir,然后重新启动试试看,如果还是不行那就干脆把Master的hadoop.tmp.dir删除(意味着dfs上的数据也会丢失),如果删除了Master的hadoop.tmp.dir,那么就需要重新namenode &format。
Map任务个数以及Reduce任务个数配置。前面分布式文件系统设计提到一个文件被放入到分布式文件系统中,会被分割成多个block放置到每一个的DataNode上,默认dfs.block.size应该是64M,也就是说如果你放置到HDFS上的数据小于64,那么将只有一个Block,此时会被放置到某一个DataNode中,这个可以通过使用命令:hadoop dfsadmin &report就可以看到各个节点存储的情况。也可以直接去某一个DataNode查看目录:hadoop.tmp.dir/dfs/data/current就可以看到那些block了。Block的数量将会直接影响到Map的个数。当然可以通过配置来设定Map和Reduce的任务个数。Map的个数通常默认和HDFS需要处理的blocks相同。也可以通过配置Map的数量或者配置minimum split size来设定,实际的个数为:max(min(block_size,data/#maps),min_split_size)。Reduce可以通过这个公式计算:0.95*num_nodes*mapred.tasktracker.tasks.maximum。
总的来说出了问题或者启动的时候最好去看看日志,这样心里有底。
Hadoop中的命令(Command)总结
这部分内容其实可以通过命令的Help以及介绍了解,我主要侧重于介绍一下我用的比较多的几个命令。Hadoop dfs 这个命令后面加参数就是对于HDFS的操作,和Linux操作系统的命令很类似,例如:
Hadoop dfs &ls就是查看/usr/root目录下的内容,默认如果不填路径这就是当前用户路径;
Hadoop dfs &rmr xxx就是删除目录,还有很多命令看看就很容易上手;
Hadoop dfsadmin &report这个命令可以全局的查看DataNode的情况;
Hadoop job后面增加参数是对于当前运行的Job的操作,例如list,kill等;
Hadoop balancer就是前面提到的均衡磁盘负载的命令。
其他就不详细介绍了。
相关阅读:
作者介绍:岑文初,就职于阿里软件公司研发中心平台一部,任架构师。当前主要工作涉及阿里软件开发平台服务框架(ASF)设计与实现,服务集成平台(SIP)设计与实现。没有什么擅长或者精通,工作到现在唯一提升的就是学习能力和速度。个人Blog为:。
参与InfoQ中文站内容建设,请邮件至。也欢迎大家到参与我们的线上讨论。
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
一起学习,你将hadoop用到实际应用中去了吗?
zhang qiaohui
hadoop namenode -format
这个格式化是格式化的所有硬盘么?
shi jackey
Re: hadoop namenode -format
这个格式化是格式化的所有硬盘么?
shi jackey
Re: hadoop namenode -format
这个格式化是格式化的所有硬盘么?
shi jackey
Re: hadoop namenode -format 这个格式化是格式化的所有硬盘么?
cen wenchu
hadoop的使用
遇到和你同样的问题,
遇到和 jackey 1同样的问题,
Re: hadoop namenode -format
这个格式化是格式化的所有硬盘么?
han tixiang
Re: hadoop namenode -format
这个格式化是格式化的所有硬盘么?
Junny Stone
namenode和 datanode
必须 用不同的主机名
li guoqing
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
Donald J. Reifer
赞助商链接
InfoQ每周精要
通过个性化定制的新闻邮件、RSS Feeds和InfoQ业界邮件通知,保持您对感兴趣的社区内容的时刻关注。
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7Hadoop&HDFS&Shell命令
调用文件系统(FS)Shell命令应使用&bin/hadoop&fs&&的形式。&所有的的FS&shell命令使用URI路径作为参数。URI格式是scheme://authority/path。对&HDFS文件系统,scheme是hdfs&,对本地文件系统,scheme是file&。其中scheme和&authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child&可&以表示成hdfs://namenode:namenodeport/parent/child&,或者更简单的/parent/child&(假&设你配置文件中的默认值是namenode:namenodeport&)。大多数FS&Shell命令的行为和对应的Unix&Shell命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到stderr&,其他信息输出到stdout&。
使用方法:hadoop&fs&-cat&URI&[URI&…]
将路径指定文件的内容输出到stdout&。
·&hadoop&fs&-cat&hdfs://host1:port1/file1&hdfs://host2:port2/file2
·&hadoop&fs&-cat&file:///file3&/user/hadoop/file4
成功返回0,失败返回-1。
使用方法:hadoop&fs&-chgrp&[-R]&GROUP&URI&[URI&…]&Change&group&association&of&files.&With&-R&,&make&the&change&recursively&through&the&directory&structure.&The&user&must&be&the&owner&of&files,&or&else&a&super-user.&
改变文件所属的组。使用-R&将使改变在目录结构下递归进行。命令的使用者必须是&文件的所有者或者超级用户。chmod
使用方法:hadoop&fs&-chmod&[-R]&&URI&[URI&…]
改变文件的权限。使用-R&将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。
使用方法:hadoop&fs&-chown&[-R]&[OWNER][:[GROUP]]&URI&[URI&]
改变文件的拥有者。使用-R&将使改变在目录结构下递归进行。命令的使用者必须是&超级用户。
copyFromLocal
使用方法:hadoop&fs&-copyFromLocal&&URI
除了限定源路径是一个本地文件外,和put命令相似。
copyToLocal
使用方法:hadoop&fs&-copyToLocal&[-ignorecrc]&[-crc]&URI&
除了限定目标路径是一个本地文件外,和get命令类似。
使用方法:hadoop&fs&-cp&URI&[URI&…]&
将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。&
·&hadoop&fs&-cp&/user/hadoop/file1&/user/hadoop/file2
·&hadoop&fs&-cp&/user/hadoop/file1&/user/hadoop/file2&/user/hadoop/dir
成功返回0,失败返回-1。
使用方法:hadoop&fs&-du&URI&[URI&…]
显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。
hadoop&fs&-du&/user/hadoop/dir1&/user/hadoop/file1&hdfs://host:port/user/hadoop/dir1&
成功返回0,失败返回-1。
使用方法:hadoop&fs&-dus&
显示文件的大小。
使用方法:hadoop&fs&-expunge
清空回收站。
使用方法:hadoop&fs&-get&[-ignorecrc]&[-crc]&&
复制文件到本地文件系统。可用-ignorecrc&选项复制CRC校验失败的文&件。使用-crc&选项复制文件以及CRC信息。
·&hadoop&fs&-get&/user/hadoop/file&localfile
·&hadoop&fs&-get&hdfs://host:port/user/hadoop/file&localfile
成功返回0,失败返回-1。
使用方法:hadoop&fs&-getmerge&&&[addnl]
接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl&是&可选的,用于指定在每个文件结尾添加一个换行符。
使用方法:hadoop&fs&-ls&
如果是文件,则按照如下格式返回文件信息:
文件名&&&/font&副本数&&文件大小&修改日期&修改时间&权限&用户ID&组ID&
如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:
修改日期&修改时间&权限&用户ID&组ID&
hadoop&fs&-ls&/user/hadoop/file1&/user/hadoop/file2&hdfs://host:port/user/hadoop/dir1&/nonexistentfile&
成功返回0,失败返回-1。
使用方法:hadoop&fs&-lsr&&
ls&命令的递归版本。类似于Unix中的ls&-R&。
使用方法:hadoop&fs&-mkdir&
接受路径指定的uri作为参数,创建这些目录。其行为类似于Unix的mkdir&-p,它会创建路径中的各级父目录。
·&hadoop&fs&-mkdir&/user/hadoop/dir1&/user/hadoop/dir2
·&hadoop&fs&-mkdir&hdfs://host1:port1/user/hadoop/dir&hdfs://host2:port2/user/hadoop/dir
成功返回0,失败返回-1。
movefromLocal
使用方法:dfs&-moveFromLocal&&
输出一个”not&implemented“信息。
使用方法:hadoop&fs&-mv&URI&[URI&…]&
将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。&
·&hadoop&fs&-mv&/user/hadoop/file1&/user/hadoop/file2
·&hadoop&fs&-mv&hdfs://host:port/file1&hdfs://host:port/file2&hdfs://host:port/file3&hdfs://host:port/dir1
成功返回0,失败返回-1。
使用方法:hadoop&fs&-put&&...&
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。
·&hadoop&fs&-put&localfile&/user/hadoop/hadoopfile
·&hadoop&fs&-put&localfile1&localfile2&/user/hadoop/hadoopdir
·&hadoop&fs&-put&localfile&hdfs://host:port/hadoop/hadoopfile
·&hadoop&fs&-put&-&hdfs://host:port/hadoop/hadoopfile&
从标准输入中读取输入。
成功返回0,失败返回-1。
使用方法:hadoop&fs&-rm&URI&[URI&…]
删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。
·&hadoop&fs&-rm&hdfs://host:port/file&/user/hadoop/emptydir
成功返回0,失败返回-1。
使用方法:hadoop&fs&-rmr&URI&[URI&…]
delete的递归版本。
·&hadoop&fs&-rmr&/user/hadoop/dir
·&hadoop&fs&-rmr&hdfs://host:port/user/hadoop/dir
成功返回0,失败返回-1。
使用方法:hadoop&fs&-setrep&[-R]&
改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。
·&hadoop&fs&-setrep&-w&3&-R&/user/hadoop/dir1
成功返回0,失败返回-1。
使用方法:hadoop&fs&-stat&URI&[URI&…]
返回指定路径的统计信息。
·&hadoop&fs&-stat&path
成功返回0,失败返回-1。
使用方法:hadoop&fs&-tail&[-f]&URI
将文件尾部1K字节的内容输出到stdout。支持-f选项,行为和Unix中一致。
·&hadoop&fs&-tail&pathname
成功返回0,失败返回-1。
使用方法:hadoop&fs&-test&-[ezd]&URI
-e&检查文件是否存在。如果存在则返回0。
-z&检查文件是否是0字节。如果是则返回0。&
-d&如果路径是个目录,则返回1,否则返回0。
·&hadoop&fs&-test&-e&filename
使用方法:hadoop&fs&-text&
将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream。
使用方法:hadoop&fs&-touchz&URI&[URI&…]
创建一个0字节的空文件。
·&hadoop&-touchz&pathname
成功返回0,失败返回-1。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。随着业务的不断发展壮大,数据分析对执行速度的关注度越来越高,hive,mapreduce的查询速度已经不能满足业务的需求了,现对oralce直接访问hdfs做一个预研测试,使用的工具是ODCH。
1、准备工作
要读取HADOOP中的数据,就需要节点能够连接HADOOP。HADOOP环境中的namenode和datanode天生就拥有这个能力,因此网上有不少文章,在配置ORACLE读取HADOOP数据时,都是选择在HADOOP节点中安装ORACLE数据库。我个人觉着这样有些不妥,因为数据节点即承担计算和存储,又提供ORACLE服务,相互之间肯定还是会有影响。最好还是ORACLE服务器提供ORACLE服务,HADOOP集群提供HDFS/M-R能力。
HADOOP家族目前已经发展到很庞大,但我觉着HADOOP的体系还是挺简单,若想让一个节点拥有访问HADOOP的能力其实很简单。安装好JAVA JDK,解压缩hadoop,配置好用户,它就能向hdfs中读写数据,或者提交M-R任务。
因此,我们只需要在某个安装了ORACLE的数据库服务器上,配置hadoop软件就行了。
目前在本机windos xp的机器上 设定环境如下:
安装:VMware 9.0.2 build-1031769
Linux版本:radhat rhel-server-5.4
linux1 192.168.2.11
linux2 192.168.2.12
linux3 192.168.2.13
Hadoop集群:
节点: 192.168.2.11, linux2 192.168.2.12, linux3 192.168.2.13
版本:0.20.2
Oracle数据库:
IP:192.168.2.12
版本:11gR2
在本例中,我们使用Oracle11gR2版本数据库,安装步骤略
假设目前ORACLE数据库软件已经安装好,数据库服务已经启动。如何使其能够连接HADOOP呢,往下看。
创建用户,用户名与HADOOP节点中的用户名相同,这里为hdfs:
[root@linux1~]# useradd hdfs
[root@linux1~]# passwd hdfs
从当前任意hadoop节点复制hadoop目录到oracle服务器(jdk可以同样方式处理):
[root@linux1~]# tar cvfz /tmp/hadoop-0.20.2.tar.gz hadoop-0.20.2
[root@linux1~]# scp /tmp/hadoop-0.20.2.tar.gz hdfs@192.168.2.12:/data/software/
以下操作则是在ORACLE节点中执行:
[root@linux2~]# tar xvfz hadoop-0.20.2.tar.gz -C /usr/local/
[root@linux2~]# chown -R hdfs:hdfs /usr/local/hadoop-0.20.2
[root@linux2~]# tar xvfz jdk1.7.tar.gz -C /usr/local/
[root@linux2~]# chown -R hdfs:hdfs /usr/local/jdk1.7.0_09
复制jdbc链接库文件到hadoop lib目录:
[root@linux2~]# cp /data/ora11g/product/11.2.0/db_1/jdbc/lib/ojdbc6.jar /usr/local/hadoop-0.20.2/lib/
编辑hdfs用户环境变量,加入与HADOOP相关的环境变量:
[hdfs@linux2~]$ vi /home/hdfs/.bash_profile
增加下列内容:
export JAVA_HOME=/usr/local/jdk1.7.0_09
export HADOOP_HOME=/usr/local/hadoop-0.20.2
export HADOOP_CONF_DIR=${HADOOP_HOME}/conf
配置完成之后,可以执行hadoop命令,看看是否能够连接HADOOP集群,读取HDFS中的文件:
[hdfs@linux1~]$ hadoop dfs -ls
Found 1 items
drwxrwxrwx &#8211; hdfs supergroup 0
13:11 /user/hdfs/.Trash
这样新节点连接HADOOP配置好了,接下来的重心,就是如何通过ORACLE读取HADOOP中的数据了。
2、HDFS专用SQL连接器
使用ORACLE连接HDFS有个专项的解决方案[O]racle [D]irect [C]onnector for [H]adoop Distributed Files System,简称ODCH。
该软件包可以到Oracle官网下载:/technetwork/bdc/big-data-connectors/downloads/index.html
选择第一项:Oracle SQL Connector for Hadoop Distributed File System Release 2.1.0
我们这里使用2.1版本,下载到安装包后,解压即可:
[root@linux2 ~]# unzip oraosch-2.1.0.zip
[root@linux2 ~]# unzip orahdfs-2.1.0.zip -d /usr/local/
[root@linux2 ~]# chown -R oracle:oinstall /usr/local/orahdfs-2.1.0
在解压缩文件的bin中,hdfs_stream有两个环境变量需要手动指定,编辑该文件:
[root@linux2 ~]# vi /usr/local/orahdfs-2.1.0/bin/hdfs_stream
增加两行环境变量:
OSCH_HOME=/usr/local/orahdfs-2.1.0
HADOOP_HOME=/usr/local/hadoop-0.20.2
再次编辑hdfs用户环境变量:
[root@linux2 ~]$ vi /home/hdfs/.bash_profile
增加下列内容:
export DIRECTHDFS_HOME=/usr/local/orahdfs-2.1.0
export OSCH_HOME=${DIRECTHDFS_HOME}
export ORAHDFS_JAR=${DIRECTHDFS_HOME}/jlib/orahdfs.jar
export HDFS_BIN_PATH=${DIRECTHDFS_HOME}/bin
以oracle用户身份登录,创建两个目录,分别用于保存ODCH的操作日志和位置文件(location files):
[oracle@ora11g ~]$ mkdir /data/ora11g/ODCH/{logs,extdir} -p
[oracle@ora11g ~]$ chmod -R 777 /data/ora11g/ODCH/
而后以sysdba身份登录到ORACLE,创建3个directory对象:
SQL& create or replace directory ODCH_LOG_DIR as &#8216;/data/ora11g/ODCH/logs&#8217;;
grant read, write on directory ODCH_LOG_DIR to SCOTT;
create or replace directory ODCH_DATA_DIR as &#8216;/data/ora11g/ODCH/extdir&#8217;;
grant read, write on directory ODCH_DATA_DIR to SCOTT;
create or replace directory HDFS_BIN_PATH as &#8216;/usr/local/orahdfs-2.1.0/bin&#8217;;
grant read,write,execute on directory HDFS_BIN_PATH to SCOTT;
Directory created.
Grant succeeded.
Directory created.
Grant succeeded.
Directory created.
Grant succeeded.
HDFS_BIN_PATH: hdfs_stream脚本所在目录.
XTAB_DATA_DIR:用来存放“位置文件”(location files)的目录。“位置文件”(location files) 是一个配置文件,里面包含HDFS的文件路径/文件名以及文件编码格式。
ODCH_LOG_DIR, Oracle用来存放外部表的log/bad等文件的目录.
创建外部表,注意location目前是随便写的,随后还要再修改:
SQL& conn scott/tiger
Connected.
SQL& CREATE TABLE odch_ext_table
,OWNER VARCHAR2(128)
,NAME VARCHAR2(128)
,MODIFIED DATE
,Val NUMBER
) ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY &#8220;ODCH_DATA_DIR&#8221;
ACCESS PARAMETERS
records delimited by newline
preprocessor HDFS_BIN_PATH:hdfs_stream
badfile ODCH_LOG_DIR:&#8217;odch_ext_table%a_%p.bad&#8217;
logfile ODCH_LOG_DIR:&#8217;odch_ext_table%a_%p.log&#8217;
fields terminated by &#8216;,&#8217; OPTIONALLY ENCLOSED BY &#8216;&#8221;&#8216;
missing field values are null
ID DECIMAL EXTERNAL,
OWNER CHAR(200),
NAME CHAR(200),
MODIFIED CHAR DATE_FORMAT DATE MASK &#8220;YYYY-MM-DD HH24:MI:SS&#8221;,
Val DECIMAL EXTERNAL
LOCATION (&#8216;odch/tmpdata.csv&#8217;)
) PARALLEL REJECT LIMIT UNLIMITED;
Table created..
切换至hdfs用户,创建hdfs中的目录并上传文件到hdfs:
[hdfs@linux2 ~]$ hadoop dfs -mkdir odch
[hdfs@linux2 ~]$ hadoop dfs -put tmpdata.csv odch/
Tmpdata.csv文件是我们通过all_objects生成的,SQL脚本为:select rownum,owner,object_name,created,data_object_id from all_objects
然后,通过ODCH的jar包,生成位置文件:
[hdfs@linux2 ~]$ hadoop jar
& ${ORAHDFS_JAR} oracle.hadoop.hdfs.exttab.ExternalTable
& -D oracle.hadoop.hdfs.exttab.tableName=odch_ext_table
& -D oracle.hadoop.hdfs.exttab.datasetPaths=odch
& -D oracle.hadoop.hdfs.exttab.datasetRegex=tmpdata.csv
& -D oracle.hadoop.hdfs.exttab.connection.url=&#8221;jdbc:oracle:thin:@//192.168.2.12:1521/orcl&#8221;
& -D oracle.hadoop.hdfs.exttab.connection.user=SCOTT
& -publish
DEPRECATED: The class oracle.hadoop.hdfs.exttab.ExternalTable is deprecated.
It is replaced by oracle.hadoop.exttab.ExternalTable.
Oracle SQL Connector for HDFS Release 2.1.0 &#8211; Production
Copyright (c) , Oracle and/or its affiliates. All rights reserved.
[Enter Database Password:]
The publish command succeeded.
ALTER TABLE &#8220;SCOTT&#8221;.&#8221;ODCH_EXT_TABLE&#8221;
&#8216;osch-13-42;
The following location files were created.
osch-13-6000-1 contains 1 URI, 4685141 bytes
4685141 hdfs://linux:9000/user/hdfs/odch/tmpdata.csv
The following location files were deleted.
odch/tmpdata.csv not deleted. It was not created by OSCH.
其中,-D:指定相关参数
tableName:外部表名字
datasetPaths:源数据存放路径(HDFS)
datasetRegex:数据文件名
connection.url:oracle数据库连接串
connection.user:数据库用户名scott
这个生成的osch-13-6000-1就是所谓的位置文件,真正指明我们的目标数据文件,在HDFS保存的位置,查看下文件内容就明白了:
[root@linux2 ~]# more /data/ora11g/ODCH/extdir/osch-13-6000-1
osch-13-6000-1
Oracle SQL Connector for HDFS Release 2.1.0 &#8211; Production
hdfs://linux1:9000/user/hdfs/odch/tmpdata.csv
根据提示修改odch_ext_table外部表读取的文件:
SQL& ALTER TABLE &#8220;SCOTT&#8221;.&#8221;ODCH_EXT_TABLE&#8221;
2 LOCATION
4 &#8216;osch-13-42;
Table altered.
SQL& set line 150 pages 1000;
SQL& col owner for a10
SQL& col name for a20
SQL& select * from odch_ext_table where rownum&=10;
ID OWNER NAME MODIFIED VAL
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;-
1 SYS ICOL$
2 SYS I_USER1
3 SYS CON$
4 SYS UNDO$
5 SYS C_COBJ#
6 SYS I_OBJ#
7 SYS PROXY_ROLE_DATA$
8 SYS I_IND1
9 SYS I_CDEF2
10 SYS I_PROXY_ROLE_DATA$_1
10 rows selected.
WP Cumulus Flash tag cloud by
requires Flash Player 9 or better.}

我要回帖

更多关于 apache hadoop 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信