From 0b86b174b0e58f31814d6397db61be65d93d35e8 Mon Sep 17 00:00:00 2001 From: GuTaoZi Date: Sat, 14 Dec 2024 22:45:58 +0800 Subject: [PATCH] Regular monthly update --- content/CV_Site_Fan.pdf | Bin 55015 -> 56018 bytes content/_index.md | 17 ++-- content/posts/CS205_Galaxy_Engine.md | 134 ++++++++++++++++++++++++++ content/posts/CS205_My_FileSys.md | 92 +++++++++--------- content/posts/CS217_DSAA_final.md | 2 +- content/posts/CS301_Notes.md | 68 ++++++++++++- content/posts/EE411_Notes.md | 8 +- content/posts/Hadoop_Cluster_Setup.md | 2 +- 8 files changed, 270 insertions(+), 53 deletions(-) create mode 100644 content/posts/CS205_Galaxy_Engine.md diff --git a/content/CV_Site_Fan.pdf b/content/CV_Site_Fan.pdf index 3985f22c49224dfa303e6c7cce4da373a48d1171..1ddb6d1db98688312b3014983a4a7a86cd13a222 100644 GIT binary patch delta 34789 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 z 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 z5GPU-based Parallel Subgraph Counting and Listing over Dynamic Graphs
  • Research Intern at HPC Lab, SUSTech; Collaborating with Ant Group
  • Implemented subgraph counting and listing algorithms for dynamic graphs on GPU
  • Leveraging GPMA/LPMA as data structures for dynamic graph storage and updates.
{{< /alert >}} -{{< alert info "" >}} -LiteSys: Achieving Cost-Effective Service Continuity for Datacenter Software
  • Research Intern at Order Lab, University of Michigan
  • Developed a cost-effective framework for datacenter software to preserve availability during incidents without the resource-intensive demands of full replication.
  • Preparing for submission to OSDI' 25.
+{{< alert success "" >}} +LiteSys: Achieving Cost-Effective Service Continuity for Datacenter Software
  • Research Intern at Order Lab, University of Michigan
  • Developed a cost-effective framework for datacenter software to preserve availability during incidents without the resource-intensive demands of full replication.
  • Under submission to OSDI' 25 as the second author.
{{< /alert >}} {{< alert success "" >}} @@ -46,10 +46,10 @@ My primary research focus involves **building reliable and efficient systems**, {{< /alert >}} {{< alert success "" >}} -EvoX: Distributed GPU-based Framework of Scalable Evolutionary Computing
  • Research Intern at EMI Group, SUSTech
  • Implemented multi-object optimization algorithms NSGA3 and LMOCSO for EvoX.
  • EvoX offers a comprehensive suite of 50+ evolutionary algorithms and a wide range of 100+ benchmark problems/environments: github.com/EMI-Group/evox.
