首先启动Hadoop,命令如下:
cd /usr/local/hadoop/sbin
start-dfs.sh
在终端输入如下命令,查看hdfs dfs总共支持哪些操作:
cd /usr/local/hadoop/bin
hdfs dfs
上述命令执行后,会显示如下的结果:

如果显示WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable,说明环境变量JAVA_LIBRARY_PATH并未定义,首先进入配置界面
vim ~/.bashrc
按`i``进入编辑模式,在文件中添加一行:
export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native
添加完成后按esc退出编辑模式,输入:wq保存并退出,然后输入指令使配置立刻生效
source ~/.bashrc
可以看出,hdfs dfs命令的统一格式是类似hdfs dfs -ls这种形式,即在“-”后面跟上具体的操作。
可以查看某个命令的作用,比如,当需要查询put命令的具体用法时,可以采用如下命令:
hdfs dfs -help put
输出的结果如下:

需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:
cd /usr/local/hadoop/bin
hdfs dfs -mkdir -p /user/hadoop
该命令中表示在HDFS中创建一个/user/hadoop目录,–mkdir是创建目录的操作,-p表示如果是多级目录,则父目录和子目录一起创建,这里/user/hadoop就是一个多级目录,因此必须使用参数-p,否则会出错。
/user/hadoop目录就成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:
hdfs dfs –ls .
该命令中,-ls表示列出HDFS某个目录下的所有内容,.表示HDFS中的当前用户目录,也就是/user/hadoop目录,因此,上面的命令和下面的命令是等价的:
hdfs dfs –ls /user/hadoop
如果要列出HDFS上的所有目录,可以使用如下命令:
hdfs dfs –ls
下面,可以使用如下命令创建一个input目录:
hdfs dfs -mkdir input
在创建这个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是/user/hadoop/input。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:
hdfs dfs -mkdir /input
可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的/input目录(不是/user/hadoop/input目录):
hdfs dfs -rm -r /input
上面命令中,-r参数表示如果删除/input目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用-r参数,否则会执行失败。
在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
首先,使用vim编辑器,在本地Linux文件系统的/home/hadoop/目录下创建一个文件myLocalFile.txt
cd /home/hadoop
vim myLocalFile.txt
里面可以随意输入一些单词,比如,输入如下三行:
Hadoop
Spark
XMU DBLAB
然后,可以使用如下命令把本地文件系统的/home/hadoop/myLocalFile.txt上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的/user/hadoop/input/目录下:
cd /usr/local/hadoop/bin
hdfs dfs -put /home/hadoop/myLocalFile.txt input
可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:
hdfs dfs -ls input
该命令执行后会显示类似如下的信息:
Found 1 items
-rw-r--r-- 1 hadoop supergroup 23 2021-10-19 13:04 input/myLocalFile.txt
下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:
hdfs dfs -cat input/myLocalFile.txt
下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的/home/hadoop/download/这个目录下,命令如下:
cd /home/hadoop
mkdir download
cd /usr/local/hadoop/bin
hdfs dfs -get input/myLocalFile.txt /home/hadoop/download
可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt:
cd /home/hadoop/download
ls
cat myLocalFile.txt
最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS的/user/hadoop/input/myLocalFile.txt文件,拷贝到HDFS的另外一个目录/input中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:
cd /usr/local/hadoop/bin
hdfs dfs -cp input/myLocalFile.txt /input
首先在HDFS中上传一些文件以便实验~
cd /home/hadoop
vim test1.txt
(文本中内容为hello world!)
vim test2.txt
(文本中内容为this is test2!)
cd /usr/local/hadoop/bin
hdfs dfs -put /home/hadoop/test1.txt input
hdfs dfs -put /home/hadoop/test2.txt input
①向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件
$ if $(hdfs dfs -test -e input/test1.txt);#判断test1.txt是否存在
then $(hdfs dfs -appendToFile /home/hadoop/test2.txt input/test1.txt);#若存在则将本地test2.txt中的内容追加到HDFS中test1.txt的末尾
else $(hdfs dfs -copyFromLocal -f /home/hadoop/test2.txt input/test1.txt);#若不存在则用本地test2.txt的内容覆盖至HDFS的test.txt中
fi
此时查看HDFS中test1.txt的内容(hdfs dfs -cat input/test1.txt)输出应该如下:
hello world!
this is test2!
②从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名
if $(test -e /home/hadoop/test1.txt);#判断本地是否存在test1.txt
then $(hdfs dfs - copyToLocal input / test1.txt / home / hadoop / test3.txt); #若存在则将HDFS中的test1.txt重命名为test3.txt后下载至本地 / home / hadoop
else $(hdfs dfs - copyToLocal input / test1.txt / home / hadoop / test1 / txt); #否则将test1.txt下载至本地 / home / hadoop
fi
在本地查看下载结果:
cd /home/hadoop
ls
输出如下:

查看test3.txt的内容:
cat test3.txt
输出如下:

③将HDFS中指定文件的内容输出到终端中
cd /usr/local/hadoop/bin
hdfs dfs -cat input/test1.txt
④显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息
hdfs dfs -ls -h input/test1.txt
输出如下:
-rw-r--r-- 1 hadoop supergroup 28 2021-10-22 21:46 input/test1.txt
⑤给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息
hdfs dfs -ls -R -h /user/hadoop
输出如下:
drwxr-xr-x - hadoop supergroup 0 2021-10-22 21:44 /user/hadoop/input
-rw-r--r-- 1 hadoop supergroup 23 2021-10-19 13:04 /user/hadoop/input/myLocalFile.txt
-rw-r--r-- 1 hadoop supergroup 28 2021-10-22 21:46 /user/hadoop/input/test1.txt
-rw-r--r-- 1 hadoop supergroup 15 2021-10-22 21:44 /user/hadoop/input/test2.txt
⑥提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录
if $(hdfs dfs -test -d /user/hadoop/test);#查看是否存在test目录
then $(hdfs dfs - touchz / user / hadoop / test / test1.txt); #若存在,则在test目录下创建一个test1.txt
else $(hdfs dfs - mkdir - p / user / hadoop / test && hdfs dfs - touchz / user / hadoop / test / test1.txt); #若不存在,则先创建该目录,再到该目录下创建test1.txt
fi
查看结果:
hdfs dfs -ls -R -h /user/hadoop
输出如下:
drwxr-xr-x - hadoop supergroup 0 2021-10-22 21:44 /user/hadoop/input
-rw-r--r-- 1 hadoop supergroup 23 2021-10-19 13:04 /user/hadoop/input/myLocalFile.txt
-rw-r--r-- 1 hadoop supergroup 28 2021-10-22 21:46 /user/hadoop/input/test1.txt
-rw-r--r-- 1 hadoop supergroup 15 2021-10-22 21:44 /user/hadoop/input/test2.txt
drwxr-xr-x - hadoop supergroup 0 2021-10-22 22:03 /user/hadoop/test
-rw-r--r-- 1 hadoop supergroup 0 2021-10-22 22:03 /user/hadoop/test/test1.txt
⑦提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录
if $(hdfs dfs -test -e /user/hadoop/test2);#查看是否存在test2目录
then $(); #若存在则什么都不做
else $(hdfs dfs - mkdir - p / user / hadoop / test2); #否则创建该目录
fi
查看结果:
hdfs dfs -ls -R -h /user/hadoop
输出如下:
drwxr-xr-x - hadoop supergroup 0 2021-10-22 21:44 /user/hadoop/input
-rw-r--r-- 1 hadoop supergroup 23 2021-10-19 13:04 /user/hadoop/input/myLocalFile.txt
-rw-r--r-- 1 hadoop supergroup 28 2021-10-22 21:46 /user/hadoop/input/test1.txt
-rw-r--r-- 1 hadoop supergroup 15 2021-10-22 21:44 /user/hadoop/input/test2.txt
drwxr-xr-x - hadoop supergroup 0 2021-10-22 22:03 /user/hadoop/test
-rw-r--r-- 1 hadoop supergroup 0 2021-10-22 22:03 /user/hadoop/test/test1.txt
drwxr-xr-x - hadoop supergroup 0 2021-10-22 22:06 /user/hadoop/test2
if $(hdfs dfs -test -e /user/hadoop/test2);#检查是否存在test2目录
then $(hdfs dfs -rm -r /user/hadoop/test2);#若存在则删除该目录
fi
查看结果:
hdfs dfs -ls -R -h /user/hadoop
输出如下:
hdfs dfs -ls -R -h /user/hadoop
drwxr-xr-x - hadoop supergroup 0 2021-10-22 21:44 /user/hadoop/input
-rw-r--r-- 1 hadoop supergroup 23 2021-10-19 13:04 /user/hadoop/input/myLocalFile.txt
-rw-r--r-- 1 hadoop supergroup 28 2021-10-22 21:46 /user/hadoop/input/test1.txt
-rw-r--r-- 1 hadoop supergroup 15 2021-10-22 21:44 /user/hadoop/input/test2.txt
drwxr-xr-x - hadoop supergroup 0 2021-10-22 22:03 /user/hadoop/test
-rw-r--r-- 1 hadoop supergroup 0 2021-10-22 22:03 /user/hadoop/test/test1.txt
⑧向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾
查看test1.txt的内容:
hdfs dfs -cat input/test1.txt
输出如下:
hello world!
this is test2!
查看本地的test3.txt的内容:
cat /home/hadoop/test3.txt
输出如下:
hello world!
this is test2!
将test3.txt的内容追加到HDFS中test1.txt的末尾:
hdfs dfs -appendToFile /home/hadoop/test3.txt input/test1.txt
查看结果:
hdfs dfs -cat input/test1.txt
输出如下:
hello world!
this is test2!
hello world!
this is test2!
⑨删除HDFS中指定的文件、目录
hdfs dfs -mkdir input/test2
hdfs dfs -touchz input/test2/test.txt
hdfs dfs -rm input/test2/test.txt
hdfs dfs -rm -r input/test2
首先在Ubuntu系统中安装Eclipse(安装教程传送门:Ubuntu20.04 LTS 安装Eclipse2021-03)
①下载Hadoop相关的jar包(下载地址)
首先在/opt下创建目录/jar以保存下载的jar包
cd /opt
sudo mkdir jar
接着开始下载jar包
sudo wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-common/2.10.1/hadoop-common-2.10.1.jar
sudo wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-client/2.10.1/hadoop-client-2.10.1.jar
sudo wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-hdfs/2.10.1/hadoop-hdfs-2.10.1.jar
sudo wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-mapreduce-client-core/2.10.1/hadoop-mapreduce-client-core-2.10.1.jar
②在Eclipse中导入jar包




③编写应用实例程序
import java.io.*;
import java.net.*;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
class MyPathFilter implements PathFilter
{
String reg = null;
MyPathFilter(String reg)
{
this.reg = reg;
}
public boolean accept(Path path)
{
if (!(path.toString().matches(reg)))
return true;
return false;
}
}
public class Merge
{
Path inputPath = null;
Path outputPath = null;
public Merge(String input, String output)
{
this.inputPath = new Path(input);
this.outputPath = new Path(output);
}
public void doMerge() throws IOException
{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);
FileStatus[] sourceStatus = fsSource.listStatus(inputPath, new MyPathFilter(".*\\.abc"));
FSDataOutputStream fsdos = fsDst.create(outputPath);
for (FileStatus sta : sourceStatus)
{
System.out.print("Path: " + sta.getPath() + ", File Size: " + sta.getLen()
+ ", Authorized: " + sta.getPermission() + ", Content: ");
FSDataInputStream fsdis = fsSource.open(sta.getPath());
byte[] data = new byte[1024];
int read = -1;
PrintStream ps = new PrintStream(System.out);
while ((read = fsdis.read(data)) > 0)
{
ps.write(data, 0, read);
fsdos.write(data, 0, read);
}
fsdis.close();
ps.close();
}
fsdos.close();
}
public static void main(String[] args) throws IOException
{
String input = "hdfs://localhost:9000/user/hadoop/input/";
String output = "hdfs://localhost:9000/user/hadoop/input/merge.txt";
Merge merge = new Merge(input, output);
merge.doMerge();
}
}
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它
电脑上可以截取图片吗?如果可以,该如何操作呢?相信很多小伙伴都只知道一两种截图的方式,知道的并不全面。其实,电脑上有多种方式截图的,而且非常方便。电脑怎么截图?今天我们就来教大家如何使用电脑截取图片的8种常用方式!操作环境:演示机型:Delloptiplex7050系统版本:Windows10方法一:系统自带截图具体操作:同时按下电脑的自带截图键【Windows+shift+S】,可以选择其中一种方式来截取图片:截屏有矩形截屏、任意形状截屏、窗口截屏和全屏截图。 方法二:QQ截图具体操作:在电脑登录QQ,然后同时按下【Ctrl+Alt+A】,可以任意截图你需要的界面,可以把截图的页面直接下载,