目次
5、Javaでhdfsアプリケーションを開発する際に注意が必要な事項
7つ目は、NameNodeでのEditsLogとFSImageの役割です。
8. SecondaryNameNodeは、NameNodeが負担を軽減するのに役立ちます
10、ファイルスナップショット(バックアップ)コマンドを作成します
序文
1年以上経ち、Java Web側での事業開発に忙殺されており、基本的にビッグデータを忘れていましたが、今回はビッグデータチュートリアルのブログ記事を公開して取り上げました。
hadoop、hdfsをダウンロード、インストール、開始します。ここで停止します。1つずつ紹介することはしません。そうでない場合は、履歴ブログを確認してください。
デフォルトでは、3ノードのマスタースレーブHadoopノード、1つのマスター、および2つの軟膏を構築しました
1.httpを使用してhdfsにアクセスします
次の構成をhdfs-site.xmlに追加してから、hdfsを再起動します。
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<description>使得可以使用http的方式访问hdfs</description>
</property>
httpアクセスを使用します。
user / hadoop-twq / cmdファイルシステムのerror.txtファイルをクエリします
http:// master:50070 / webhdfs / v1 / user / hadoop-twq / cmd / error.txt?op = LISTSTATUS
http:// master:50070 / webhdfs / v1 / user / hadoop-twq / cmd / error.txt?op = OPEN
サポートされている操作を参照してください。
http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
2つのhdfsコンポーネントとその機能
3つ目は、hdfsのデータブロック(ブロック)
データブロックのデフォルトサイズ:128M
データブロックのサイズを次のように設定します:256M = 256 * 1024 * 1024
$ {HADOOP_HOME} /ect/hadoop/hdfs-site.xmlに構成を追加します。
<property>
<name>dfs.block.size</name>
<value>268435456</value>
</property>
データブロックのデフォルトのバックアップ数は3です。
データブロックのバックアップ数を設定する
- 指定したファイルのバックアップ数を設定します
hadoop fs -setrep 2 /user/hadoop-twq/cmd/big_file.txt
- グローバルファイルバックアップの数は、hdfs-siteで直接設定されます。
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
データブロックは、各データノードが配置されているマシンのローカルディスクファイルに保存されます
4、JavaAPI操作hdfs
javaapiを使用してデータをファイルに書き込む
package com.dzx.hadoopdemo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
/**
* @author duanzhaoxu
* @ClassName:
* @Description:
* @date 2020年12月17日 17:35:37
*/
public class hdfs {
public static void main(String[] args) throws Exception {
String content = "this is a example";
String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path(dest));
fsDataOutputStream.write(content.getBytes(StandardCharsets.UTF_8));
fsDataOutputStream.close();
}
}
JavaAPIを使用してファイルを読み取る
package com.dzx.hadoopdemo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
/**
* @author duanzhaoxu
* @ClassName:
* @Description:
* @date 2020年12月17日 17:35:37
*/
public class hdfs {
public static void main(String[] args) throws Exception {
String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.get(URI.create(dest), configuration);
FSDataInputStream fsDataInputStream = fileSystem.open(new Path(dest));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream));
String line = null;
while (bufferedReader.readLine() != null) {
System.out.println(line);
}
fsDataInputStream.close();
bufferedReader.close();
}
}
JavaAPIを使用してファイルステータス情報を取得します
package com.dzx.hadoopdemo;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.fs.permission.FsPermission;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
/**
* @author duanzhaoxu
* @ClassName:
* @Description:
* @date 2020年12月17日 17:35:37
*/
public class hdfs {
public static void main(String[] args) throws Exception {
//获取指定文件的文件状态信息
String dest = "hdfs://master:9999/user/hadoop-twq/cmd/java_writer.txt";
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.get(URI.create("hdfs://master:9999/"), configuration);
FileStatus fileStatus = fileSystem.getFileStatus(new Path(dest));
System.out.println(fileStatus.getPath());
System.out.println(fileStatus.getAccessTime());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getSymlink());
//获取指定目录下的所有文件的文件状态信息
FileStatus[] fileStatuses = fileSystem.listStatus(new Path("hdfs://master:9999/user/hadoop-twq/cmd"));
for (FileStatus status : fileStatuses) {
System.out.println(status.getPath());
System.out.println(status.getAccessTime());
System.out.println(status.getBlockSize());
System.out.println(status.getGroup());
System.out.println(status.getLen());
System.out.println(status.getModificationTime());
System.out.println(status.getOwner());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
System.out.println(status.getSymlink());
}
//创建目录
fileSystem.mkdirs(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java"));
//创建目录并指定权限 rwx--x---
fileSystem.mkdirs(new Path("hdfs://master:9999/user/hadoop-twq/cmd/temp"), new FsPermission(FsAction.ALL, FsAction.EXECUTE, FsAction.NONE));
//删除指定文件
fileSystem.delete(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java/1.txt"), false);
//删除指定目录
fileSystem.delete(new Path("hdfs://master:9999/user/hadoop-twq/cmd/java"), true);
}
}
5、Javaでhdfsアプリケーションを開発する際に注意が必要な事項
//需要把core-site.xml文件放到resources目录下,自动读取hdfs的ip端口配置
String dest = "user/hadoop-twq/cmd/java_writer.txt";
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.get(configuration);
FileStatus fileStatus = fileSystem.getFileStatus(new Path(dest));
6、DataNodeハートビートメカニズムの役割
7つ目は、NameNodeでのEditsLogとFSImageの役割です。
8. SecondaryNameNodeは、NameNodeが負担を軽減するのに役立ちます
9. NameNodeを拡張する方法は?
マスターノードマスターのhdfs-site.xmlに次の構成を追加します
マスターノードのclusterIdを表示する
hdfs-site.xmlをマスターノードmasterからslave1とslave2にコピーします
3ノードのクラスターを形成した後、Java APIを使用して指定するnameNodeのip:ポートがわからないため、viewFを構成する必要があります。
最初にcore-site.xmlのfs.defaultFS構成アイテムをコメントアウトしてから、次の構成を追加します
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="mountTable.xml"/>
<property>
<name>fs.default.name</name>
<value>viewfs://my-cluster</value>
</property>
</configuration>
次に、mountTable.xmlファイルを追加します(メタデータ管理配布マッピング。これは、namenodeによって管理されるメタデータを別のnamenodeノードに配布するのと同じです)。
次に、変更した構成ファイルをslave1とslave2に同期し、hdfsクラスターを再起動します。
一般的なリクエストメソッドは、再起動後に任意のノードで使用できます。次に例を示します。
hadoop fs -ls viewfs:// my-cluster /
10、ファイルスナップショット(バックアップ)コマンドを作成します
指定したディレクトリのスナップショットの作成を承認します
hadoop dfsadmin -allowSnapshot / user / hadoop-twq / data
スナップショットを作成する
hadoop fs -createSnapshot / user / hadoop-twq / datadata-20180317-スナップショット
作成したスナップショットファイルを表示する
hadoop fs -ls / user / hadoop-twq / data / .snapshot / data-20180317-スナップショット
その他のスナップショット関連コマンド
11.バランスデータ
hdfsクラスターを拡張する場合、新しく拡張されたノードに割り当てられるデータが少なくなることは避けられません。現時点では、データをバランスの取れた方法で分散するために、hdfsbalancerコマンドを使用できます。
12、セーフモードセーフモード
セーフモードを開いた後、ディレクトリとファイルを作成または削除することはできません。ディレクトリとファイルの表示のみを許可してください
hadoop dfsadmin -safemode get
セーフモードはオフです
hadoop dfsadmin -safemode enter
セーフモードがオンになっている
hadoop dfsadmin -safemode Leave
セーフモードがオンになっている