+EvoX: Distributed GPU-based Framework of Scalable Evolutionary Computing
  • Research Intern at EMI Group, SUSTech
  • Implemented multi-object optimization algorithms NSGA-III and LMOCSO for EvoX.
  • EvoX offers a comprehensive suite of 50+ evolutionary algorithms and a wide range of 100+ benchmark problems/environments: github.com/EMI-Group/evox.
{{< /alert >}} -## Activities +## Teaching & Activities ### Teaching Assistant of *Advanced Computer Program Design* @@ -61,9 +61,14 @@ My primary research focus involves **building reliable and efficient systems**, - Responsible for lab sessions and quiz / assignment / project design. - Provided a solid understanding of C and C++, along with practical experience in Linux through lectures and programming tasks/projects. +### Teaching Assistant of *Advanced Database Summer Workshop* + +- Responsible for assisting Mr. Stéphane Faroult and translation in lab sessions. +- Covering the latest industrial techniques and hands-on lab experience in advanced database development. + ### President(Monitor) of *2021 Turing Class* -- Responsible organizing activities for Turing class, following up on research and coursework progress, and assisting and communicating with faculty. +- Responsible for organizing activities for Turing class, following up on research and coursework progress, and assisting and communicating with faculty. ## [Contact Me](./contact) diff --git a/content/posts/CS205_Galaxy_Engine.md b/content/posts/CS205_Galaxy_Engine.md new file mode 100644 index 0000000..761d041 --- /dev/null +++ b/content/posts/CS205_Galaxy_Engine.md @@ -0,0 +1,134 @@ +--- +title: CS219 Advanced Computer Program Design - Galaxy Engine +tags: C/C++ +categories: CS +description: Final project for CS219 Advanced Computer Program Design, 2024 Fall. +date: 2024-11-25 +--- + +> Recommended Team Size: 2-3 people +> +> Project Lead: Site Fan ([fans2021@mail.sustech.edu.cn](mailto:fans2021@mail.sustech.edu.cn)) + +## Project Overview + +In astronomical simulations and research, high-performance computing is often used for astrophysical simulations and celestial data processing. Simulating celestial systems involves numerous interactions between astronomical objects and complex physical calculations, with data ranging from a few to millions of bodies. The field of astrophysical simulation has spawned many algorithms, from $O(N^2)$ exact physical simulations to $O(N)$ methods, such as the Fast Multipole Method (FMM)[^1], which are widely applied in astronomical research. + +In this project, you are tasked with developing a high-performance C/C++ library for multi-body simulation calculations to handle astrophysical simulations of varying scales. The library should be intuitive and elegant, showcasing examples of its usage. Through this project, you will gain experience in writing open-source libraries, using CPU/GPU parallel computing, simple GUI design, and understanding basic astronomy and simple simulation algorithms. + +## Project Requirements and Details + +### Galaxy Engine Library (40 points) + +In this section, you are required to complete the core functionalities of the Galaxy Engine by implementing a flexible, high-performance C/C++ library for simulating multi-body interactions in celestial systems. The key requirements are as follows: + +1. **Data Structures and Algorithms (10 points)** + + - Choose appropriate data structures based on different scenarios to store data during celestial simulations. + - Use object-oriented programming to manage celestial data, ensuring class member access control and programming standards. + - Possible implementations include structures like CelestialBody, Trajectory, Galaxy, etc. + - astronomical object data should include, but not be limited to, time, spatial coordinates, velocity, acceleration, mass, radius, and others (additional parameters can be added depending on the desired computational accuracy). + - For basic requirements, the celestial coordinates should be in two dimensions with a top-down view for observation. + +2. **Gravity Calculations and Astronomical Object State Updates (10 points)** + + - Provide at least two simulation algorithm interfaces for different scales or scenarios: + - Small-scale computation: classical Newtonian mechanics, $O(N^2)$ gravitational calculations. + - Large-scale computation: implement high-performance simulation algorithms[^1][^2]for larger datasets. + - Required update interfaces: astronomical objects, trajectories, camera positions for rendering, etc. + +3. **Parallel Computing Support (15 points)** + + - Implement parallel computing to enhance computation speed. If feasible, try using multi-machine, multi-CPU, or multi-GPU scheduling. + - Parallelize interactions between astronomical objects to improve computational efficiency during large-scale simulations or renderings. + - Use tools such as OpenMPI[^3], CUDA[^4], SIMD[^6], etc. + - Perform vertical comparisons of the library's performance under different data volumes, as well as horizontal comparisons of the library's performance with and without parallel computing or CPU/GPU acceleration, comparing it with existing astrophysical simulation frameworks for efficiency. + - There are many open-source celestial simulation libraries on GitHub; compare the bottlenecks in these libraries and the Galaxy Engine and propose possible improvements with estimated performance gains. + +4. **Modular Design, Interfaces, and Usability (5 points)** + + - Design clear APIs that allow easy configuration of celestial parameters, time steps, simulation steps, etc. + + - Modularize the library's components, separating different functionalities to simplify its use and improve the extensibility of data structures/algorithms. + + - Ensure portability and ease of use, allowing the library to + + be used as a static or dynamic library, ideally with plug-and-play capabilities. + + - Consider using tools like CMake, Docker[^7], Kubernetes[^8]. + +### Use Case Demonstration (40 points) + +Using the C/C++ library developed by your team, write one or more example use cases that elegantly showcase how to use the library. + +1. **Basic-Scale Celestial Simulation (20 points)** + - Implement a small system with a few astronomical objects (e.g., the Three-Body System, the Solar System) to demonstrate the interactions between multiple bodies. + - Support input of celestial data from one or more files, log customizable events like collisions or eclipses and allow export of celestial system data to files (5 points). + - Support visualization effects (15 points): + - The input and output data should interface with the computation library. + - Provide the following features in the GUI: + - Movable camera to change the observation view. + - Add/remove/modify/view information of astronomical objects. + - Time controls: forward/backward simulation, adjustment of time steps, jumping to specific points in time, etc. + - There's no strict constraint on GUI design, try OpenGL[^5], Web front-end, or even ASCII rendering[^9]. Creativity is all you need! +2. **Large-Scale Simulation Display (20 points)** + - Implement several large-scale celestial system simulations to demonstrate the efficiency and accuracy of Galaxy Engine under high-performance computing. + - Choose an appropriate large-scale data set based on your algorithm implementation. Larger is only sometimes better; balance precision and efficiency. + - Support input from one or more files, log customizable celestial events and allow the export of celestial system data (5 points). + - Support visualization effects (15 points): + - The input and output data should interface with the computation library. + - Provide the following features in the GUI: + - Movable camera for observation. + - Import/export astronomical object data. + - Time controls: forward/backward simulation, adjust time steps, jump to specific points, etc. + - The GUI format is flexible. + +### Bonus Section (Up to 40 points) + +This section rewards innovative designs and advanced functionalities. Here are some possible bonus points: + +1. High-Performance Computing (10 points each) + - Use multiple machines for distributed task scheduling and result integration or simulate with Docker containers. + - Provide performance stress-testing tools and test sets for the library, focusing on versatility and ideally making it easy to test other computational libraries via clear interfaces. +2. Real Celestial Data Import and Export (10 points) + - Support automatic import and update of real celestial data and simulate celestial systems based on this data. + - Use real data for simulations and showcase how real celestial systems move. +3. Advanced Visualization and Interaction (10 points each) + - Add gravitational field and force visualizations to enhance understanding of the celestial system's structure and gravity distribution. + - Support 3D celestial system rendering, with an additional Z-axis for the camera, allowing users to observe star maps, eclipses, and more. + - Add non-solid textures to astronomical objects and support video export (even short, a few seconds will show dynamic changes). +4. Creative Ideas (Graded by efforts, up to 20 points) + - Provide detailed explanations of these features in your report and clearly demonstrate their use cases. Do not just paste code. + - Support 4D celestial system rendering[^10]. The camera may need more directional controls; your imagination will be key! + - Enhance physical simulations: + - Support body collisions and mergers, where merged bodies inherit mass and momentum, forming new astronomical objects. + - Include more astronomical object types and behaviors, such as black hole formation and comet melting. + - Simulate phenomena that Newtonian mechanics cannot accurately simulate or support non-standard celestial shapes. + - Use ray tracing to enhance rendering quality and effects. For example, simulate solar and lunar eclipses, Venus transits, and more! + - Excellent coding standards, progress management, and teamwork at a commercial level! + +## Project Submission + +### Code Submission + +It is recommended that the project be managed using Git. If the project is open-source, provide the Git link in the report. Also, consider packaging the project as a Docker image and uploading it to Docker Hub. For closed-source projects, submit the entire project as a .zip file. + +Please ensure that a README file in the root directory includes detailed instructions for setting up the environment (library and software dependencies etc.) to ensure the project can be reproduced in the given environment. + +### Report Submission + +This project will be graded based on an online presentation. Prepare slides that clearly and concisely highlights all the scoring points (including performance comparison reports), showcasing any extra highlights. + +Along with the code, submit a PDF report that differs from the README and slides. The report should cover the project's structure, algorithm design, code implementation, performance analysis, testing results, and related work. This report is an auxiliary document and will not directly impact the grade but will serve as a reference for showcasing your development and research skills in future applications or interviews. There are no specific length or format requirements, but ensure it meets your needs. + +[^1]: [Fast multipole method - Wikipedia](https://en.wikipedia.org/wiki/Fast_multipole_method) +[^2]: [**Barnes-Hut Simulation**](http://arborjs.org/docs/barnes-hut) +[^3]: [MPI Tutorial](https://mpitutorial.com/tutorials/) +[^4]: [CUDA C++ Programming guide](https://docs.nvidia.com/cuda/cuda-c-programming-guide/) +[^5]: [OpenGL Tutorial](https://www.opengl-tutorial.org/) +[^6]: [SIMD Basic Tutorial](https://ftp.cvut.cz/kernel/people/geoff/cell/ps3-linux-docs/CellProgrammingTutorial/BasicsOfSIMDProgramming.html) +[^7]: [Docker Tutorial](https://docs.docker.com/get-started/docker-overview/) +[^8]: [k8s Tutorial](https://kubernetes.io/docs/tutorials/) +[^9]: [GitHub/ASCII-galaxy-simulation](https://github.com/celian-rib/ASCII-galaxy-simulation) +[^10]: [GitHub/4D Camera](https://github.com/Jayfeather233/4D_camera) + diff --git a/content/posts/CS205_My_FileSys.md b/content/posts/CS205_My_FileSys.md index f1b678e..3318703 100644 --- a/content/posts/CS205_My_FileSys.md +++ b/content/posts/CS205_My_FileSys.md @@ -1,3 +1,11 @@ +--- +title: CS219 Assignment - It's MyFS!!!!! +tags: C/C++ +categories: CS +description: Assignment 3-1 for CS219 Advanced Computer Program Design, 2024 Fall +date: 2024-11-03 +--- + ## Background You, Togawa Sakiko, an operations engineer at Bushiroad Inc., are busy preparing files and materials for the upcoming *MyGO!!!!!×Ave Mujica* joint live show. At work, your colleagues see you as a hard-working workaholic. What they don’t know is your secret: you’re also Oblivionis, the keyboardist for *Ave Mujica*. @@ -73,7 +81,7 @@ For the next $T$ lines, each line is a command to be executed in sequential orde - `echo` - Repeat the following arguments, used as input source of files in this question. - Number of args: 1 or 3 - - The 1st argument stands for the content to be echoed, quoted by `''`. + - The 1st argument stands for the content to be echoed, quoted by `''` or not quoted. - If applicable, the 2nd argument could be `>` or `>>`, which is the [redirection operator](https://www.gnu.org/software/bash/manual/html_node/Redirections.html). - The 3rd argument states a path in the file system. - If the file given does not exist in that path, but its parent directory exists, create a new file there instead; if its parent directory also does not exist, throw an error. @@ -98,7 +106,7 @@ For the next $T$ lines, each line is a command to be executed in sequential orde - Number of args: 2 - The 1st argument is the path of the source file/directory - The 2nd argument is the path of the destination, when it ends with `/`, meaning moving source under this destination directory. - + - We guarantee that the testcases will not move the working directory or its parent directories. - `rm` - Remove (unlink) the FILE(s). - Number of args: 1 or 2 @@ -106,10 +114,10 @@ For the next $T$ lines, each line is a command to be executed in sequential orde - If 2 arguments received, the 1st one is `-r`, the 2nd one states a path to a directory in the file system. - We guarantee that the testcases will not delete the working directory or its parent directories. - `pwd` - - print the name of the current working directory. + - print the absolute path of the current working directory. - Number of args: 0 -\* Note that "path" mentioned above could be either relative or absolute path, meaning that you need to maintain the path of the current working directory. +\* Note that "path" mentioned above could be either relative or absolute path, meaning that you need to maintain the path of the current working directory. Initially, the current working directory is the root directory `/`. ## Output @@ -132,18 +140,17 @@ In a single testcase, for each input instruction, generate necessary output to s - Output nothing unless any error occurs. - `mv` - Output nothing unless any error occurs. - - `rm` - Output nothing unless any error occurs. - `pwd` - Output the absolute path of current working directory - For all types of errors, just output `error` in a single line: - - wrong number of arguments, like missing or too-many arguments - - invalid arguments, like `find whatever -wrong argument ` - - accessing files/directories that does not exist + - wrong number of arguments, like missing or too-many arguments. + - invalid arguments, like `find whatever -wrong argument `. + - accessing files/directories that does not exist. - wrong path, like `cd` into a **file path** or `echo` into a **directory path** etc. - - name conflict, like making/renaming a - - other possible errors + - name conflict, like making/renaming a file to the name of an existing file. + - other possible errors. ## Sample Input #1 @@ -158,7 +165,7 @@ echo 'Kajikanda kokoro furueru manazashi' > Haruhikage echo 'Sekai de boku wa hitoribocchi datta' >> ./Haruhikage echo 'Chiru koto shika shiranai haru wa' >> ../../Live20250426/songs/Haruhikage echo 'Maitoshi tsumetaku ashirau' >> /BanGDream/MyGO/Live20250426/songs/Haruhikage -find /BanGDream -name 'Haru*' +find /BanGDream -name 'Haru.*' mkdir -p /BanGDream/CRYCHIC/songs cd /BanGDream/CRYCHIC/songs mv /BanGDream/MyGO/Live20250426/songs/Haruhikage ./ @@ -166,8 +173,9 @@ ls -a . cat Haruhikage cd /BanGDream rm -r ./CRYCHIC -find /BanGDream -name 'Haru*' +find /BanGDream -name 'Haru.*' echo 'Haruhikage deleted' +cd CRYCHIC ``` ## Sample Output #1 @@ -182,14 +190,41 @@ Sekai de boku wa hitoribocchi datta Chiru koto shika shiranai haru wa Maitoshi tsumetaku ashirau Haruhikage deleted +error ``` ## Testcases -To be determined. +There are 20 testcases in total, each takes up 5 points. You are encouraged to implement part of the functions and submit your semi-finished code to test if the implemented part works correctly. For testcase 1-18, we guarantee that no errors happen. You don't need to worry about the efficiency too much, simple depth-first-search is all you need for `find`. + +| Testcase No. | Commands used | $\mathtt T \le$ | Description | +| :----------: | :--------------------------------: | :-------------: | :----------------------------------------: | +| 1 | echo, cat | 1e4 | | +| 2 | mkdir, cd, pwd | 1e4 | Absolute paths only | +| 3 | mkdir, cd, pwd | 1e4 | Relative/absolute paths | +| 4 | cat, cd, echo, ls, mkdir, rm | 1e3 | | +| 5 | cat, cd, echo, ls, mkdir, rm | 1e4 | | +| 6 | cat, cd, echo, ls, mkdir, mv | 1e3 | | +| 7 | cat, cd, echo, ls, mkdir, mv | 1e4 | | +| 8 | cat, cd, echo, ls, mkdir, find | 1e3 | | +| 9 | cat, cd, echo, ls, mkdir, find | 1e4 | | +| 10 | cat, cd, echo, ls, mkdir, rm, mv | 1e5 | | +| 11 | cat, cd, echo, ls, mkdir, rm, find | 1e5 | | +| 12 | cat, cd, echo, ls, mkdir, mv, find | 1e4 | | +| 13 | Mixture of all above - 1 | 1e3 | | +| 14 | Mixture of all above - 2 | 1e3 | | +| 15 | Mixture of all above - 3 | 1e4 | | +| 16 | Mixture of all above - 4 | 1e4 | | +| 17 | mkdir, echo, find, rm | 2e4 | Efficiency test of `find` | +| 18 | cd, mkdir, echo, rm | 1e4 | Memory leak test of `rm` | +| 19 | Mixture of all above - 3(with err) | 1e4 | Arguments can be wrong | +| 20 | Mixture of all above - 4(with err) | 1e4 | Paths, names and dependencies can be wrong | + +Note that some of the testcases contain only part of the commands, so don't hesitate to submit and see if your implementation of that part is correct (even if you have not implemented all types of commands)! ## Hints +- Note that there are many details about the path format, for example, the path of a directory **may** ends with `/`, but some times this slash could be omitted. - Descriptions and documents for most of the commands above can be found at [GNU Coreutils](https://www.gnu.org/software/coreutils/manual/html_node/index.html). - For regular expressions of `find` commands, try [regular expression library](https://en.cppreference.com/w/cpp/regex) since C++11. @@ -197,34 +232,5 @@ To be determined. - Be careful when handling with memory allocation. Not properly Allocating, accessing and releasing resources will lead to various runtime errors and memory-limit-exceeded errors. -A C++ template for your reference, implementing it with C will be more challenging for memory management. - -```cpp -class myfs_element { -public: - std::string name; - - myfs_element(const std::string& name); - - virtual ~myfs_element() {} - - virtual void display(int indent = 0) const = 0; -}; - -class mydir : public myfs_element { -public: - std::vector> members; - - mydir(const std::string& name); - - void add_member(std::shared_ptr element); -}; - -class myfile : public myfs_element { -public: - std::string content; - - myfile(const std::string& name, const std::string& content); -}; -``` +Implementing this using C++ with derived classes and smart pointers is easier than using C. However, you are still encouraged to give it a try. I believe that no matter how much you know about UNIX, memory and pointers before, you can be a master of them after solving this problem ;) diff --git a/content/posts/CS217_DSAA_final.md b/content/posts/CS217_DSAA_final.md index d312e7e..5156b8d 100644 --- a/content/posts/CS217_DSAA_final.md +++ b/content/posts/CS217_DSAA_final.md @@ -260,7 +260,7 @@ KMP $O(m+n)$ {{image.png}} -## Tree +## Tree{#Tree} Internal nodes, leaf nodes, root diff --git a/content/posts/CS301_Notes.md b/content/posts/CS301_Notes.md index c26f256..f308c3a 100644 --- a/content/posts/CS301_Notes.md +++ b/content/posts/CS301_Notes.md @@ -14,7 +14,9 @@ date: 2024-09-09 - Lecture 4: ARM Assembly - Lecture 5: Interrupt - Lecture 6: UART -- Lecture 7: +- Lecture 7: Timer Intro +- Lecture 8: Timer Advanced +- Lecture 9: I²C and SPI ## Lecture 2: STM32 MCU & GPIO @@ -219,3 +221,67 @@ Interrupts are managed by Nested Vectored Interrupt Controller (`NVIC`) - Reset has highest priority ## Lecture 6: UART + +{{}}
{{
}} + +## Lecture 7: Timer Intro + +{{}}
{{
}} + +## Lecture 8: Timer Advanced + +{{}}
{{
}} + +## Lecture 9: I²C and SPI + +### **Inter-Integrated Circuit (I²C)** + +Designed for low-cost, medium data rate applications + +- 2-wire communications +- Synchronous, half-duplex +- Start/Stop/Acknowledgment mechanism +- Serial, byte-oriented +- Multi-master, multi-slave +- Two bidirectional open-drain lines, plus ground + - Serial Data Line (SDA) + - Serial Clock Line (SCL) +- Up to 100 kbit/s in the standard mode, up to 400 kbit/s in the fast mode + +**Start/Stop Signals** + +- START (S) + - SDA 1->0 when SCL = 1 +- STOP (P) + - SDA 0->1 when SCL = 1 +- Repeated Start (Sr) +- Bus state + - Busy: [S, P] + - Free: (P, S) + +**Data frame** + +- Data bits are transferred after S +- 1 frame = 8 data bits + 1 ack bit +- MSB first +- address as data: 7 bits address, 1 bit R/W (to slave) + +```python +# Master sends data to slave +|S|Address|0| |Data| |Data| |P| + |Ack| |Ack| |Ack/Nack| +# Slave sends data to Master +|S|Address|1| | |Ack|Data|Ack/Nack|P| + |Ack|Data| |Data| +# Repeated Start +|S|Address|0| |Data| |Data| |Sr|Address|1| |... + |Ack| |Ack| |Ack/Nack| |Ack|... +``` + +### Serial Peripheral Interface (SPI) + +- Synchronous full-duplex communication +- Single master, multiple slaves +- No Start/Stop or slave acknowledgment +- Master sets corresponding SS signal to communicate with slave device +- More than 10 Mbit/s diff --git a/content/posts/EE411_Notes.md b/content/posts/EE411_Notes.md index 26dc2c5..0d4f8f2 100644 --- a/content/posts/EE411_Notes.md +++ b/content/posts/EE411_Notes.md @@ -280,6 +280,12 @@ Proof: $\sum\limits_i D^{\mathscr l_{\max}-\mathscr l_i}\le D ^{\mathscr l_\max} ### Chapter 5-2 -{{< img src="https://s2.loli.net/2023/01/01/8pS9IbAPfWXDOgt.png" style="zoom:25%;" >}} +{{}}
{{
}} + + ### Chapter 5-3 - Huffman Code + +[CS217 DSAA: Huffman Tree construction]( {{}} ) + +[Detailed proof of optimality](http://home.cse.ust.hk/faculty/golin/COMP271Sp03/Notes/MyL17.pdf) diff --git a/content/posts/Hadoop_Cluster_Setup.md b/content/posts/Hadoop_Cluster_Setup.md index 99019fd..7fd779a 100644 --- a/content/posts/Hadoop_Cluster_Setup.md +++ b/content/posts/Hadoop_Cluster_Setup.md @@ -1,5 +1,5 @@ --- -title: Set Up a Hadoop Cluster From Scratch +title: Set up a Hadoop Cluster from Scratch tags: Distributed System categories: CS description: Tutorial for setting up a hadoop cluster with ZKFC and YARN over Docker.